报错解决:RuntimeError: mat1 and mat2 shapes cannot be multiplied

**引言:**在采用深度学习模型训练和打比赛的过程中,我们经常需要用到不同的模型,而调整模型的时候,经常会遇到模型结构

1. FC神经元数和模型结构不匹配报错

不匹配的报错情况如下所示:

return F.linear(input, self.weight, self.bias)
RuntimeError: mat1 and mat2 shapes cannot be multiplied (30x2048 and 512x2)

按照字面翻译是运行时错误:mat1和mat2形状不能相乘,很多人看到这一头雾水,为啥FC层会涉及到乘法运算呢?


所谓全连接神经网络,就是由全连接层组成的网络。简单的全连接层网络一般分为三层,分别是输入层,隐含层,输出层。当然在输出层后面还可以添加分类层,或者损失函数等特殊处理层。

解释如下:对于全连接神经网络来说,网络中每一层的每一个结点都与相邻网络层的每一个结点相连,用来把前边提取到的特征综合起来。由于其全相连的特性,一般全连接层的参数也是最多的。据说能占到整个网络的80%。比如:
a 1 = x 1 w 11 + x 2 w 21 + . . . a_1=x_1w_{11}+x_2w_{21}+... a1=x1w11+x2w21+...
这就十分类似于矩阵的乘法运算展开过程


假设我们定义的Pytorch模型如下所示,很显然如果用到Resnet和Resnext这两个模型,他们最后面的FC全连接层的参数肯定是不一样的,因而会产生上述报错的原因主要就是当前网络结构输出的神经元数和设置的神经元不匹配,因此需要重新设置fc层的神经元数。

####################################################################################################
cls_num = 4
class XunFeiNet(nn.Module):
    def __init__(self):
        super(XunFeiNet, self).__init__()
        model = models.resnext50_32x4d(True)
        model.avgpool = nn.AdaptiveAvgPool2d(1)
        model.fc = nn.Linear(512, 2)
        self.Resnext = model
    def forward(self, img):
        out = self.Resnext(img)
        return out
######################################################################

2. 报错解决

  • 首先,我们需要理解nn.Linear(a,b)函数的意思是,FC层的输入神经元为a,输出神经元为b.
  • 在这里,如果是Resnext的网络结构,只需要调整FC层的神经元参数到匹配其参数即可。这里显示的报错是30x2048不匹配512x2的FC层,那么可以设置为2048x2即可。需要记住的就是这个mat1通常指的是输入的上级神经元输出数量正确的调整好后的网络结构如下:
####################################################################################################
cls_num = 4
class XunFeiNet(nn.Module):
    def __init__(self):
        super(XunFeiNet, self).__init__()
        model = models.resnext50_32x4d(True)
        model.avgpool = nn.AdaptiveAvgPool2d(1)
        model.fc = nn.Linear(2048, 2)
        self.Resnext = model
    def forward(self, img):
        out = self.Resnext(img)
        return out
######################################################################

你可能感兴趣的:(python,报错解决)