我尝试为顺序模型构建自定义损失函数。在这种损失函数中,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
是与model.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
中减去正确的值。 最佳答案
除非您为要使用的模型设置种子,否则即使使用相同的代码和相同的数据,也永远不会获得相同的结果。
关于python - 带有其他输入数据的tensorflow自定义损失函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/60337076/