我对keras并不陌生,我想用F1分数作为我的指标来训练模型。
我遇到了两件事,一件事是我可以添加回调,另一件事是使用内置的指标功能
Here,它表示指标功能将不会用于训练模型。因此,这是否意味着在编译模型时我可以在metrics
参数中执行任何操作?
具体地说,
model.compile(optimizer='rmsprop',
loss='binary_crossentropy',
metrics=['accuracy'])
在上述情况下,即使将准确性作为指标传递,也不会将其用于训练模型。
第二件事是使用此处定义的回调
import numpy as np
from keras.callbacks import Callback
from sklearn.metrics import confusion_matrix, f1_score, precision_score, recall_score
class Metrics(Callback):
def on_train_begin(self, logs={}):
self.val_f1s = []
self.val_recalls = []
self.val_precisions = []
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]
_val_f1 = f1_score(val_targ, val_predict)
_val_recall = recall_score(val_targ, val_predict)
_val_precision = precision_score(val_targ, val_predict)
self.val_f1s.append(_val_f1)
self.val_recalls.append(_val_recall)
self.val_precisions.append(_val_precision)
print “ — val_f1: %f — val_precision: %f — val_recall %f” %(_val_f1, _val_precision, _val_recall)
return
metrics = Metrics()
然后拟合模型,
model.fit(training_data, training_target,
validation_data=(validation_data, validation_target),
nb_epoch=10,
batch_size=64,
callbacks=[metrics])
我不确定这是否可以在f1分数上训练模型。
答案 0 :(得分:0)
您不能用f1分数训练神经网络。为了在训练过程中向后传播错误,您需要某种函数来告诉您预测与期望值之间的距离。这样的功能就是MSE损失的例子。
另一方面,F1分数只是精度与样本召回率之间的谐波平均值。它没有告诉您,必须朝哪个方向更新权重才能获得更好的模型。它也不会告诉您预测与预期值之间的距离。
您可以做的是在每个纪元后打印F1分数。有关如何执行此操作的示例can be found in this blogpost