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, которые могли бы возвращать отдельные потери выборки, пока работали в мини-пакете. Кажется, вам нужно взломать керасы или получить прямой доступ к графу тензорного потока.

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