在深度学习模型的损失函数中输入数据

问题描述

我正在使用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))