我正在试验NLP,目前,我正试图提出一个翻译模式,将英语句子转换成法语句子。我正在使用这个数据集(并不是说它是相关的):
https://github.com/udacity/deep-learning/raw/master/language-translation/data
它由137 K以上的句子组成。我的模型是一个编码器-译码器LSTM,注意在Keras中实现.下面是我绘制的验证损失和准确性图表:


这两个精度指标是我自己开发的自定义的。但是它们基于同样的Keras的categorical_accuracy。
现在,我的问题是,为什么我得到了一个改进的准确性,而损失值是得到wrose?
而且,这样的模式值得信赖吗?
发布于 2021-03-02 17:16:04
检查填充值是否在计算精度的同时得到考虑,情况不应该是这样的。您应该为填充值创建掩码,并在计算精度时使用该掩码。例如,虽然填充区域的y_true值是0,y_pred的值也是0,但是y_true == y_pred算作了正确的预测,影响了总体精度。这是错误的,您应该做的是定义一个自定义精度度量,它执行以下操作:
correct = y_pred == y_true
mask = tf.cast(tf.cast(y_true, tf.bool), tf.int16)
accuracy = tf.reduce_sum(correct * mask)/tf.reduce_sum(mask)希望这能给你一个正确的衡量标准。
发布于 2022-01-30 18:27:28
我不知道这是不是你的案子的原因。但通常情况下,如果产生的概率不确定,则更大(更糟)的log_loss可能对应于更大(更好)的accuracy:
import numpy as np
import matplotlib.pyplot as plt
from sklearn.metrics import log_loss, accuracy_score
random = np.random.RandomState(41)
y = np.array([0]*50 + [1]*50)
probas1= np.concatenate([[0]*30, random.uniform(size=40), [1]*30])
probas2= np.concatenate([random.normal(loc=0.48, scale=0.01, size=50),
random.normal(loc=0.52, scale=0.01, size=50)])
print(log_loss(y, probas1), accuracy_score(y, probas1>0.5))
print(log_loss(y, probas2), accuracy_score(y, probas2>0.5))
>>> 0.31286642799863323 0.83
>>> 0.6536974952243071 0.99
plt.hist(y, label='True classes');
plt.hist(probas1, label='Better log_loss, worse accuracy')
plt.hist(probas2, label='Worse log_loss, better accuracy')
plt.legend()
https://datascience.stackexchange.com/questions/61099
复制相似问题