Keras train_step получает номер эпохи

#python #tensorflow #keras

#python #тензорный поток #keras

Вопрос:

Я создал свой собственный класс модели Keras, наследующий от keras.Модель. Тем не менее, у меня есть модифицированный этап обучения, на котором я вручную получаю прямой проход и вычисляю две разные потери, которые я суммирую таким образом, что моя общая потеря равна total_loss = loss1 factor * loss2. Я заметил, что получаю лучшие результаты, если уменьшаю коэффициент во время обучения. Теперь у меня был бы вопрос, каким может быть хорошее решение для этого. Могу ли я каким-либо образом получить доступ к номеру эпохи в методе train_step, чтобы я мог вычислить коэффициент из номера эпохи, или есть какой-либо другой предпочтительный подход?

большое спасибо 🙂

РЕДАКТИРОВАТЬ: если я добавлю счетчик к методу train_step, он не будет увеличиваться во время обучения. Но это происходит только в режиме ожидания. Если я включу режим ожидания, он сработает. Есть идеи о том, как я мог бы заставить его работать в режиме ожидания?

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

1. Здесь та же проблема: мне нужно создать сеть, подобную ProGAN, и я использую keras train_step. На данный момент я не могу найти правильный способ доступа к номеру эпохи.

2. В конце концов я решил это с помощью обратного вызова (который имеет доступ к номеру эпохи). Обратный вызов может изменить переменную в модели. Убедитесь, что переменная является tf.Variable и что для нее установлено значение trainable=False

3. Спасибо, я искал именно это решение и изучал обратные вызовы.

Ответ №1:

Вы могли бы получать лучшие результаты, потому что вы уменьшаете размер шага по мере приближения вашей модели к локальным минимумам на поверхности потерь. Обратите внимание на следующем изображении, как уменьшение размера шага помогает избежать превышения минимума. введите описание изображения здесь

Общий подход к реализации этого заключается в том, чтобы заранее запланировать скорость обучения для обучения в списке, где ваша модель обращается к текущему коэффициенту на основе номера эпохи, т.е. factors[epoch]loss2 . Однако ничто не мешает вам вычислить коэффициент, основанный непосредственно на номере эпохи, например factor = numpy.e*(-epoch) .

Однако ваш подход использования двух потерь для создания полной потери — это не то, что я видел раньше, в вашей модели может быть какое-то другое место, где вы можете напрямую регулировать скорость обучения, а не косвенно делать это, регулируя потери.

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

1. Спасибо за ваш ответ. Теория, лежащая в основе этого материала, — теория вариационных автокодеров. keras.io/examples/generative/vae . Несмотря на то, что моя модель немного отличается, в ней можно увидеть основную идею: общая потеря разлагается на total_loss = reconstruction_loss kl_loss . Но модель работает лучше, если reconstruction_loss взвешен и вес уменьшается с увеличением номера эпохи. Это не имеет большого отношения к скорости обучения.