python – Keras Custom Objective需要Tensor Evaluation

我想创建一个自定义目标函数来训练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数组对应物?

最佳答案 你的问题是在Theano中实现一个不连续目标的经典问题.由于两个原因,这是不可能的:

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

点赞