Предположим, у вас есть сеть, представляющая автоэнкодер (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 делает это под капотом при пакетной тренировке.
Буду признателен либо за подсказку, как это обрабатывается керасом (и, следовательно, тензорным потоком) под капотом, либо за правильную версию.
Спасибо!