【发布时间】:2018-05-07 13:07:22
【问题描述】:
我有兴趣在 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)))
问题:现在我的损失随着时间的推移而增加。
【问题讨论】:
-
您写道,您“尝试或多或少地在 tensorflow 中使用它”。你能告诉我们你到目前为止写的代码吗?
-
我已按照您的建议添加了代码以及使用矩阵运算时的代码。感谢您的反馈!
标签: python tensorflow keras