我试图创建一个CNN,在20个纪元内获得至少80%的CIFAR 10数据准确性。 第一个 如果我运行这个程序,我得到RuntimeError: mat1 and mat2 shapes cannot be multiplied (256x512 and 256x512)。但是矩阵的大小是一样的,都是256 x512。为什么会发生这种情况?我也试着修改reshape参数,但是我不能让它工作。有什么想法吗?谢谢!
在定义model之后的任何时候。如果您有像这个问题中的尺寸不匹配,就会立即产生错误。然后您可以注解掉forward()中的最后几行,看看错误是否消失。这样您就可以快速缩小导致尺寸不匹配的层。一旦您确切地知道是哪一行导致了问题,查找错误就会变得容易得多。 顺便说一句,“形状不能相乘”错误是指矩阵乘法。如果矩阵A的维数为m x n,矩阵B的维数为r x s,则乘积A*B仅在n = r时定义,这对于错误消息中的维数是不满足的。
1条答案
按热度按时间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个输入。附加调试提示:试着写
在定义
model
之后的任何时候。如果您有像这个问题中的尺寸不匹配,就会立即产生错误。然后您可以注解掉forward()
中的最后几行,看看错误是否消失。这样您就可以快速缩小导致尺寸不匹配的层。一旦您确切地知道是哪一行导致了问题,查找错误就会变得容易得多。顺便说一句,“形状不能相乘”错误是指矩阵乘法。如果矩阵A的维数为m x n,矩阵B的维数为r x s,则乘积A*B仅在n = r时定义,这对于错误消息中的维数是不满足的。