PyTorch模型验证:张量a(32)的大小必须与张量b(13)的大小匹配

时间:2019-03-07 14:59:49

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

我是机器学习的初学者。因此,出于学习目的,我试图开发一个简单的CNN来对棋子进行分类。网络已经可以使用,我可以对其进行训练,但是我的验证功能存在问题。

我无法将我的预测与我的target_data进行比较,因为我的预测只是大小为13的张量,而target.data[batch_size]x13。我不知道我的错误在哪里。 PyTorch示例几乎都使用此功能将预测与目标数据进行比较。

如果有人可以在这里帮助我,那真是太好了。

您可以在此处查找其余代码:https://github.com/michaelwolz/ChessML/blob/master/train.ipynb

def validate(model, validation_data, criterion):
    model.eval()
    loss = 0
    correct = 0

    for i in range(len(validation_data)):
        data, target = validation_data[i][0], validation_data[i][1]
        target = torch.Tensor(target)

        if torch.cuda.is_available():
            data = data.cuda()
            target = target.cuda()

        out = model(data)

        loss += criterion(out, target).item()

        _, prediction = torch.max(out.data, 1)
        correct += (prediction == target.data).sum().item()

    loss = loss / len(validation_data)
    print("###################################")
    print("Average loss:", loss)
    print("Accuracy:", 100. * correct / len(validation_data))
    print("###################################")

错误:

<ipython-input-6-6b21e2bfb8a6> in validate(model, validation_data, 

criterion)
     17 
     18         _, prediction = torch.max(out.data, 1)
---> 19         correct += (prediction == target.data).sum().item()
     20 
     21     loss = loss / len(validation_data)

RuntimeError: The size of tensor a (32) must match the size of tensor b (13) at non-singleton dimension 1

编辑: 我的标签如下:

[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

每个索引代表一个类别。
torch.max()函数的输出似乎是该类的索引。 我不明白如何将索引与target_label进行比较。我的意思是说我可以编写一个函数来检查预测的索引处是否有1,但是我认为我的错误在其他地方。

1 个答案:

答案 0 :(得分:1)

也只需在目标上运行“ argmax”:

_, target = torch.max(target.data, 1)

或更妙的是,只需将目标保持为[example_1_class, example_2_class, ...],而不是1-hot编码。