首页 > 解决方案 > 张量流中的损失函数对分类类型敏感

问题描述

我有兴趣在 tensorflow 中使用考虑错误类型的自定义损失函数。例如,我想创建一个函数,它比其他类型的错误(预测类 1,标签为类 3)更重(预测类 2,标签为类 3)。原因源于我正在从事的一个当前项目,其中课程的排名很明确(尽管只是按顺序排列)。

我已经使用 Keras实现了一个类似于 ( https://github.com/keras-team/keras/issues/2115#issuecomment-204060456 ) 中所示的损失函数。但是,我想知道如何在 tensorflow 中直接实现类似的东西。目前,不幸的是我没有运气。我尝试在 tensorflow 中或多或少地使用它(使用 tf.keras.backend 调用 K. 部分),但没有运气(参见代码块 1)。我也尝试用矩阵乘法(使用 tf.matmul)编写类似的东西,但后来我的错误发散了(参见代码块 2)。请注意,Omega 是一个带有权重的 K x K 矩阵。

对于 K 个类别,我希望总共有 K^2​​ 个不同的权重,以解决每种类型的分类和错误分类。

任何帮助是极大的赞赏!这是我第一次在 stackoverflow 上提问,所以如果我做错了什么,请务必让我知道。

代码 1:

number_of_classes = 3
modifier = tf.keras.backend.zeros_like(output_softmax[:, 0])
y_pred_max = tf.keras.backend.max(output_softmax, axis = 1)
y_pred_max = tf.keras.backend.expand_dims(y_pred_max, 1)
y_pred_max_mat = tf.keras.backend.equal(output_softmax, y_pred_max)
for i, j in product(range(number_of_classes), range(number_of_classes)):
    modifier += (tf.keras.backend.cast(Omega[j, i], tf.keras.backend.floatx()) *
                 tf.keras.backend.cast(y_pred_max_mat[:, i], tf.keras.backend.floatx()) * tf.keras.backend.cast(y_[:, j], tf.keras.backend.floatx()))
loss =  tf.keras.backend.categorical_crossentropy(output_softmax, y_) * modifier

问题:现在我在给定时期的损失不是一个数字,而是一个矩阵。在检查 early stop 时(我跟踪每个 epoch 的 loss,并将当前 loss 与最小 loss 进行比较),出现以下错误:

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()`

代码 2:

loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(labels = y_, logits = output))
mod_loss = tf.reduce_mean(tf.multiply(loss, tf.matmul(tf.matmul(y_, Omega), output_softmax, transpose_b=True)))

问题:现在我的损失随着时间的推移而增加。

标签: pythontensorflowkeras

解决方案


我设法解决了这个问题。我会尽可能标记为已解决(需要等待 5 小时)。


推荐阅读