649453932 / Chinese-Text-Classification-Pytorch

中文文本分类,TextCNN,TextRNN,FastText,TextRCNN,BiLSTM_Attention,DPCNN,Transformer,基于pytorch,开箱即用。
MIT License
5.19k stars 1.22k forks source link

关于evaluate函数中loss计算是否准确的问题? #82

Open beyondguo opened 2 years ago

beyondguo commented 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).

我感觉存在的一个小问题是:data_iter的最后一个batch的batch size可能会跟前面的batch不一样,往往是不足的。因此直接求平均,似乎并不是精确的这个epoch的loss。应该每个batch,都乘以当前batch的size,最后再除以总体size, 就是精确的loss。

不知道我的理解是否正确,还望可以跟我讨论一下,感谢!

jiangpeng12345 commented 1 year ago

问题不大啊