You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用深度学习输入两向量输出预测矩阵?神经网络数据输入遇阻求助

实现双向量输入、矩阵输出的神经网络

一、数据输入处理

首先解决数据加载的问题,你需要将两个向量作为独立输入,配合对应的矩阵标签构建数据集。以PyTorch为例,自定义Dataset来封装数据:

import torch
from torch.utils.data import Dataset, DataLoader

class MatrixPredDataset(Dataset):
    def __init__(self, vec1_data, vec2_data, mat_labels):
        # vec1_data: (样本数N, 2048)
        # vec2_data: (N, 91)
        # mat_labels: (N, 2048, 91)
        self.vec1 = vec1_data
        self.vec2 = vec2_data
        self.labels = mat_labels

    def __len__(self):
        return len(self.vec1)

    def __getitem__(self, idx):
        # 转为(1,2048)和(1,91)的张量,匹配输入形状要求
        return (torch.tensor(self.vec1[idx], dtype=torch.float32).unsqueeze(0),
                torch.tensor(self.vec2[idx], dtype=torch.float32).unsqueeze(0),
                torch.tensor(self.labels[idx], dtype=torch.float32))

# 示例数据构建
N = 100
vec1_samples = torch.randn(N, 2048)
vec2_samples = torch.randn(N, 91)
mat_labels = torch.randn(N, 2048, 91)

dataset = MatrixPredDataset(vec1_samples, vec2_samples, mat_labels)
dataloader = DataLoader(dataset, batch_size=8, shuffle=True)

Dataloader会自动将批量数据打包为(batch_size,1,2048)、(batch_size,1,91)的输入张量,以及(batch_size,2048,91)的标签张量。

二、网络结构设计与实现

核心是让两个向量进行特征交互,最终映射为目标矩阵,这里提供两种实用方案:

方案1:特征编码+外积交互(推荐,更贴合向量逻辑)

先对两个向量分别做特征变换,再通过批量外积实现维度扩张,最后用轻量层微调输出:

import torch.nn as nn

class MatrixPredictor(nn.Module):
    def __init__(self):
        super().__init__()
        # 对1×2048向量做特征变换,保持维度不变
        self.vec1_encoder = nn.Sequential(
            nn.Linear(2048, 2048),
            nn.ReLU(),
            nn.Linear(2048, 2048)
        )
        # 对1×91向量做特征变换,保持维度不变
        self.vec2_encoder = nn.Sequential(
            nn.Linear(91, 91),
            nn.ReLU(),
            nn.Linear(91, 91)
        )
        # 1×1卷积微调交互后的特征(可选,按需调整)
        self.adjust_layer = nn.Conv2d(1, 1, kernel_size=1, bias=True)

    def forward(self, vec1, vec2):
        # 压缩中间维度,得到(batch_size,2048)和(batch_size,91)
        vec1 = vec1.squeeze(1)
        vec2 = vec2.squeeze(1)
        # 特征编码
        vec1_encoded = self.vec1_encoder(vec1)
        vec2_encoded = self.vec2_encoder(vec2)
        # 批量外积:得到(batch_size,2048,91)的初始矩阵
        interaction = torch.bmm(vec1_encoded.unsqueeze(2), vec2_encoded.unsqueeze(1))
        # 增加通道维度适配卷积,微调后压缩回目标形状
        interaction = interaction.unsqueeze(1)
        output = self.adjust_layer(interaction).squeeze(1)
        return output

方案2:拼接向量+全连接映射(简单直接)

将两个向量拼接后,用全连接层直接输出展开后的矩阵元素,再reshape为目标形状:

class MatrixPredictorSimple(nn.Module):
    def __init__(self):
        super().__init__()
        # 拼接后向量长度=2048+91=2139,目标矩阵元素数=2048×91=186368
        self.fc_stack = nn.Sequential(
            nn.Linear(2139, 4096),
            nn.ReLU(),
            nn.Linear(4096, 186368)
        )

    def forward(self, vec1, vec2):
        vec1 = vec1.squeeze(1)
        vec2 = vec2.squeeze(1)
        # 拼接两个向量
        concat_vec = torch.cat([vec1, vec2], dim=1)
        # 输出展开的矩阵并reshape
        flat_output = self.fc_stack(concat_vec)
        output = flat_output.view(-1, 2048, 91)
        return output

注意:方案2的全连接层参数规模极大,仅适合数据量充足或任务简单的场景,否则容易过拟合。

三、基本训练流程

以回归任务为例,使用MSE损失函数的训练代码:

# 初始化组件
model = MatrixPredictor()
optimizer = torch.optim.Adam(model.parameters(), lr=1e-4)
loss_fn = nn.MSELoss()

# 训练循环
for epoch in range(50):
    model.train()
    total_loss = 0.0
    for vec1_batch, vec2_batch, label_batch in dataloader:
        optimizer.zero_grad()
        pred_batch = model(vec1_batch, vec2_batch)
        loss = loss_fn(pred_batch, label_batch)
        loss.backward()
        optimizer.step()
        total_loss += loss.item() * vec1_batch.size(0)
    avg_loss = total_loss / len(dataset)
    print(f"Epoch {epoch+1}, Avg Loss: {avg_loss:.4f}")

内容的提问来源于stack exchange,提问作者Simone Liu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 09:57:12