Chinese-Text-Classification-Pytorch
Chinese-Text-Classification-Pytorch copied to clipboard
关于evaluate函数中loss计算是否准确的问题?
作者你好!非常感谢你的代码,清晰明了。有一个小细节想讨论一下:
在根据loss判断模型是否更好的时候,会通过evaluate函数计算loss:
def evaluate(config, model, data_iter, test=False):
model.eval()
loss_total = 0
predict_all = np.array([], dtype=int)
labels_all = np.array([], dtype=int)
with torch.no_grad():
for texts, labels in data_iter:
outputs = model(texts)
loss = F.cross_entropy(outputs, labels)
loss_total += loss
labels = labels.data.cpu().numpy()
predic = torch.max(outputs.data, 1)[1].cpu().numpy()
labels_all = np.append(labels_all, labels)
predict_all = np.append(predict_all, predic)
acc = metrics.accuracy_score(labels_all, predict_all)
if test:
report = metrics.classification_report(labels_all, predict_all, target_names=config.class_list, digits=4)
confusion = metrics.confusion_matrix(labels_all, predict_all)
return acc, loss_total / len(data_iter), report, confusion
return acc, loss_total / len(data_iter)
其中,在每次从data_iter中取出一个batch后,会进行loss_total += loss操作,最后的loss是直接平均:loss_total / len(data_iter).
我感觉存在的一个小问题是:data_iter的最后一个batch的batch size可能会跟前面的batch不一样,往往是不足的。因此直接求平均,似乎并不是精确的这个epoch的loss。应该每个batch,都乘以当前batch的size,最后再除以总体size, 就是精确的loss。
不知道我的理解是否正确,还望可以跟我讨论一下,感谢!
问题不大啊