我是机器学习的初学者。因此,出于学习目的,我试图开发一个简单的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,但是我认为我的错误在其他地方。
答案 0 :(得分:1)
也只需在目标上运行“ argmax”:
_, target = torch.max(target.data, 1)
或更妙的是,只需将目标保持为[example_1_class, example_2_class, ...]
,而不是1-hot编码。