【问题标题】:RuntimeError: mat1 and mat2 shapes cannot be multiplied (64x3072 and 64x3072)RuntimeError:mat1 和 mat2 形状不能相乘(64x3072 和 64x3072)
【发布时间】:2022-01-28 18:38:27
【问题描述】:

我正在尝试制作一个图像检测神经网络。训练数据在 64 的批量大小内加载。运行此代码后,我得到 RuntimeError:mat1 和 mat2 形状不能相乘(64x3072 和 64x3072)。这很令人困惑,因为对我来说这两种形状/大小似乎是一样的。 谁能帮我找出那个错误?

class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.conv1 = nn.Conv2d(1, 6, kernel_size=2)
        self.conv2 = nn.Conv2d(6, 12, kernel_size=2)
        self.conv3 = nn.Conv2d(12, 18, kernel_size=2)
        self.conv4 = nn.Conv2d(18, 768, kernel_size=2)
        self.fc1 = nn.Linear(64, 3072)
        self.fc2 = nn.Linear(3072, 7)


    def forward(self, x):
        print(x.size()) #1
        x = self.conv1(x)
        x = F.max_pool2d(x, 2)
        x = F.relu(x)
        print(x.size()) #2
        x = self.conv2(x)
        x = F.max_pool2d(x, 2)
        x = F.relu(x)
        print(x.size()) #3
        x = self.conv3(x)
        x = F.max_pool2d(x, 2)
        x = F.relu(x)
        print(x.size()) #4
        x = self.conv4(x)
        x = F.max_pool2d(x, 2)
        x = F.relu(x)
        print(x.size()) #5
        x = x.view(x.size(0), -1)
        x = F.relu(self.fc1(x))
        print(x.size()) #6
        x = self.fc2(x)
        print(x.size()) #7

        return torch.sigmoid(x)

forward 函数的打印输出为:

torch.Size([64, 1, 48, 48]) #1
torch.Size([64, 6, 23, 23]) #2
torch.Size([64, 12, 11, 11]) #3
torch.Size([64, 18, 5, 5]) #4
torch.Size([64, 768, 2, 2]) #5

所以,我很确定错误位于 x = x.view() 行和第一个全连接层中的某处。但我无法让它运行。

【问题讨论】:

  • 请澄清您的具体问题或提供更多详细信息以准确突出您的需求。正如目前所写的那样,很难准确地说出你在问什么。

标签: python pytorch


【解决方案1】:

#5x 的形状为(64, 768, 2, 2),即3072 每个批次元素的分量。然而fc1 只需要64 功能。例如,您可以将 fc1fc2 替换为:

self.fc1 = nn.Linear(3072, 64)
self.fc2 = nn.Linear(64, 7)

那么你会有:

  • x#6 的形状是 (64, 64)
  • x#7 的形状是 (64, 7)

【讨论】:

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