如果我查看keras metric,则会发现y_true
和y_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_predict
和y_true
当然具有不同的值,从而降低了精度。
在Keras指标中是否已经想到了这一点,我对此进行了监督?
否则,我将不得不创建一个自定义指标或创建与categorical_accuracy类似的指标的回调,并在比较之前在y_perdict
和y_true
中消除所有掩码值。
感谢您的帮助。
答案 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
当然,现在您还可以添加精确调用等。