PyTorch搭建神经网络矩阵乘法维度不匹配RuntimeError报错排查
PyTorch全连接网络矩阵维度不匹配报错修复
错误原因
报错核心是模型定义阶段的全连接层命名错误:
- 在模型
__init__构造方法中,从第2个全连接层开始,连续8层全部重复赋值给self.f_connected2属性,Python类属性会被最后一次赋值覆盖,最终self.f_connected2仅保留了最后定义的nn.Linear(300,300)层,原本计划定义的第2到第8个隐藏层全部被覆盖丢失。 forward前向传播方法中调用的self.f_connected3到self.f_connected9均为未定义的属性,实际运行时,输入经过第一层全连接后输出形状为(691,8)(691为批量样本数,8为第一层输出特征数),直接传入输入维度要求为300的f_connected2层,矩阵乘法要求前一个矩阵的列数与后一个矩阵的行数相等,8与300不匹配,直接触发运行时错误。
修复步骤
- 修正构造方法中的全连接层命名,保证每个层的属性名唯一,与forward方法中的调用一一对应,修正后的模型代码如下:
import torch.nn as nn import torch.nn.functional as F class ANN_Model(nn.Module): def __init__(self,input_features=8,hidden1=8,hidden2=200,hidden3=200,hidden4=300,hidden5=300,hidden6=400,hidden7=400,hidden8=300,hidden9=300,out_features=2): super().__init__() self.f_connected1 = nn.Linear(input_features, hidden1) self.f_connected2 = nn.Linear(hidden1, hidden2) self.f_connected3 = nn.Linear(hidden2, hidden3) self.f_connected4 = nn.Linear(hidden3, hidden4) self.f_connected5 = nn.Linear(hidden4, hidden5) self.f_connected6 = nn.Linear(hidden5, hidden6) self.f_connected7 = nn.Linear(hidden6, hidden7) self.f_connected8 = nn.Linear(hidden7, hidden8) self.f_connected9 = nn.Linear(hidden8, hidden9) self.out = nn.Linear(hidden9, out_features) def forward(self,x): x = F.relu(self.f_connected1(x)) x = F.relu(self.f_connected2(x)) x = F.relu(self.f_connected3(x)) x = F.relu(self.f_connected4(x)) x = F.relu(self.f_connected5(x)) x = F.relu(self.f_connected6(x)) x = F.relu(self.f_connected7(x)) x = F.relu(self.f_connected8(x)) x = F.relu(self.f_connected9(x)) x = self.out(x) return x
- 调整训练循环中的前向传播调用逻辑,不要直接显式调用
forward方法,PyTorch提供的__call__接口会自动处理内置钩子、设备移动等逻辑,修改前向传播代码为:
y_pred = model(X_train)
额外优化建议
- 你当前设计的网络层数达9层、隐藏层维度最高到400,对于仅8个输入特征的二分类任务来说结构过于复杂,很容易出现过拟合、训练不稳定的问题,建议先从2-3层隐藏层的小模型开始测试,比如设置隐藏层维度为32、16,训练效果和效率都会更优。
- 可以在训练前打印模型结构
print(model),逐行核对每个全连接层的输入输出维度是否符合预期,能快速定位大部分维度匹配问题。
内容的提问来源于stack exchange,提问作者Saniaaa
相关产品推荐
相关产品推荐

