Правильный способ расчета MSE для автоэнкодеров с пакетным обучением - PullRequest
0 голосов
/ 01 мая 2019

Предположим, у вас есть сеть, представляющая автоэнкодер (AE). Давайте предположим, что он имеет 90 входов / выходов. Я хочу тренировать его партиями размером 100. Я буду обозначать мой вход x, а мой вывод y.

Теперь я хочу использовать MSE для оценки эффективности моего тренировочного процесса. Насколько я понимаю, размеры ввода / вывода для моей сети имеют размер (100, 90).

Первая часть расчета MSE выполняется поэлементно, что составляет

(x - y)²

поэтому я снова получаю матрицу размера (100, 90). Для лучшего понимания моей проблемы я произвольно нарисую матрицу того, как это выглядит сейчас:

[[x1 x2 x3 ... x90],    # sample 1 of batch
 [x1 x2 x3 ... x90],    # sample 2 of batch
 .
 .
 [x1 x2 x3 ... x90]]    # sample 100 of batch

С этого момента я наткнулся на различные версии расчета ошибки. Цель всех версий - свести матрицу к скаляру, который затем можно оптимизировать.

Версия 1:

Суммируйте сначала квадратичные ошибки в соответствующем образце, затем вычислите среднее значение для всех образцов, например ::11019*.

v1 = 
[ SUM_of_qerrors_1,        # equals sum(x1 to x90)
  SUM_of_qerrors_2,
  ...
  SUM_of_qerrors_100 ]

result = mean(v1)

Версия 2:

Рассчитать среднее значение квадратичных ошибок для каждой выборки, а затем рассчитать среднее для всех выборок, например ::1010*

v2 = 
[ MEAN_of_qerrors_1,        # equals mean(x1 to x90)
  MEAN_of_qerrors_2,
  ...
  MEAN_of_qerrors_100 ]

result = mean(v2)

Лично я считаю, что версия 1 - это правильный способ сделать это, потому что обычно используемая кроссцентропия рассчитывается таким же образом. Но если я использую версию 1, это не совсем MSE.

Я нашел здесь пример с keras (https://keras.io/examples/variational_autoencoder/),, но, к сожалению, я не смог выяснить, как keras делает это под капотом при пакетной тренировке.

Буду признателен либо за подсказку, как это обрабатывается керасом (и, следовательно, тензорным потоком) под капотом, либо за правильную версию.

Спасибо!

1 Ответ

1 голос
/ 01 мая 2019

Версия 2, то есть вычисление среднего значения квадратичных ошибок для выборки с последующим вычислением среднего значения полученных чисел, является той, которая выполняется в Керас :

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

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

...