屏蔽值如何影响 Keras 中的指标?
How do masked values affect the metrics in Keras?
如果我查看 keras metric,我发现 y_true
和 y_predict
的值在 categorical_accuracy
的每个纪元结束时进行比较 "just" :
def categorical_accuracy(y_true, y_pred):
return K.cast(K.equal(K.argmax(y_true, axis=-1),
K.argmax(y_pred, axis=-1)),
K.floatx())
如何处理屏蔽值?如果我理解正确的话,掩蔽会禁止掩蔽值影响训练,但它仍然会产生对掩蔽值的预测。因此,在我看来,它确实会影响指标。
关于它如何影响指标的更多解释:
在 padding/masking 过程中,我将 y_true
中的 padded/masked 值设置为未使用的 class 例如class 0
。
如果现在 argmax()
正在单热编码 y_true
中寻找最大值,它将只是 return 0,因为总(屏蔽)行是相同的。
我没有 class 0,因为它是我的掩码 value/class,因此 y_pred
和 y_true
肯定具有不同的值,从而降低了准确性。
Keras 指标是否已经考虑到这一点并且我监督了它?
否则,我将不得不创建一个自定义指标或回调创建一个与 categorical_accuracy
类似的指标,并且在比较之前在 y_pred
和 y_true
中消除所有屏蔽值。
也许最好的答案是 Keras.metrics :
度量函数类似于损失函数,只是在训练模型时不使用度量的评估结果。
训练仅受实施掩蔽的损失函数的影响。
然而,您显示的结果与实际结果不一致,可能会导致误导性结论。
由于训练过程中没有使用到metric,回调函数可以解决。
类似这样的东西(基于 Andrew Ng)。我在这里搜索 0 作为我的屏蔽目标,所有单热编码目标都是 0(没有 class 激活)。
import numpy as np
from keras.callbacks import Callback
from sklearn.metrics import accuracy_score
class categorical_accuracy_no_mask(Callback):
def on_train_begin(self, logs={}):
self.val_acc = []
def on_epoch_end(self, epoch, logs={}):
val_predict = (np.asarray(self.model.predict(self.model.validation_data[0]))).round()
val_targ = self.model.validation_data[1]
indx = np.where(~val_targ.any(axis=2))[0] #find where all targets are zero. That are the masked once as we masked the target with 0 and the data with 666
y_true_nomask = numpy.delete(val_targe, indx, axis=0)
y_pred_nomask = numpy.delete(val_predict, indx, axis=0)
_val_accuracy = accuracy_score(y_true_nomask, y_pred_nomask)
self.val_acc.append(_val_accuracy)
print “ — val_accuracy : %f ” %( _val_accuracy )
return
当然,现在您还可以添加精确召回等。
如果我查看 keras metric,我发现 y_true
和 y_predict
的值在 categorical_accuracy
的每个纪元结束时进行比较 "just" :
def categorical_accuracy(y_true, y_pred):
return K.cast(K.equal(K.argmax(y_true, axis=-1),
K.argmax(y_pred, axis=-1)),
K.floatx())
如何处理屏蔽值?如果我理解正确的话,掩蔽会禁止掩蔽值影响训练,但它仍然会产生对掩蔽值的预测。因此,在我看来,它确实会影响指标。
关于它如何影响指标的更多解释:
在 padding/masking 过程中,我将 y_true
中的 padded/masked 值设置为未使用的 class 例如class 0
。
如果现在 argmax()
正在单热编码 y_true
中寻找最大值,它将只是 return 0,因为总(屏蔽)行是相同的。
我没有 class 0,因为它是我的掩码 value/class,因此 y_pred
和 y_true
肯定具有不同的值,从而降低了准确性。
Keras 指标是否已经考虑到这一点并且我监督了它?
否则,我将不得不创建一个自定义指标或回调创建一个与 categorical_accuracy
类似的指标,并且在比较之前在 y_pred
和 y_true
中消除所有屏蔽值。
也许最好的答案是 Keras.metrics :
度量函数类似于损失函数,只是在训练模型时不使用度量的评估结果。
训练仅受实施掩蔽的损失函数的影响。 然而,您显示的结果与实际结果不一致,可能会导致误导性结论。
由于训练过程中没有使用到metric,回调函数可以解决。
类似这样的东西(基于 Andrew Ng)。我在这里搜索 0 作为我的屏蔽目标,所有单热编码目标都是 0(没有 class 激活)。
import numpy as np
from keras.callbacks import Callback
from sklearn.metrics import accuracy_score
class categorical_accuracy_no_mask(Callback):
def on_train_begin(self, logs={}):
self.val_acc = []
def on_epoch_end(self, epoch, logs={}):
val_predict = (np.asarray(self.model.predict(self.model.validation_data[0]))).round()
val_targ = self.model.validation_data[1]
indx = np.where(~val_targ.any(axis=2))[0] #find where all targets are zero. That are the masked once as we masked the target with 0 and the data with 666
y_true_nomask = numpy.delete(val_targe, indx, axis=0)
y_pred_nomask = numpy.delete(val_predict, indx, axis=0)
_val_accuracy = accuracy_score(y_true_nomask, y_pred_nomask)
self.val_acc.append(_val_accuracy)
print “ — val_accuracy : %f ” %( _val_accuracy )
return
当然,现在您还可以添加精确召回等。