Keras categorical_accuracy指标和填充/掩码值

时间:2018-08-07 14:01:20

标签: python tensorflow keras metrics

如果我查看keras metric,则会发现y_truey_predict的值在每个categorical_accuracy的每个纪元结束时都是“正好”:

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())

我的问题是,是否有人知道如何处理掩码值?如果我理解正确,则遮罩会禁止遮罩值影响训练,但它仍会产生遮罩值的预测。因此,我认为它确实会影响指标。

有关其如何影响指标的更多说明:

在填充/屏蔽过程中,我将y_true中的填充/屏蔽值设置为未使用的类,例如0级。 如果现在argmax()在一个经过热编码的y_true中寻找最大值,则由于总(掩码)行相同,它将仅返回0。 我没有等级0,因为它是我的屏蔽值/等级,因此y_predicty_true当然具有不同的值,从而降低了精度。

在Keras指标中是否已经想到了这一点,我对此进行了监督? 否则,我将不得不创建一个自定义指标或创建与categorical_accuracy类似的指标的回调,并在比较之前在y_perdicty_true中消除所有掩码值。

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

也许最好的答案就是来自Keras.metrics的答案:

度量标准函数与损失函数相似,不同之处在于训练模型时不使用评估度量标准的结果

训练仅受实施掩蔽的损失功能影响。 但是,您显示的结果与实际结果不符,并可能导致误导性结论。

由于在训练过程中未使用该指标,因此回调函数可以解决此问题。

类似这样的东西(基于吴恩达)。我在这里搜索0,因为对于我的被屏蔽目标,所有一键编码目标均为0(未激活任何类)。

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

当然,现在您还可以添加精确调用等。