Keras Custom Objective需要Tensor Evaluation

时间:2016-11-25 12:30:10

标签: python machine-learning tensorflow neural-network keras

我想创建一个用于训练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_truey_pred张量的numpy数组?

2 个答案:

答案 0 :(得分:2)

在Theano实施不连续的目标时,您的问题是一个经典问题。由于两个原因,这是不可能的:

  1. F1分数不连续: here您可以阅读神经网络训练中目标函数的预期结果。 F1得分并不满足这个条件 - 所以它不能用于训练神经网络。
  2. Tensor和Numpy阵列之间没有等价关系:这是一个根本问题。 Theano张量与学校方程中的 x 类似。您不能指望代数变量等同于它可以分配给它的任何对象。另一方面 - 作为计算图的一部分 - 应该提供张量操作以计算目标。如果不是 - 你无法区分它w.r.t.参数是什么使大多数通常的神经网络训练方式都不可能。

答案 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在训练时生成训练和验证数据,这也会在训练时打印出损失和准确性。

希望这会有所帮助......