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

如何修复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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 13:15:09