Python 对分类类型敏感的tensorflow中的损失函数

Python 对分类类型敏感的tensorflow中的损失函数,python,tensorflow,keras,Python,Tensorflow,Keras,我感兴趣的是在tensorflow中使用一个自定义损失函数,该函数考虑了错误的类型。例如,我想创建一个函数,它对某种类型的错误(预测类别1,标签为类别3)的权重比其他类型(预测类别2,标签为类别3)的权重更大。原因来自于我目前正在从事的一个项目,在该项目中,课程被明确地排在了第二位(尽管只按顺序排列) 我使用Keras实现了一个类似于()中所示的loss函数。然而,我想知道如何在tensorflow中直接实现类似的东西。目前,我不幸没有运气。我尝试在tensorflow的当前版本中或多或少地使用

我感兴趣的是在tensorflow中使用一个自定义损失函数,该函数考虑了错误的类型。例如,我想创建一个函数,它对某种类型的错误(预测类别1,标签为类别3)的权重比其他类型(预测类别2,标签为类别3)的权重更大。原因来自于我目前正在从事的一个项目,在该项目中,课程被明确地排在了第二位(尽管只按顺序排列)

我使用Keras实现了一个类似于()中所示的loss函数。然而,我想知道如何在tensorflow中直接实现类似的东西。目前,我不幸没有运气。我尝试在tensorflow的当前版本中或多或少地使用它(使用tf.keras.backend调用K.parts),但没有成功(参见代码块1)。我还尝试编写类似于矩阵乘法的东西(使用tf.matmul),但随后我的错误出现了分歧(请参见代码块2)。请注意,ω是一个具有重量的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)))

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

我设法解决了这个问题。如果可以,我会将其标记为已解决(需要等待5个小时)。

您写道“尝试在tensorflow的当前版本中或多或少地使用它”。你能给我们看一下你到目前为止写的代码吗?我已经按照你的建议添加了代码,以及使用矩阵运算时的代码。感谢您的反馈!