В документе 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])
Не могу понять, как получить доступ к метрикам.
История показателей хранится внутри 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)? или как это будет храниться?
вы могли бы сделать logs.get('mape')
, если бы tf.keras.losses.mape
было передано в model.compile()
в массиве метрик
или, альтернативно, если вы используете tf.keras.losses.mape
в качестве функции потерь, вы можете просто продолжить, как и раньше, с logs.get('loss')
, но (я думаю) вы имеете в виду метрику дополнительный, верно?
да, я имею в виду метрику, например, метрическую карту и mse потерь, потому что карта может быть интересной, но не идеальной для функции потерь. Сейчас попробую и отмечу ваш пост как ответ, большое спасибо
logs.get("accuracy") не работает, я думаю, что по какой-то причине ему нужен "acc", попробую еще раз с этим, а также с "mape".
должен работать с любой меткой, которую метрика имеет в ваших сообщениях журнала. такого рода вещи: Epoch 1/1000 64/64 [==============================] - 272s 4s/step - loss: 0.1836 - accuracy: 0.3647 - precision: 0.0130 - recall: 0.6414 - f1: 0.0250
если он отображается в этих сообщениях, вы должны иметь возможность использовать ярлык, поэтому в приведенном выше примере я мог выбрать из accuracy
, recall
, f1
и т. д.
Обратите внимание, что, как можно увидеть в заключительной части связанного базового примера, будет возвращена не потеря для каждой партии, а средняя потеря в конце этой партии. Например, в партии 3 потери, о которых будет сообщено, представляют собой потери этой партии, усредненные с предыдущими двумя.