#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))