python - 张量流中的损失函数对分类类型敏感
问题描述
我有兴趣在 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)))
问题:现在我的损失随着时间的推移而增加。
解决方案
我设法解决了这个问题。我会尽可能标记为已解决(需要等待 5 小时)。
推荐阅读
- javascript - 为什么有些函数需要在函数名之前声明“函数”?
- php - 在其他页面 PHP MySql 中获取会话数据
- java - RecyclerView 中的网格项未正确显示
- node.js - 与 API 服务器的云存储连接域
- android - Android Studio 未检测到 USB 设备
- haskell - 为什么在 Haskell 函数应用程序中使用逗号会导致不同的类型?
- java - 斯坦福 NLP:加载标记器模型时出错(可能缺少模型文件)
- python - 使用 Django 将 mongoDB 列中的值获取到 HTML 表中
- npm - 安装包后 npm 无法正常工作
- oz - 从一个数字做一个递减列表