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

PyTorch双输入神经网络张量拼接时触发尺寸不匹配错误如何解决

问题修复方案

核心错误原因

你传给网络的第二个输入是全量33164条训练样本的数值特征,但第一个输入是单批次的20条文本数据,两者第一维(样本数维度)不匹配,拼接时触发维度错误。

修复步骤

1. 修正数据加载逻辑

要保证每次喂给网络的两个输入是同批次的对应样本,不能直接把全量数值特征传入网络。可以通过自定义Dataset打包文本、数值特征、标签三类数据,DataLoader迭代时自动返回同批次的对应样本:

from torch.utils.data import Dataset, DataLoader

# 自定义数据集
class TextWithNumDataset(Dataset):
    def __init__(self, text_seqs, num_features, labels):
        self.text_seqs = text_seqs  # 全量文本序列,形状(33164, 150)
        self.num_features = num_features  # 全量数值特征,形状(33164, 40)
        self.labels = labels  # 全量标签,形状(33164, )
    
    def __len__(self):
        return len(self.labels)
    
    def __getitem__(self, idx):
        # 返回单条样本的三个对应元素
        return self.text_seqs[idx], self.num_features[idx], self.labels[idx]

# 构造DataLoader,每批次返回20条对应样本
train_loader = DataLoader(
    TextWithNumDataset(X1_train, X2_train, y_train),
    batch_size=20,
    shuffle=True
)

训练迭代时,每个step取到的数值特征批次形状为(20, 40),和文本批次第一维完全匹配。

2. 优化网络forward代码

去掉forward方法中多余的张量转换逻辑,避免重复构造张量引发的额外问题:

# 原代码
# f = torch.tensor(x[1], dtype=torch.float).cuda()
# 修改后
f = x[1].float().cuda()
# 如果数据加载阶段已经把张量搬到GPU,可以去掉.cuda()

额外笔误修正

你当前定义的类名为Net,但__init__方法中super函数的父类参数写的是Alex_NeuralNet_Meta,属于笔误,需要修正否则会触发初始化错误:

# 原代码
# super(Alex_NeuralNet_Meta, self).__init__()
# 修改后
super(Net, self).__init__()

修正后拼接的四个张量维度为:

  • hh_gru: (20, 80)
  • avg_pool: (20, 80)
  • max_pool: (20, 80)
  • f: (20, 40)
    拼接后维度为(20, 280),和你定义的Linear层输入维度hidden_size*6 + 40(hidden_size=40时刚好为280)完全匹配,可正常运行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.11 17:39:00