Keras自定义目标需要张量求值

2024-04-26 03:40:35 发布

您现在位置:Python中文网/ 问答频道 /正文

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

但是,scikitlearn的这个f1_score方法需要numpy数组或列表来计算F1分数。我发现张量需要使用.eval()对其numpy数组进行计算,这需要一个TensorFlow会话来执行此任务。在

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

^{pr2}$

诚然,这是一个黑暗的尝试,因为我现在还不真正理解Keras或Tensorflow a的深层工作原理。在

我的问题是:如何计算y_truey_pred张量,使之与numpy数组对应?


Tags: 数据对象函数numpytrue目标分类数组
2条回答

你的问题是一个典型的问题,在执行一个不连续的目标。这是不可能的,因为有两个原因:

  1. F1分数是不连续的:here在神经网络训练中,你可以从一个目标函数中读出期望值。F1分数不满足这个条件,所以不能用来训练神经网络。在
  2. 张量和Numpy数组之间没有等价性:这是一个基本问题。在学校方程中,no张量类似于x。你不能期望代数变量与它所能分配给的任何对象都是等价的。另一方面,作为计算图的一部分,应提供张量运算来计算目标。如果不是-你就不能区分它的w.r.t.参数,是什么使得神经网络的大多数常规训练方法不可能实现。在

如果您已经用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,我想你可以用这个:

^{pr2}$

其中train_generator和val_generator在培训过程中生成培训和验证数据,并且在培训期间打印损失和精度。在

希望这能帮助。。。在

相关问题 更多 >