Keras 自定义目标需要张量评估

Posted

技术标签:

【中文标题】Keras 自定义目标需要张量评估【英文标题】:Keras Custom Objective requires Tensor Evaluation 【发布时间】:2017-04-09 20:43:42 【问题描述】:

我想创建一个自定义目标函数来训练 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 分数。我发现需要使用 .eval() 将张量评估为对应的 numpy 数组,这需要 TensorFlow 会话来执行此任务。

我不知道 Keras 使用的会话对象。我尝试使用下面的代码,假设 Keras 后端在某处定义了自己的会话对象,但这也不起作用。

from keras import backend as K

K.eval(y_true)

诚然,这是在黑暗中的一次尝试,因为我现在并不真正了解 Keras 或 Tensorflow 的更深层次的工作原理。

我的问题是:如何将 y_truey_pred 张量评估为对应的 numpy 数组?

【问题讨论】:

【参考方案1】:

您的问题是在 Theano 中实现不连续目标的经典问题。这是不可能的,有两个原因:

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

【讨论】:

这很有帮助!我自己不会想到这些点。谢谢你。我会寻找其他解决方案。【参考方案2】:

如果你有 numpy 数组格式的预测和实际张量,那么我猜你可以使用这个代码 sn-p:

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

希望这会有所帮助...

【讨论】:

也许我误解了你的答案,但我没有 numpy 数组格式的它们。我实际上正在寻找一种将张量 y_truey_pred 转换为 numpy 数组的方法。我希望它们采用 numpy 数组格式,这样我就可以将它们输入 F1 函数,该函数只返回一个标量数。 由 .eval() 方法返回的对象在 numpy 数组中,请检查:***.com/questions/34097281/… 是的,我知道。这就是为什么我在问题的描述中明确表示我已经尝试过这个。但是,如果没有会话对象,它就无法工作,而且我不知道 Keras 默认使用什么会话对象。但是,正如上面的答案所述,无论如何,使用 F1 指标在数学上并不是一种有效的方法,所以我将尝试另一种方法。

以上是关于Keras 自定义目标需要张量评估的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Keras 自定义损失函数中使用张量?

Keras 中带有附加变量输入的自定义损失/目标函数

:keras中的评估指标及自定义评估指标

如何在自定义损失函数中迭代张量?

无法向自定义损失输入数据:渴望执行函数的输入不能是 Keras 符号张量

tf2.0 Keras:使用 RNN 的自定义张量流代码时无法保存权重