python - 带有额外输入数据的 tensorflow 自定义损失函数
问题描述
我尝试为顺序模型构建自定义损失函数。在这个损失函数中,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_scaled
是相同的 numpy 数组,也用于 ,model.fit
所以我希望这两个自定义损失函数会产生相同的输出。
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。任何解释差异的想法将不胜感激。
编辑:input_as_tensor
我认识到 Keras 正在处理我的输入数据,标准批量大小为 32,因此我和
之间存在尺寸不匹配y_true
,大小不同。我必须弄清楚如何从我的input_as_tensor
.
解决方案
除非您为要使用的模型设置种子,否则即使您使用相同的代码和相同的数据,您也永远不会得到相同的结果。
推荐阅读
- c++ - 使用 c++ ios::ate 获取错误的文件大小
- r - 如何根据R中的三个不同条件求和
- django - elatic apm,django 集成,用户 ID
- android - 在小部件树 Flutter 中检测到重复的 GlobalKey
- python - Apache Beam ( Cloud DataFlow ) 上的 Join (with side input) 处理函数不在其他部分添加新记录
- javascript - 使用 expo-av 动态要求音频的替代解决方案
- android - Flutter 在点击的索引处更新数据 onClick
- java - 向 LINE Notify 发送消息失败(使用 HttpsURLConnection POST)
- php - PHP未定义变量,但它已定义并具有值
- ipython - 即使在我的电脑中安装了 ipython 和 jupyter,也无法打开 .ipynb 文件