Входные данные в функцию потерь модели глубокого обучения

#tensorflow #input #deep-learning #loss-function

#tensorflow #ввод #глубокое обучение #функция потерь

Вопрос:

Я обучаю RNN с использованием tensorflow, где я использую некоторые входные данные в моей пользовательской функции потерь. Я прикрепил входные данные, которые я хочу использовать в моем пользовательском loss, к своим целевым значениям, чтобы при перетасовке они перетасовывались соответствующим образом.Итак, 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)
  

Когда я запускаю это, модель не сходится.

Комментарии:

1. Одна из вещей, которые я заметил, это то, что для вашей последней ячейки LSTM установлено значение return_seq = True… ваша модель возвращает 3D-результат, в то время как ваша цель — 2d (это не причина ошибки, а момент, который следует учитывать)

2. Просто исправил это, спасибо. По-видимому, я допустил ошибку при копировании кода. Но, как вы сказали, проблема все еще сохраняется.

3. второй вопрос… знаете ли вы разницу между tf.compat.v1.losses.absolute_difference и MAE?

4. почему вы используете input_shape=(None, 14) как input_shape? какова форма вашего input_tensor?

5. @Marco Cerliani Немного опоздал, но я действительно не понимаю разницы, когда я смотрю на документацию в tf.compat.v1.losses.absolute_difference, там говорится «добавляет abs. потеря различий в процедуре обучения’. Тогда как в tf.keras.потери. MeanAbsoluteError в нем говорится «вычисляет среднее значение абсолютной разницы между метками и прогнозами». Так что, разница только в среднем значении потерь?

Ответ №1:

в некотором сценарии в вашей функции потерь значение потери является отрицательным значением. Для 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))