如何修复PyTorch自定义四层网络的矩阵乘法维度不匹配错误?
解决PyTorch MLP的形状不匹配错误
错误原因分析
你遇到的RuntimeError: mat1 and mat2 shapes cannot be multiplied (2x20 and 128x64),本质是输入数据的特征维度和模型第一层的输入维度不匹配:
- 输入数据的形状是
(2,20):batch大小为2,每个样本的特征数是20 - 模型第一层
nn.Linear(128,64)的权重形状是(128,64),要求输入的特征数必须等于128,否则矩阵乘法无法执行
正确的四层MLP模型实现
按照你要求的结构(输入128→64(ReLU)→32(ReLU)→Dropout(0.5)→1(Sigmoid)),正确的模型代码如下:
import torch import torch.nn as nn class Net(nn.Module): def __init__(self): super().__init__() self.network = nn.Sequential( # 输入128维 → 64维,ReLU激活 nn.Linear(in_features=128, out_features=64), nn.ReLU(), # 64维 → 32维,ReLU激活 nn.Linear(in_features=64, out_features=32), nn.ReLU(), # Dropout层,丢弃概率0.5 nn.Dropout(p=0.5), # 32维 → 1维,Sigmoid激活 nn.Linear(in_features=32, out_features=1), nn.Sigmoid() ) def forward(self, x): # 添加断言检查输入维度是否符合要求 assert x.shape[-1] == 128, f"输入特征维度必须为128,当前为{x.shape[-1]}" return self.network(x)
修复输入数据维度
确保输入到模型的张量最后一维是128,示例如下:
# 构造符合要求的输入:batch_size=2,每个样本128维特征 input_data = torch.randn(2, 128) # 初始化模型并前向传播 model = Net() output = model(input_data) print(output.shape) # 输出应为torch.Size([2, 1])
如果你的原始数据确实是20维特征,那需要调整模型第一层的in_features=20,但这会偏离你最初“输入128→64”的需求,所以优先保证输入数据的特征数为128。
断言检查验证
模型中的断言会在输入维度错误时直接抛出明确提示,避免模糊的形状错误。你也可以在训练/测试代码中添加额外的断言,确保数据和模型匹配:
assert input_data.shape[-1] == 128, "训练数据特征维度不符合模型要求"
内容的提问来源于stack exchange,提问作者Kin_99
相关产品推荐
相关产品推荐

