Keras- потеря на образец в партии
Как получить потерю выборки во время тренировки вместо полной потери? Доступна история потерь, которая дает общую потерю партии, но не дает потери для отдельных образцов.
Если возможно, я хотел бы иметь что-то вроде этого:
on_batch_end(batch, logs, **sample_losses**)
Доступно ли что-то подобное, и если нет, можете ли вы дать несколько советов, как изменить код для поддержки этого?
3 ответа
Насколько мне известно, невозможно получить эту информацию с помощью обратных вызовов, так как потеря уже вычисляется после вызова обратных вызовов (посмотрите на keras/engine/training.py
). Чтобы просто проверить потери, вы можете переопределить функцию потерь, например:
def myloss(ytrue, ypred):
x = keras.objectives.mean_squared_error(ytrue, ypred)
return theano.printing.Print('loss for each sample')(x)
model.compile(loss=myloss)
На самом деле это можно сделать с помощью обратного вызова. Теперь это включено в документацию keras по обратным вызовам. Определите свой собственный обратный вызов, как это
class LossHistory(keras.callbacks.Callback):
def on_train_begin(self, logs={}):
self.losses = []
def on_batch_end(self, batch, logs={}):
self.losses.append(logs.get('loss'))
А затем передайте этот обратный вызов вашей модели. Вы должны получить потери за серию, добавленные к историческому объекту.
Установите размер пакета равным 1 и используйте обратные вызовы в model.evaluate ИЛИ вручную вычислите потерю между предсказанием (model.predict) и достоверностью.
Я также не нашел каких-либо существующих функций в API Keras, которые могли бы возвращать отдельные потери выборки, пока работали в мини-пакете. Кажется, вам нужно взломать керасы или получить прямой доступ к графу тензорного потока.