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_true
和 y_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_true
和 y_pred
转换为 numpy 数组的方法。我希望它们采用 numpy 数组格式,这样我就可以将它们输入 F1 函数,该函数只返回一个标量数。
由 .eval() 方法返回的对象在 numpy 数组中,请检查:***.com/questions/34097281/…
是的,我知道。这就是为什么我在问题的描述中明确表示我已经尝试过这个。但是,如果没有会话对象,它就无法工作,而且我不知道 Keras 默认使用什么会话对象。但是,正如上面的答案所述,无论如何,使用 F1 指标在数学上并不是一种有效的方法,所以我将尝试另一种方法。以上是关于Keras 自定义目标需要张量评估的主要内容,如果未能解决你的问题,请参考以下文章