tensorflow - 深度学习模型损失函数中的输入数据
问题描述
我正在使用 tensorflow 训练 RNN,我在自定义损失函数中使用了一些输入数据。我已将我想在我的自定义损失中使用的输入数据附加到我的目标值,以便当我洗牌时它会相应地洗牌。所以,output_tensor 看起来像这样:
<tf.Tensor: shape=(900, 2), dtype=float64, numpy=
array([[4.0370e+03, 1.0000e+00],
[9.3000e+02, 0.0000e+00],
[2.6290e+03, 0.0000e+00],
...,
[1.6980e+03, 1.0000e+00],
[4.9200e+02, 0.0000e+00],
[1.1202e+04, 1.0000e+00]])>
我将损失函数定义为:
def custom_loss(output_tensor, target_pred):
target_true=output_tensor[:,0]
data_in_loss=output_tensor[:,1]
return tf.math.reduce_mean(data_in_loss*(target_true-target_pred)+(1-data_in_loss)*tf.abs(target_true-target_pred))
我的模型为:
def create_LSTM():
model= tf.keras.models.Sequential([
tf.keras.layers.InputLayer(input_shape=(None,14), dtype=tf.float64, ragged=True),
tf.keras.layers.LSTM(10, return_sequences=True),
tf.keras.layers.LSTM(10),
tf.keras.layers.Dense(1,activation='relu')])
optimizer = tf.keras.optimizers.Adam()
model.compile(loss=custom_loss, optimizer=optimizer, experimental_run_tf_function=False)
return model
model_LSTM = create_LSTM()
history=model.fit(input_tensor, output_tensor, epochs=10, batch_size=32, shuffle=True)
当我运行它时,模型不会收敛。
解决方案
在您的损失函数的某些情况下,损失值是负值。对于 data_in_loss == 1,如果要在预测值小于实际值时惩罚模型,而在其他情况下不惩罚,可以使用零代替负值:
def custom_loss(output_tensor, target_pred):
target_true=output_tensor[:,0]
data_in_loss=output_tensor[:,1]
return tf.math.reduce_mean(data_in_loss*tf.where((target_true-target_pred) <0
,0.,(target_true-target_pred))+(1-
data_in_loss)*tf.abs(target_true-target_pred))
推荐阅读
- command-line - 将单个项目中的 Google BigQuery 数据集导出为 bq 命令行中的列表?
- terraform - 将 cloud_watch_logs_role_arn 添加到 aws_cloudtrail 资源 terraform
- content-security-policy - 用于嵌入 youtube 视频的 CSP
- flutter - 从 Xamarin.Forms 更新到 Flutter 时保存共享首选项
- react-native - 文本必须在其中呈现
零件 - haskell - forkProcess 有多危险?我怎样才能安全地使用它?
- node.js - 如何将值传递给在 TypeScript 中的函数参数中传递名称的属性?
- c# - 需要帮助弄清楚如何在 C# WinForms GUI 中捕获和显示 C 类型的结构值
- r - 根据部分重复的值从 data.frame 中删除行
- php - Imagick PHP Gif 优化中的模糊等效项是什么?