我从去年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}$
要了解出了什么问题,您可以在前进的每一步之后打印形状:
maxpool2d
层减少了特征图的高度和宽度。在x = x.view(-1, 64 * 24 * 24)
self.fc1 = nn.Linear(64 * 24 * 24, 100)
这将得到
output = model(data)
的最终形状torch.Size([64, 30])
但该代码在计算负对数似然损失时仍将面临一个问题:
^{bq}$其中类索引只是标签:
因为你的最后一个nn层输出了一个超过30个类的softmax,我假设这就是你想要分类的输出类, 所以目标的转换:
^{pr2}$这是当目标是一个概率分布超过30个类时,如果不能做到的话可以先做一个软极大。因此,30个值中的最大值将代表最大的概率-因此,这个类就是您的输出所代表的,因此您计算两个值之间的nll。在
相关问题 更多 >
编程相关推荐