Pythorch CNN错误:预期的输入批处理大小(4)与目标批处理大小(64)匹配

2024-03-28 13:29:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我从去年11月就开始自学了,如果有任何帮助的话,我会非常感激的,谢谢你的关注,因为我好像在绕圈子。我试着用PythorchCNN的一个例子,它与Mnist数据集一起使用。现在我正在尝试修改CNN的面部关键点识别。我使用的是Kaggle数据集(CSV),包含7048个训练图像和关键点(每个人脸15个关键点)和1783个测试图像。我分割训练数据集并将图像转换成jpeg格式,为关键点(形状15,2)制作单独的文件。我制作了数据集和数据加载器,可以迭代显示图像和绘制关键点。当我运行CNN时,我得到了这个错误。在

> Net(
  (conv1): Conv2d(1, 32, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2))
  (conv2): Conv2d(32, 64, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2))
  (conv2_drop): Dropout2d(p=0.5)
  (fc1): Linear(in_features=589824, out_features=100, bias=True)
  (fc2): Linear(in_features=100, out_features=30, bias=True)
)
Data and target shape:  torch.Size([64, 96, 96])   torch.Size([64, 15, 2])
Data and target shape:  torch.Size([64, 1, 96, 96])   torch.Size([64, 15, 2])

Traceback (most recent call last):
  File "/home/keith/PycharmProjects/FacialLandMarks/WorkOut.py", line 416, in <module>
    main()
  File "/home/keith/PycharmProjects/FacialLandMarks/WorkOut.py", line 412, in main
    train(args, model, device, train_loader, optimizer, epoch)
  File "/home/keith/PycharmProjects/FacialLandMarks/WorkOut.py", line 324, in train
    loss = F.nll_loss(output, target)
  File "/home/keith/Desktop/PycharmProjects/fkp/FacialLandMarks/lib/python3.6/site-packages/torch/nn/functional.py", line 1788, in nll_loss
    .format(input.size(0), target.size(0)))
ValueError: Expected input batch_size (4) to match target batch_size (64).

Process finished with exit code 1

以下是我读过的一些链接,我没法解决问题 但可能会帮助其他人。在

https://github.com/pytorch/pytorch/issues/11762How do I modify this PyTorch convolutional neural network to accept a 64 x 64 image and properly output predictions? pytorch-convolutional-neural-network-to-accept-a-64-x-64-im Pytorch Validating Model Error: Expected input batch_size (3) to match target batch_size (4) model-error-expected-input-batch-size-3-to-match-target-ba

这是我的代码:

^{pr2}$

Tags: to数据in图像targethomesizebatch
1条回答
网友
1楼 · 发布于 2024-03-28 13:29:15

要了解出了什么问题,您可以在前进的每一步之后打印形状:

# Input data
torch.Size([64, 1, 96, 96])
x = F.relu(F.max_pool2d(self.conv1(x), 2))
torch.Size([64, 32, 48, 48])
x = F.relu(F.max_pool2d(self.conv2_drop(self.conv2(x)), 2))
torch.Size([64, 64, 24, 24])
x = x.view(-1, 64 * 96 * 96)
torch.Size([4, 589824])
x = F.relu(self.fc1(x))
torch.Size([4, 100])
x = F.dropout(x, training=self.training)
torch.Size([4, 100])
x = self.fc2(x)
torch.Size([4, 30])
return F.log_softmax(x, dim=1)    
torch.Size([4, 30])
  • 你的maxpool2d层减少了特征图的高度和宽度。在
  • “视图”应该是x = x.view(-1, 64 * 24 * 24)
  • 大小的第一个线性层:self.fc1 = nn.Linear(64 * 24 * 24, 100)

这将得到output = model(data)的最终形状torch.Size([64, 30])

但该代码在计算负对数似然损失时仍将面临一个问题:

^{bq}$

其中类索引只是标签:

values representing a class. For example:

0 - class0, 1 - class1,

因为你的最后一个nn层输出了一个超过30个类的softmax,我假设这就是你想要分类的输出类, 所以目标的转换:

^{pr2}$

这是当目标是一个概率分布超过30个类时,如果不能做到的话可以先做一个软极大。因此,30个值中的最大值将代表最大的概率-因此,这个类就是您的输出所代表的,因此您计算两个值之间的nll。在

相关问题 更多 >