问题描述
我正在使用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,...,[1.6980e+03,[4.9200e+02,[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))