测试网络:
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')
答案 0 :(得分:0)
假定“ pred”的形状为[64,1],而target
的形状为[64,30]。现在,如果您要呼叫target.view_as(pred)
,则尝试以与target
相同的形状查看pred
,但是target
具有64 * 30 = 1920个条目,而{{ 1}}只有64,所以这就是错误的出处。
您确定目标正确吗?因为您要预测一维输出,但是要尝试与30维目标进行比较。