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
相关产品推荐
相关产品推荐

