首页 > 解决方案 > 深度学习模型损失函数中的输入数据

问题描述

我正在使用 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, 0.0000e+00],
       ...,
       [1.6980e+03, 1.0000e+00],
       [4.9200e+02, 0.0000e+00],
       [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)

当我运行它时,模型不会收敛。

标签: tensorflowinputdeep-learningloss-function

解决方案


在您的损失函数的某些情况下,损失值是负值。对于 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))

推荐阅读