Pytorch问题测试CNN:RuntimeError:形状'[64,1]'对于大小为1920的输入无效

时间:2019-03-13 12:48:47

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

测试网络:

 def test(args, model, device, test_loader):
           model.eval()
           total = 0
           test_loss = 0
           correct = 0
           with torch.no_grad():
           for batch_idx, batch in enumerate(test_loader):
               data = batch['image']
               target = batch['key_points']
               data, target = data.to(device), target.to(device)
               # data, target = Variable(data), Variable(target)
           # for data, target in test_loader:
           #     data, target = data.to(device), target.to(device)
           #     data, target = Variable(data), Variable(target)
                 data = data.unsqueeze(1).float() 

                 print('TESTING 1: Data and target shape: ', data.shape, ' 
                       ', target.shape)
                 output = model(data)
                 target = target.view(target.shape[0], -1)  

                 print('TESTING 2: Data and target shape: ', data.shape, ' 
                       ', target.shape)
                 # test_loss += F.nll_loss(output, target, 
                 reduction='sum').item()  # sum up batch loss orginal
                 test_loss = F.nll_loss(output, torch.max(target, 1)[1])
                  # test_loss += F.nll_loss(output, 
                  torch.max(target.float(), 1)[1], reduction='sum').item()

                   print('TESTING 3: Data and target shape: ', data.shape, 
                       ' ', target.shape)
                   # pred = output.max(1, keepdim=True)[1]  
                   pred = output.argmax(dim=1, keepdim=True)  # original

                   print('TESTING 4: Data and target shape: ', data.shape, 
                       ' ', target.shape)

                   correct += pred.eq(target.view_as(pred)).sum().item()   
                   print('TESTING last: Data and target shape: ', 
                   data.shape, ' ', target.shape)

                   test_loss /= len(test_loader.dataset)
                   print('\nTest set: Average loss: {:.4f}, Accuracy: 
                        {}/{} ({:.0f}%)\n'.format(
                         test_loss , correct, len(test_loader.dataset),
                         100. * correct / len(test_loader.dataset)))

我可以运行训练循环,但是当我尝试运行测试循环时,训练也只会运行1个纪元,并且会显示以下消息。

TESTING 1: Data and target shape:  torch.Size([64, 1, 96, 96])  
torch.Size([64, 15, 2]) TESTING 2: Data and target shape: 
torch.Size([64, 1, 96, 96])   torch.Size([64, 30]) 
TESTING 3: Data and target shape:  torch.Size([64, 1, 96, 96])  
torch.Size([64, 30])
TESTING 4: Data and target shape:  torch.Size([64, 1, 96, 96])  
 torch.Size([64, 30]) Traceback (most recent call last):   File
 "/home/keith/PycharmProjects/FacialLandMarks/WorkOut.py", line 468, in <module>
    main()   File "/home/keith/PycharmProjects/FacialLandMarks/WorkOut.py", line 463, in main
    test(args, model, device, test_loader)   File "/home/keith/PycharmProjects/FacialLandMarks/WorkOut.py", line 380, in test
    correct += pred.eq(target.view_as(pred)).sum().item()   
 RuntimeError: shape '[64, 1]' is invalid for input of size 1920
 Process finished with exit code 1

关于这个特定问题,面部关键点检测测试阶段,我无法在线或从我购买的许多书籍中找到任何有用的资源。我认为问题显示在错误消息(带有注释)或我的数据中。我正在使用带有训练关键点csv文件的单独的测试图像集。如您所见,我已经在整个测试阶段打印出了数据的形状。 任何帮助或有用的链接总是很感激。谢谢

当我使用pycharm调试器并查看以下代码行时查看断点:

pred = output.max(1, keepdim=True)[1]

然后pred张量更改为此:

tensor([[29],
        [29],
        [29],
        [29],
        [29],
        [29],
        [29],
        [29],

         ...
        [29],
        [29],
        [29],
        [29],
        [29],
        [29],
        [29]], device='cuda:0')

1 个答案:

答案 0 :(得分:0)

假定“ pred”的形状为[64,1],而target的形状为[64,30]。现在,如果您要呼叫target.view_as(pred),则尝试以与target相同的形状查看pred,但是target具有64 * 30 = 1920个条目,而{{ 1}}只有64,所以这就是错误的出处。

您确定目标正确吗?因为您要预测一维输出,但是要尝试与30维目标进行比较。