Как я могу видеть прогресс моей модели с течением времени вместо эпох? - PullRequest
0 голосов
/ 06 октября 2019

Я тренирую нейронные сети, используя Tensorflow-Keras. Мой текущий код настроен так, чтобы использовать CSVLogger для отслеживания прогресса в разные эпохи и использовать pyplot matplotlib для построения графиков тренировок в сравнении с проверкой точности и потерь каждого. Для обоих графиков значения построены и для эпохи #.

Можно ли вместо этого построить график прогресса тренировки моей модели? То есть вместо того, чтобы указывать в качестве оси x точку epoch #, можно ли вместо этого иметь время выполнения?

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

Таким образом, вместо числа эпох оно может быть более информативнымдля меня, чтобы сравнить, сколько времени требуется для того, чтобы потеря и точность разных моделей сходились, и для ранней остановки. В конце концов, если модель A может достичь наилучшего значения val_loss 0,25 в 20 эпохах перед остановкой со скоростью 2 минуты на одну эпоху, действительно ли я хочу выбрать этот вариант по сравнению с моделью B, которая достигает наилучшего значения val_loss 0,275 в 50 эпохах перед остановкой? со скоростью 20 секунд за эпоху?

1 Ответ

0 голосов
/ 06 октября 2019

Да, это возможно. Для этого вы можете создать свой собственный Keras Callback . Для этого вам необходимо расширить класс Callback . Я создал очень простой обратный вызов для демонстрации того, как вы можете отслеживать данные и время для каждой эпохи, а также оценки модели.

# Import dependencies
import datetime
from tensorflow.keras import callbacks

# Create new callback
class MyHistory(callbacks.Callback):
    """Adapted from https://github.com/keras-team/keras/blob/master/keras/callbacks/callbacks.py#L614"""

    def on_train_begin(self, logs=None):
        self.epoch = []
        self.timestamps = []
        self.history = {}

    def on_epoch_end(self, epoch, logs=None):
        logs = logs or {}
        self.epoch.append(epoch)
        self.timestamps.append(datetime.datetime.now())
        for k, v in logs.items():
            self.history.setdefault(k, []).append(v)

# Instantiate callback
myHistory = MyHistory()

# Train model using callback
model.fit(..., callbacks=[myHistory])

# Print timestamps & losses
print(myHistory.timestamps)
print(myHistory.history['loss'])

Вы придерживаетесь аналогичного подхода для сохранения метки времени в формате CSV. расширяя [CSVLogger][3] аналогичным образом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...