【问题标题】:RuntimeError: size mismatch, m1: [32 x 1], m2: [32 x 9]RuntimeError:大小不匹配,m1:[32 x 1],m2:[32 x 9]
【发布时间】:2019-10-14 08:21:21
【问题描述】:

我正在构建一个 CNN,并对其进行字母 A 到 I(9 类)的手势分类训练,每个图像都是 224x224 大小的 RGB。

不确定我需要转置哪个矩阵以及如何转置。我已经设法匹配层的输入和输出,但是矩阵乘法的东西,不太确定如何解决它。

class LargeNet(nn.Module):
    def __init__(self):
        super(LargeNet, self).__init__()
        self.name = "large"
        self.conv1 = nn.Conv2d(3, 5, 5)
        self.pool = nn.MaxPool2d(2, 2)
        self.conv2 = nn.Conv2d(5, 10, 5)
        self.fc1 = nn.Linear(10 * 53 * 53, 32)
        self.fc2 = nn.Linear(32, 9)

    def forward(self, x):
        x = self.pool(F.relu(self.conv1(x)))
        print('x1')
        x = self.pool(F.relu(self.conv2(x)))
        print('x2')
        x = x.view(-1, 10*53*53)
        print('x3')
        x = F.relu(self.fc1(x))
        print('x4')
        x = x.view(-1, 1)
        x = self.fc2(x)
        print('x5')
        x = x.squeeze(1) # Flatten to [batch_size]
        return x

和训练代码

#Loss and optimizer
criterion = nn.BCEWithLogitsLoss()
optimizer = optim.SGD(model2.parameters(), lr=learning_rate, momentum=0.9)

# Train the model
total_step = len(train_loader)
loss_list = []
acc_list = []
for epoch in range(num_epochs):
    for i, (images, labels) in enumerate(train_loader):
        print(i,images.size(),labels.size())
        # Run the forward pass
        outputs = model2(images)
        labels=labels.unsqueeze(1)
        labels=labels.float()
        loss = criterion(outputs, labels)

代码打印到 x4,然后我收到此错误 RuntimeError: size mismatch, m1: [32 x 1], m2: [32 x 9] at C:\w\1\s\tmp_conda_3.7_055457\conda \conda-bld\pytorch_1565416617654\work\aten\src\TH/generic/THTensorMath.cpp:752

完整的回溯错误:https://ibb.co/ykqy5wM

【问题讨论】:

  • 请显示完整的错误回溯。
  • @ba_ul 链接到完整的错误回溯ibb.co/ykqy5wM
  • 你的输入尺寸是多少?
  • 为什么会有x = x.view(-1, 1)这一行?
  • @zihaozhihao 输入尺寸为RGB正方形图片3通道,224 x 224像素

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


【解决方案1】:

您的forward 函数中不需要x=x.view(-1,1) 和x = x.squeeze(1)。删除这两行。你的输出形状是(batch_size, 9)。

另外,您需要将labels 转换为one-hot 编码,其形状为(batch_size, 9)。

class LargeNet(nn.Module):
    def __init__(self):
        super(LargeNet, self).__init__()
        self.name = "large"
        self.conv1 = nn.Conv2d(3, 5, 5)
        self.pool = nn.MaxPool2d(2, 2)
        self.conv2 = nn.Conv2d(5, 10, 5)
        self.fc1 = nn.Linear(10 * 53 * 53, 32)
        self.fc2 = nn.Linear(32, 9)

    def forward(self, x):
        x = self.pool(F.relu(self.conv1(x)))
        x = self.pool(F.relu(self.conv2(x)))
        x = x.view(-1, 10*53*53)
        x = F.relu(self.fc1(x))
        x = self.fc2(x)
        return x

model2 = LargeNet()
#Loss and optimizer
criterion = nn.BCEWithLogitsLoss()
# nn.BCELoss()
optimizer = optim.SGD(model2.parameters(), lr=0.1, momentum=0.9)

images = torch.from_numpy(np.random.randn(2,3,224,224)).float() # fake images, batch_size is 2
labels = torch.tensor([1,2]).long() # fake labels

outputs = model2(images)
one_hot_labels = torch.eye(9)[labels] 
loss = criterion(outputs, one_hot_labels)

【讨论】:

  • 谢谢,它可以使代码更加动态,我正在考虑创建一个将批量大小作为参数传递的函数,唯一需要的更改是 images = torch.from_numpy( np.random.randn(batch_size,3,224,224)).float() 和标签 = torch.tensor([1,batch_size]).long() ?
  • @megazord 你想在训练期间更改批量大小吗?
  • 在训练之前,我想在一个小数据集上测试我的代码,然后在一个更大的数据集上测试我的代码,这将需要我使用更大的批量大小并测试不同的批量大小以查看最佳的一个。
  • @megazord 我明白了,是的,你可以按照你说的去做。
猜你喜欢
  • 1970-01-01
  • 2019-07-25
  • 2021-05-13
  • 2019-05-18
  • 1970-01-01
  • 2020-06-11
  • 1970-01-01
相关资源
最近更新 更多