pytorch -运行时错误:mat 1和mat 2形状不能相乘(256 x512和256 x512)以获得相同的大小

yeotifhr  于 2022-12-13  发布在  其他
关注(0)|答案(1)|浏览(937)

我试图创建一个CNN,在20个纪元内获得至少80%的CIFAR 10数据准确性。
第一个
如果我运行这个程序,我得到RuntimeError: mat1 and mat2 shapes cannot be multiplied (256x512 and 256x512)。但是矩阵的大小是一样的,都是256 x512。为什么会发生这种情况?我也试着修改reshape参数,但是我不能让它工作。有什么想法吗?谢谢!

yptwkmov

yptwkmov1#

声明FC层的工作方式类似于nn.Linear(num_in_features, num_out_features);请参阅official documentation。换句话说,您告诉fc1从25644个输入要素开始,生成512个输出要素。然后fc2尝试从256个输入要素开始,并生成512个输出要素。这是不匹配的,因为您告诉fc2期望256个输入,但实际上传递了512个输入。
如果修复此错误,您将立即看到一个新错误:fc2当前返回512个输出要素,但fc3只需要256个输入要素。
通过将行self.fc2 = nn.Linear(256, 512)替换为self.fc2 = nn.Linear(512, 256),可以同时解决这两个问题。

**编辑:**您还应该删除x = self.fc2(x)这一行。实际上,您的代码连续应用了两次fc2。我认为您只是打错了字,因为如果不在两个连续的FC层之间包含ReLU这样的激活函数,那么两个FC层并不比一个FC层好。这也是您的注解中提到的新错误的原因,因为第一个fc2调用产生256个特性,而第二个fc2调用需要512个输入。

附加调试提示:试着写

print(model(torch.zeros((3,38,38))))

在定义model之后的任何时候。如果您有像这个问题中的尺寸不匹配,就会立即产生错误。然后您可以注解掉forward()中的最后几行,看看错误是否消失。这样您就可以快速缩小导致尺寸不匹配的层。一旦您确切地知道是哪一行导致了问题,查找错误就会变得容易得多。
顺便说一句,“形状不能相乘”错误是指矩阵乘法。如果矩阵A的维数为m x n,矩阵B的维数为r x s,则乘积A*B仅在n = r时定义,这对于错误消息中的维数是不满足的。

相关问题