带有额外输入数据的 tensorflow 自定义损失函数

Posted

技术标签:

【中文标题】带有额外输入数据的 tensorflow 自定义损失函数【英文标题】:tensorflow custom loss function with additional input data 【发布时间】:2020-06-05 18:58:15 【问题描述】:

我尝试为顺序模型构建自定义损失函数。在这个损失函数中,y_true 和 y_pred 用于计算误差。当我尝试替换 y_true 张量时,模型中的所有真实值都应该是相同的外部真实值,我得到不同的结果(大约是预期值的一半)。 为了更清楚地说明这一点,这是我正在运行的代码的一部分:

import numpy as np
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
import tensorflow as tf
from tensorflow import keras

def custom_loss(y_true, y_pred):
    loss = tf.square(y_pred - y_true) + tf.square(y_pred - y_true)
return loss

model = Sequential()
model.add(Dense(5, input_dim=4, activation='tanh', use_bias=True)) # 1
model.add(Dense(5, activation='tanh')) # 2
model.add(Dense(5, activation='tanh')) # 3
model.add(Dense(5, activation='tanh')) # 4
model.add(Dense(5, activation='tanh')) # 5
model.add(Dense(1))
model.compile(loss=custom_loss, optimizer='adam', metrics=['accuracy'])

当我现在尝试用转换为张量的外部变量替换 y_true 之一时,我没有得到相同的结果。 input_scaledmodel.fit 中也使用了相同的 numpy 数组,所以我希望这两个自定义损失函数会产生相同的输出。

input_as_tensor = tf.convert_to_tensor(np.float32(input_scaled))

def custom_loss(y_true, y_pred):
    loss = tf.square(y_pred - y_true) + tf.square(y_pred - input_as_tensor)
return loss

# ...as above...
hist = model.fit(input_to_fit, input_scaled, epochs=300, callbacks=[tensorboard_callback], validation_split=0.2)

我使用的是 TensorFlow 版本:2.0.0。 任何解释差异的想法将不胜感激。

编辑: 我认识到 Keras 正在以标准批量大小 32 处理我的输入数据,因此我的 input_as_tensor 和大小不同的 y_true 之间存在维度不匹配。我必须弄清楚如何从我的input_as_tensor 中减去正确的值。

【问题讨论】:

【参考方案1】:

除非您为要使用的模型设置种子,否则即使您使用相同的代码和相同的数据,您也永远不会得到相同的结果。

【讨论】:

这很清楚,但是当我运行我的代码十次然后总是得到类似的结果时,我称之为我的正确结果。然后我按照上面描述的方式更改了代码,在我看来应该进行相同的计算,但我的结果总是大约是以前值的一半。

以上是关于带有额外输入数据的 tensorflow 自定义损失函数的主要内容,如果未能解决你的问题,请参考以下文章

带有资源句柄的 TensorFlow 自定义 C++ 操作

自定义 DataGenerator tensorflow 错误“ValueError:无法找到可以处理输入的数据适配器”

Tensorflow训练识别自定义图片

TensorFlow 如何编写自定义 Aitchison 损失

如何在 Tensorflow 2.x Keras 自定义层中使用多个输入?

使用自定义维度输入 tensorflow 或 keras 神经网络