python - 多路输出的单路损耗
问题描述
我想在 Keras/Tensorflow 中创建一个具有多个输出的神经网络。我想创建一个 SINGLE 损失函数,它考虑所有输出并相应地计算损失。我需要这样做,因为输出是相互关联的。我怎样才能做到这一点?我读到了将所有输出连接到单个密集层,然后计算该层的损失。有没有更方便的方法来实现多个输出的单一损失?
我在想类似的东西:
def my_custom_loss(y_true_0, ..., y_true_n, y_pred_0, ..., y_pred_n):
return something
y_true_0, ..., y_true_n
和y_pred_0, ..., y_pred_n
应该是 n 个输出(密集)层的真实/预测输出。
解决方案
您可以根据变量的性质实现损失函数。下面给出一些标准的:
如果它们只是数字(而不是概率):MSE 损失
def my_custom_loss(y_true_0, ..., y_true_n, y_pred_0, ..., y_true_n):
y_true = tf.stack([y_true_0,...y_true_n], axis=0)
y_pred = tf.stack([y_pred_0,...y_pred_n], axis=0)
something = tf.losses.mean_squared_error(y_true, y_pred)
return something
或绝对差异损失
def my_custom_loss(y_true_0, ..., y_true_n, y_pred_0, ..., y_true_n):
y_true = tf.stack([y_true_0,...y_true_n], axis=0)
y_pred = tf.stack([y_pred_0,...y_pred_n], axis=0)
something = tf.losses.absolute_difference(y_true, y_pred)
return something
如果它们是一个热向量(有效概率):
def my_custom_loss(y_true_0, ..., y_true_n, y_pred_0, ..., y_true_n):
y_true = tf.stack([y_true_0,...y_true_n], axis=0)
y_pred = tf.stack([y_pred_0,...y_pred_n], axis=0)
something = tf.reduce_mean(tf.keras.losses.binary_crossentropy(y_true, y_pred))
return something
如果它们是零和一(无效概率):
def my_custom_loss(y_true_0, ..., y_true_n, y_pred_0, ..., y_true_n):
y_true = tf.stack([y_true_0,...y_true_n], axis=0)
y_pred = tf.stack([y_pred_0,...y_pred_n], axis=0)
something = tf.reduce_mean(tf.keras.losses.binary_crossentropy(y_true, y_pred), from_logits=True)
return something
它不仅限于这些。你可以创建自己的损失函数,只要它是可微的。
推荐阅读
- java - 我的 expandableListview 没有扩展
- c# - 如何使用 cron 表达式中的 asp.net mvc Web 应用程序创建 Windows 调度程序作业?
- php - Android表情转HTML格式
- php - session 在codeigniter中从HTTP切换到HTTPS时不存储
- ios - 从 Android 调用 Sinch Callkit 项目?
- android - 如何将 firebase 测试实验室与 circleci 集成
- c# - 无法在 while 循环 C# 中激活布尔值或停用它们
- c# - Url.Action 未命中控制器方法
- realm - 如何将 Realm Cloud 匿名用户转换为真实用户
- javascript - 使用 python Crypto.Cipher 进行 AES 解密