【问题标题】:Pytorch RuntimeError: mat1 and mat2 shapes cannot be multiplied (32x246016 and 3136x1000)Pytorch RuntimeError:mat1 和 mat2 形状不能相乘(32x246016 和 3136x1000)
【发布时间】:2022-01-19 23:55:57
【问题描述】:

我正在 Pytorch 上构建一个 CNN。 我对输入有点困惑。 我收到以下错误:

RuntimeError:mat1 和 mat2 形状不能相乘(32x246016 和 3136x1000)

图像为 250 x 250 灰度。

谁能看看我的构造函数并告诉我哪里出错了? 如果您能向我解释为什么我错了以及为什么您的答案是正确的,则可以加分! ;)

class CNN(nn.Module):

# Contructor
def __init__(self):
    super(CNN, self).__init__()
    self.cnn1 = nn.Conv2d(1, 32, kernel_size=5, stride=1, padding=2)
    self.conv1_bn = nn.BatchNorm2d(32)

    self.maxpool1=nn.MaxPool2d(kernel_size=2, stride=2)
    
    self.cnn2 = nn.Conv2d(32, 64, kernel_size=5,stride=1, padding=2)
    self.conv2_bn = nn.BatchNorm2d(64)
    self.maxpool2=nn.MaxPool2d(kernel_size=2, stride=2)  
    
    self.drop_out1 = nn.Dropout()
    self.fc1 = nn.Linear(7 * 7 * 64, 1000)
    self.bn_fc1 = nn.BatchNorm2d(1000)
    
    self.fc2 = nn.Linear(1000, 1)
    

    

# Prediction
def forward(self, x):
    x = self.cnn1(x)
    x = self.conv1_bn(x)
    x = torch.relu(x)
    x = self.maxpool1(x)
    x = self.cnn2(x)
    x = self.conv2_bn(x)
    x = torch.relu(x)
    x = self.maxpool2(x)
    x = x.view(x.size(0), -1)
    x = self.drop_out1(x)
    x = self.fc1(x)
    x = self.bn_fc1(x)
    x = torch.relu(x)
    x = self.fc2(x)
    x = torch.sigmoid(x)
   
    return x

【问题讨论】:

  • 嗨,我想看看 x.view(x.size(0), -1) 的输出形状,在我看来,你的 fc1 层需要的形状与它得到的形状不同.这意味着你的 conv/maxpool 部分的输出应该大于7 x 7
  • 我同意@chillston 的观点,如果您不确定前一层的尺寸应该是多少,可以尝试输入torch.nn.AdaptiveAvgPool2d(7)(或torch.nn.AdaptiveMaxPool2d(7)

标签: python machine-learning deep-learning pytorch conv-neural-network


【解决方案1】:

您的 fc1 层需要一个形状为 (-1, 7*7*64) 的张量,但您传递给它的是一个形状为 [-1, 246016] 的张量(-1 是批量大小)。

要计算卷积网络的输出大小,请参阅this post 或任何神经网络教科书。

【讨论】:

    猜你喜欢
    • 2021-07-20
    • 2021-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-24
    • 1970-01-01
    • 2021-09-09
    相关资源
    最近更新 更多