Потеря кераса становится наном только в конце эпохи - PullRequest
0 голосов
/ 18 октября 2018

Я наблюдаю странное поведение Кераса.Я тренирую маленькую модель, в которой тренировочный убыток становится равным nan only в конце первой эпохи.

Так что, если у меня есть 100 партий, и я прекращаю обучение в партии 99, тогда возобновляюдля других 99 он тренируется нормально.Иначе, когда он достигает конца эпохи, он всегда возвращает nan.

Я использую пользовательскую функцию потерь:

def corr(x, y):
    xc = x - K.mean(x)
    yc = y - K.mean(y)
    r_num = K.mean(xc*yc) 
    r_den = K.std(x)*K.std(y)
    return r_num/r_den

И я попробовал все стандартные приемы, такие как снижение скорости обучения, ограничение нормы и значения градиента и увеличение партииразмер.Только в случае увеличения размера моей партии до чего-то нереального, например, 100 000 (у меня есть 1 миллион точек данных), она действительно продолжается после эпохи, но я хотел бы понять, что происходит в конце, что вызывает это странное поведение.Я также пробовал разные оптимизаторы (в настоящее время использую Adam) и пробовал это на разных системах, чтобы убедиться, что это не проблема на моем одном компьютере.

Мой вход и выход одномерный, а моя модель представлена ​​ниже.

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_7 (InputLayer)         (None, 1)                 0         
_________________________________________________________________
dense_7 (Dense)              (None, 100)               200       
_________________________________________________________________
dense_8 (Dense)              (None, 100)               10100     
_________________________________________________________________
dense_9 (Dense)              (None, 1)                 101       
=================================================================
Total params: 10,401
Trainable params: 10,401
Non-trainable params: 0
_________________________________________________________________

Есть ли у Кераса что-то особенное в конце эпохи?Я не мог найти ничего, кроме стандартного обратного вызова логгера.Я также написал собственный обратный вызов, который оценивает мою модель в каждом пакете и сохраняет результаты, и когда я строю график с течением времени, кажется, что он не взрывается и не делает ничего странного.Похоже, что он постепенно улучшается, а затем тренировка умирает.

1 Ответ

0 голосов
/ 18 октября 2018

Вероятно, это вызвано делением на ноль в функции потерь.Убедитесь, что знаменатель всегда положительный, добавив к нему небольшую константу.Вы можете использовать K.epsilon() для этой цели:

    return r_num / (r_den + K.epsilon())
...