Почему полная потеря модели глубокого обучения может внезапно стать NaN при использовании Keras (Python)? - PullRequest
0 голосов
/ 18 марта 2020

У меня есть модель Keras (TF2.0 backend), которая использует множественные значения потерь для обратного распространения. Когда обучение инициализируется, модель постепенно начинает учиться (явный признак снижения потерь в разные эпохи).

Однако в некоторые случайные эпохи полная потеря внезапно становится равной NaN. В следующую эпоху некоторые из моих индивидуальных потерь также становятся постоянными на уровне 0,000. Поведение не детерминировано c. Иногда модель проходит целые 100 эпох, не становясь NaN.

Как полная потеря может стать NaN, когда индивидуальные потери являются конечными числами?

Так что мой вопрос более концептуальный, чем программирование. Есть ли причины, по которым это может произойти? Однако очевидным кандидатом на рассмотрение будет функция custom_loss_function, поскольку, как я уже говорил, отдельные потери не стали NaN (см., Например, ниже).

Здесь я показываю потери за 4 случайно выбранные эпохи в тренировочном цикле:

--------------------------------------------------
STARTING EPOCH: 0
        loss:7.612e-01, 
   xout_loss:7.606e-01, 
 yout_0_loss:0.000e+00,  yout_1_loss:1.673e-04,  yout_2_loss:4.342e-04,  yout_3_loss:3.220e-05,
...
--------------------------------------------------
STARTING EPOCH: 10
        loss:3.355e-02, 
   xout_loss:3.349e-02, 
 yout_0_loss:0.000e+00,  yout_1_loss:0.000e+00,  yout_2_loss:6.202e-05,  yout_3_loss:0.000e+00,
...
--------------------------------------------------
STARTING EPOCH: 20
        loss:3.294e-02, 
   xout_loss:3.289e-02, 
 yout_0_loss:0.000e+00,  yout_1_loss:0.000e+00,  yout_2_loss:5.094e-05,  yout_3_loss:0.000e+00,
...
--------------------------------------------------
STARTING EPOCH: 47
        loss:   nan, 
   xout_loss:3.501e-03, 
 yout_0_loss:0.000e+00,  yout_1_loss:0.000e+00,  yout_2_loss:5.997e-05,  yout_3_loss:0.000e+00,
...
--------------------------------------------------
STARTING EPOCH: 48
        loss:   nan, 
   xout_loss:3.240e-02, 
 yout_0_loss:0.000e+00,  yout_1_loss:0.000e+00,  yout_2_loss:0.000e+00,  yout_3_loss:0.000e+00,

Обратите внимание, что я посмотрел на несколько вопросов, касающихся потери, обращающихся к NaN, но в во всех этих случаях у ОП была единичная потеря, которая стала NaN и должна была учитывать функцию потерь. Дело тут в другом. Например. Потеря Keras становится наном только в конце эпохи , Потеря CNN в Keras становится наном в какой-то момент обучения

ОБНОВЛЕНИЕ: Определение функции потери

Для yout_xxx:

def corr_loss(y_true, y_pred):
    y_true = tf.squeeze(y_true)
    y_pred = tf.squeeze(y_pred)

    xm = y_true - tf.reduce_mean(y_true, axis=1, keepdims=True)
    ym = y_pred - tf.reduce_mean(y_pred, axis=1, keepdims=True)

    c_num = tf.reduce_sum(tf.multiply(xm, ym), axis=1)
    c_den = tf.math.sqrt(tf.multiply(tf.reduce_sum(tf.math.square(xm), axis=1), tf.reduce_sum(tf.math.square(ym), axis=1)))

    r = c_num / (c_den+tf.keras.backend.epsilon())
    loss = 1 - tf.math.square(r)
    return loss

Для xout_loss:

tf.keras.losses.mean_squared_error(y_true, y_pred)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...