我想创建一个用于训练Keras深网的自定义目标函数。我正在研究不平衡数据的分类,我在scikit-learn中使用了很多F1分数。因此,我有了反转F1指标(1 - F1得分)的想法,将其用作Keras的损失函数/目标,以便在训练时最小化:
(from sklearn.metric import f1_score)
def F1Loss(y_true, y_pred):
return 1. - f1_score(y_true, y_pred)
但是,来自scikit-learn的这个f1_score
方法需要numpy数组或列表来计算F1分数。我发现Tensors需要使用.eval()
对其numpy数组对应进行评估,这需要TensorFlow会话来执行此任务。
我不知道Keras使用的会话对象。我尝试使用下面的代码,假设Keras后端在某处定义了自己的会话对象,但这也没有用。
from keras import backend as K
K.eval(y_true)
不可否认,这是一个黑暗中的镜头,因为我现在还不能真正理解Keras或Tensorflow的更深层次的工作。
我的问题是:我如何评估y_true
和y_pred
张量的numpy数组?
答案 0 :(得分:2)
在Theano实施不连续的目标时,您的问题是一个经典问题。由于两个原因,这是不可能的:
答案 1 :(得分:0)
如果您有numpy数组格式的预测和实际张量,那么我猜您可以使用此代码段:
correct_prediction = tf.equal(tf.argmax(actual_tensor,1), tf.argmax(predicted_tensor,1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
在keras中,我认为你可以使用它:
model.fit_generator(train_generator, validation_data=val_generator, nb_val_samples=X_val.shape[0],
samples_per_epoch=X_train.shape[0], nb_epoch=nb_epoch, verbose=1,
callbacks=[model_checkpoint, reduce_lr, tb], max_q_size=1000)
train_generator和val_generator在训练时生成训练和验证数据,这也会在训练时打印出损失和准确性。
希望这会有所帮助......