Open beyondguo opened 2 years ago
作者你好!非常感谢你的代码,清晰明了。有一个小细节想讨论一下:
在根据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).
loss_total += loss
loss_total / len(data_iter)
我感觉存在的一个小问题是:data_iter的最后一个batch的batch size可能会跟前面的batch不一样,往往是不足的。因此直接求平均,似乎并不是精确的这个epoch的loss。应该每个batch,都乘以当前batch的size,最后再除以总体size, 就是精确的loss。
不知道我的理解是否正确,还望可以跟我讨论一下,感谢!
问题不大啊
作者你好!非常感谢你的代码,清晰明了。有一个小细节想讨论一下:
在根据loss判断模型是否更好的时候,会通过evaluate函数计算loss:
其中,在每次从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。
不知道我的理解是否正确,还望可以跟我讨论一下,感谢!