张量流中的损失函数对分类类型敏感

时间:2018-05-07 13:07:23

标签: python tensorflow keras

我感兴趣在tensorflow中使用自定义丢失函数,该函数考虑了错误类型。例如,我想创建一个函数来衡量某种类型的错误(预测类1,标签为3级)比其他错误(预测类2标签为3级)。原因在于我正在进行的一个当前项目,其中课程的排名明确(尽管只是按顺序排列)。

我使用Keras实现了与(https://github.com/keras-team/keras/issues/2115#issuecomment-204060456)中显示的丢失功能类似的功能。但是,我想知道如何在tensorflow中直接实现类似的东西。目前,我遗憾地没有运气。我尝试在tensorflow中使用或多或少使用它(使用tf.keras.backend调用K. parts),但没有运气(参见代码块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

问题:现在我对给定时代的损失不是一个数字,而是一个矩阵。检查提前停止时(我跟踪每个时期的损失,并将当前损失与最小损失进行比较),发生以下错误:

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)))

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

1 个答案:

答案 0 :(得分:0)

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