屏蔽值如何影响 Keras 中的指标?

How do masked values affect the metrics in Keras?

如果我查看 keras metric,我发现 y_truey_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_predy_true 肯定具有不同的值,从而降低了准确性。

Keras 指标是否已经考虑到这一点并且我监督了它? 否则,我将不得不创建一个自定义指标或回调创建一个与 categorical_accuracy 类似的指标,并且在比较之前在 y_predy_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

当然,现在您还可以添加精确召回等。