Регистрируйте показатели Keras для каждой партии в соответствии с примером Keras для потери

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

Например, для этого кода:

optimizer = Adam()
loss = losses.categorical_crossentropy
metric = ["accuracy"]

model.compile(optimizer=optimizer,
              loss=loss,
              metrics=metric)


class LossHistory(Callback):
    def on_train_begin(self, logs = {}):
        self.losses = []

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

loss_history = LossHistory()

history = model.fit(training_data, training_labels,
                    batch_size=batch_size,
                    epochs=epochs,
                    verbose=2,
                    validation_data=(val_data, val_labels),
                    callbacks=[loss_history])

Не могу понять, как получить доступ к метрикам.

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

Aelius 30.04.2021 10:07
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
1
983
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

История показателей хранится внутри loss_history.losses:

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

Этот метод будет вызываться в конце каждого пакета и просто добавлять метрики потерь в self.losses, поэтому после завершения обучения вы можете просто получить доступ к этому списку напрямую с помощью loss_history.losses.

Я также должен добавить, что если вы хотите, например, включить точность, вы также можете сделать что-то вроде:

class LossHistory(Callback):
    def on_train_begin(self, logs = {}):
        self.losses = []
        self.accuracy= []

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

затем впоследствии получить к нему доступ с помощью:

loss_history.accuracy

Спасибо за быстрый ответ, а что, если бы метрика была чем-то вроде «tf.keras.losses.mape»? Могу ли я сделать то же самое, но с logs.get(tf.keras.losses.mape)? или как это будет храниться?

Alexis Drakopoulos 29.05.2019 10:52

вы могли бы сделать logs.get('mape'), если бы tf.keras.losses.mape было передано в model.compile() в массиве метрик

Stewart_R 29.05.2019 11:16

или, альтернативно, если вы используете tf.keras.losses.mape в качестве функции потерь, вы можете просто продолжить, как и раньше, с logs.get('loss'), но (я думаю) вы имеете в виду метрику дополнительный, верно?

Stewart_R 29.05.2019 11:18

да, я имею в виду метрику, например, метрическую карту и mse потерь, потому что карта может быть интересной, но не идеальной для функции потерь. Сейчас попробую и отмечу ваш пост как ответ, большое спасибо

Alexis Drakopoulos 29.05.2019 11:24

logs.get("accuracy") не работает, я думаю, что по какой-то причине ему нужен "acc", попробую еще раз с этим, а также с "mape".

Alexis Drakopoulos 29.05.2019 11:26

должен работать с любой меткой, которую метрика имеет в ваших сообщениях журнала. такого рода вещи: Epoch 1/1000 64/64 [==============================] - 272s 4s/step - loss: 0.1836 - accuracy: 0.3647 - precision: 0.0130 - recall: 0.6414 - f1: 0.0250

Stewart_R 29.05.2019 11:27

если он отображается в этих сообщениях, вы должны иметь возможность использовать ярлык, поэтому в приведенном выше примере я мог выбрать из accuracy, recall, f1 и т. д.

Stewart_R 29.05.2019 11:28

Другие вопросы по теме