RuntimeError: mat1 and mat2 shapes cannot be multiplied (32x784 and 128x10)
这个报错表示矩阵乘法的维度不匹配:输入张量的形状是 `[32, 784]`,但全连接层只接受每个样本包含 `128` 个特征。需要检查的是 `784` 和 `128`,`32` 是 batch size,修改 batch size 无法解决这个问题。 对于 `nn.Linear(in_features, out_features)`,输入张量的最后一维必须等于 `in_features`。先在进入全连接层前打印输入形状和该层的配置: ``` # x 是即将传入全连接层 fc 的张量 print("input shape:", x.shape) print("expected features:", fc.in_features) ``` 假设输入是一批 `28×28` 的单通道图片,模型设计是将图片直接展平后进行十分类,那么每个样本有 `1 * 28 * 28 = 784` 个特征。全连接层应当使用 `nn.Linear(784, 10)`: ``` import torch from torch import nn x = torch.randn(32, 1, 28, 28) model = nn.Sequential( nn.Flatten(start_dim=1), # [32, 1, 28, 28] -> [32, 784] nn.Linear(28 * 28, 10), # 输入特征数与展平后的维度一致 ) logits = model(x) print(logits.shape) # torch.Size([32, 10]) ``` 如果全连接层前面还有卷积或池化,就要根据这些层的实际输出计算特征数。例如,输出为 `[B, 64, 7, 7]` 时,保留 batch 维度并展平后,每个样本的特征数是 `64 * 7 * 7 = 3136`,对应的全连接层可以写成 `nn.Linear(3136, 10)`。 如果网络原本就要求接收 128 维特征,那么应该检查上游是否遗漏了特征提取或投影层,而不是直接将全连接层改成 784 维。修复需要与模型设计保持一致。 不要用 `reshape(-1, 128)` 强行凑维度,这可能改变样本边界,甚至直接产生新的形状错误。也不要在每次 `forward()` 中临时创建新的全连接层,否则参数会反复初始化。调整层结构后,应重新检查旧权重能否加载,并确保优化器引用的是当前模型参数。 输入最后一维与 `in_features` 的对应关系可参考 [PyTorch 官方形状排查说明](https://docs.pytorch.org/tutorials/recipes/recipes/reasoning_about_shapes.html)。 代码报错,不用每次都从零翻帖子!访问我的github仓库:Josh050608。这里汇集了各种技术问题的解决思路,覆盖 Python 环境配置、PyTorch 模型训练、张量维度、CUDA 设备和依赖冲突等常见开发场景。报错定位、原因分析、修复示例,一站式查找;遇到问题先来这里搜一搜,把折腾环境的时间留给真正要写的代码!