每当我运行模型(图像)时,`*** RuntimeError:mat1 dim 1 必须匹配 mat2 dim 0`

Dav*_*vid 4 conv-neural-network pytorch

    def __init__(self):
        super().__init__()

        self.conv = nn.Sequential(
            nn.Conv2d(1, 64, kernel_size=5, stride=2, bias=False),
            nn.BatchNorm2d(64),
            nn.ReLU(),

            nn.Conv2d(64, 64, kernel_size=3, stride=2, bias=False),
            nn.BatchNorm2d(64),
            nn.ReLU(),
            
            nn.Conv2d(64, 64, kernel_size=3, stride=2, bias=False),
            nn.BatchNorm2d(64),
  
        )
Run Code Online (Sandbox Code Playgroud)

我该如何处理这个错误?我认为错误出在 self.fc 上,但我不能说如何修复它。

kHa*_*hit 6

的输出self.conv(x)形状为torch.Size([32, 64, 2, 2]): 32*64*2*2= 8192(这相当于 ( self.conv_out_size)。全连接层的输入需要一个单维向量,即您需要在传递到前向函数中的全连接层之前将其展平。

IE

class Network():
    ...
    def foward():
    ...
        conv_out = self.conv(x)
        print(conv_out.shape)
        conv_out = conv_out.view(-1, 32*64*2*2)
        print(conv_out.shape)
        x = self.fc(conv_out)
        return x
Run Code Online (Sandbox Code Playgroud)

输出

torch.Size([32, 64, 2, 2])
torch.Size([1, 8192])
Run Code Online (Sandbox Code Playgroud)

编辑:

我认为你使用的self._get_conv_out函数是错误的。

它应该是

    def _get_conv_out(self, shape):
        output = self.conv(torch.zeros(1, *shape)) # not (32, *size)
        return int(numpy.prod(output.size()))
Run Code Online (Sandbox Code Playgroud)

然后,在前向传递中,您可以使用

        conv_out = self.conv(x)
        # flatten the output of conv layers
        conv_out = conv_out.view(conv_out.size(0), -1)
        x = self.fc(conv_out)
Run Code Online (Sandbox Code Playgroud)

对于 的输入(32, 1, 110, 110),输出应该是torch.Size([32, 2])