Keras Custom Objective 需要张量评估
Keras Custom Objective requires Tensor Evaluation
我想创建一个自定义 objective 函数来训练 Keras 深度网络。我正在研究不平衡数据的分类,我在 scikit-learn 中经常使用 F1 分数。因此,我想到了反转 F1 指标(1 - F1 分数)以将其用作 Keras 的损失 function/objective,以在训练时将其最小化:
(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 数组?
如果您以 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 在训练时生成训练和验证数据,这也会在训练时打印损失和准确度。
希望这对您有所帮助...
你的问题是在 Theano 中实现不连续 objective 的经典问题。这是不可能的,原因有二:
- F1 分数不连续: here 您可以阅读神经网络训练中 objective 函数的预期结果。 F1-score 不满足这个条件 - 所以它不能用来训练神经网络。
- Tensor 和 Numpy 数组之间没有等价关系:这是一个基本问题。 Theano张量就像学校方程中的x。您不能期望代数变量等效于可以分配给它的任何对象。另一方面 - 作为计算图的一部分 - 应该提供张量运算以计算 objective。如果不是 - 你无法区分它 w.r.t。参数是什么使得大多数常用的神经网络训练方法变得不可能。
我想创建一个自定义 objective 函数来训练 Keras 深度网络。我正在研究不平衡数据的分类,我在 scikit-learn 中经常使用 F1 分数。因此,我想到了反转 F1 指标(1 - F1 分数)以将其用作 Keras 的损失 function/objective,以在训练时将其最小化:
(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 数组?
如果您以 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 在训练时生成训练和验证数据,这也会在训练时打印损失和准确度。
希望这对您有所帮助...
你的问题是在 Theano 中实现不连续 objective 的经典问题。这是不可能的,原因有二:
- F1 分数不连续: here 您可以阅读神经网络训练中 objective 函数的预期结果。 F1-score 不满足这个条件 - 所以它不能用来训练神经网络。
- Tensor 和 Numpy 数组之间没有等价关系:这是一个基本问题。 Theano张量就像学校方程中的x。您不能期望代数变量等效于可以分配给它的任何对象。另一方面 - 作为计算图的一部分 - 应该提供张量运算以计算 objective。如果不是 - 你无法区分它 w.r.t。参数是什么使得大多数常用的神经网络训练方法变得不可能。