Эволюция потери сюжета за одну эпоху в Керасе - PullRequest
0 голосов
/ 06 сентября 2018

Есть ли у Keras встроенный метод для вывода (и последующего графика) эволюции потерь во время обучения одной эпохи?

Обычный метод использования функции keras.callbacks.History () может выводить потери для каждой эпохи. Однако в моем случае тренировочный набор довольно велик, и поэтому я прохожу одну эпоху в NN. Поскольку я хотел бы показать эволюцию потери обучения (и разработчика) во время обучения, есть ли способ сделать это?

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

Я использую бэкэнд TensorFlow.

1 Ответ

0 голосов
/ 06 сентября 2018

Вы можете использовать обратный вызов для этой цели.

Используя пример Keras MNIST CNN (не копируя весь код здесь), со следующими изменениями / дополнениями:

from keras.callbacks import Callback

class TestCallback(Callback):
    def __init__(self, test_data):
        self.test_data = test_data

    def on_batch_end(self, batch, logs={}):
        x, y = self.test_data
        loss, acc = self.model.evaluate(x, y, verbose=0)
        print('\nTesting loss: {}, acc: {}\n'.format(loss, acc))

model.fit(x_train, y_train,
          batch_size=batch_size,
          epochs=1,
          verbose=1,
          validation_data=(x_test, y_test),
          callbacks=[TestCallback((x_test, y_test))]
         )

для оценки набора тестов / проверок на каждом конце пакета, мы получаем это:

Train on 60000 samples, validate on 10000 samples
Epoch 1/1

Testing loss: 0.0672039743446745, acc: 0.9781

  128/60000 [..............................] - ETA: 7484s - loss: 0.1450 - acc: 0.9531

/var/venv/DSTL/lib/python3.4/site-packages/keras/callbacks.py:120: UserWarning: Method on_batch_end() is slow compared to the batch update (15.416976). Check your callbacks.
  % delta_t_median)


Testing loss: 0.06644540682602673, acc: 0.9781

  256/60000 [..............................] - ETA: 7476s - loss: 0.1187 - acc: 0.9570

/var/venv/DSTL/lib/python3.4/site-packages/keras/callbacks.py:120: UserWarning: Method on_batch_end() is slow compared to the batch update (15.450395). Check your callbacks.
  % delta_t_median)


Testing loss: 0.06575664376271889, acc: 0.9782

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

class TestCallback2(Callback):
    def __init__(self, test_data):
        self.test_data = test_data

    def on_batch_end(self, batch, logs={}):
        print()  # just a dummy print command

Результаты теперь (вместо callbacks=[TestCallback2((x_test, y_test)) в model.fit()) намного быстрее, но дают только обучающие метрики в конце каждой партии:

Train on 60000 samples, validate on 10000 samples
Epoch 1/1

  128/60000 [..............................] - ETA: 346s - loss: 0.8503 - acc: 0.7188
  256/60000 [..............................] - ETA: 355s - loss: 0.8496 - acc: 0.7109
  384/60000 [..............................] - ETA: 339s - loss: 0.7718 - acc: 0.7396
  [...]

UPDATE

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

from keras.callbacks import Callback

class Histories(Callback):

    def on_train_begin(self,logs={}):
        self.losses = []
        self.accuracies = []

    def on_batch_end(self, batch, logs={}):
        self.losses.append(logs.get('loss'))
        self.accuracies.append(logs.get('acc'))


histories = Histories()

model.fit(x_train, y_train,
          batch_size=batch_size,
          epochs=1,
          verbose=1,
          validation_data=(x_test, y_test),
          callbacks=[histories]
         )

, в результате чего показатели в конце каждой партии во время обучения сохраняются в histories.losses и histories.accuracies, соответственно - вот первые 5 записей каждого:

histories.losses[:5]
# [2.3115866, 2.3008101, 2.2479887, 2.1895032, 2.1491694]

histories.accuracies[:5]
# [0.0703125, 0.1484375, 0.1875, 0.296875, 0.359375]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...