Индивидуальная потеря каждого (последнего слоя) вывода модели Keras

При обучении ИНС для регрессии Керас сохраняет потерю обучения / проверки в объекте истории. В случае нескольких выходов на последнем слое с стандартной функцией потерь, т.е. среднеквадратичная ошибка или MSE:

  • что представляют собой потери в сценарии с несколькими выходами? Это среднее / среднее индивидуальных потерь всех выходов или что-то еще?
  • Могу ли я каким-то образом получить доступ к потере каждого вывода отдельно без реализации настраиваемой функции потерь?

Будем очень признательны за любые подсказки.

ИЗМЕНИТЬ ------------

model = Sequential()
model.add(LSTM(10, input_shape=(train_X.shape[1], train_X.shape[2])))
model.add(Dense(2))
model.compile(loss='mse', optimizer='adam')

Перефразируя свой вопрос после добавления фрагмента:

Как рассчитываются потери в случае двух нейронов в выходном слое и что представляют собой результирующие потери? Это средняя потеря для обоих выходов?


person pcko1    schedule 30.08.2018    source источник
comment
Можете привести пример модели? Что вы имеете в виду под множеством выходов на последнем слое?   -  person pitfall    schedule 30.08.2018
comment
Спасибо за комментарий, я добавил образец кода :)   -  person pcko1    schedule 31.08.2018
comment
Для меня я вижу только один вывод, который является выводом плотного слоя. Вы имеете в виду потерю каждого образца в партии?   -  person pitfall    schedule 02.09.2018
comment
есть два выхода, так как в плотном слое есть две единицы. У меня вопрос, как рассчитываются потери как скаляр для данного вектора выходных данных.   -  person pcko1    schedule 02.09.2018


Ответы (2)


Стандартные потери MSE реализованы в Keras следующим образом:

def mse_loss(y_true, y_pred):
    return K.mean(K.square(y_pred - y_true), axis=-1)

Если теперь у вас есть несколько нейронов на выходном слое, вычисленные потери будут просто средним квадратом потерь всех отдельных нейронов.

Если вы хотите отслеживать потерю каждого отдельного вывода, вам нужно написать для этого собственную метрику. Если вы хотите сделать его максимально простым, вы можете просто использовать следующую метрику (она должна быть вложенной, поскольку Keras позволяет метрике иметь входные данные только y_true и y_pred):

def inner_part_custom_metric(y_true, y_pred, i):
    d = y_pred-y_true
    square_d = K.square(d)
    return square_d[:,i] #y has shape [batch_size, output_dim]

def custom_metric_output_i(i):
    def custom_metric_i(y_true, y_pred):
        return inner_part_custom_metric(y_true, y_pred, i)
    return custom_metric_i

Теперь предположим, что у вас есть 2 выходных нейрона. Создайте 2 экземпляра этой метрики:

metrics = [custom_metric_output_i(0), custom_metric_output_i(1)]

Затем скомпилируйте свою модель следующим образом:

model = ...
model.compile(loss='mean_squared_error', optimizer=SGD(lr=0.01), metrics=metrics)
history = model.fit(...)

Теперь вы можете получить доступ к потере каждого отдельного нейрона в объекте истории. Используйте следующую команду, чтобы увидеть, что находится в объекте истории:

print(history.history.keys())
person Stubben    schedule 10.10.2019

print(history.history.keys())

а потом:

print(history.history['custom_metric_i'])

как указывалось ранее, на самом деле будет печатать историю только для одного измерения!

person Manal    schedule 28.03.2020