Хотя это не совсем вопрос программирования, я не нашел ничего по этой теме на этом сайте. В настоящее время я имею дело с (вариационными) автокодерами ((V) AE) и планирую использовать их для обнаружения аномалий. В целях тестирования я реализовал VAE в тензорном потоке для обнаружения рукописных цифр.
Обучение прошло успешно, и восстановленные изображения очень похожи на оригиналы. Но для фактического использования автоэнкодера я должен использовать какую-то меру, чтобы определить, является ли новое изображение, подаваемое в автоэнкодер, цифрой или нет, сравнивая его с пороговым значением.
На данный момент у меня есть два основных вопроса:
1.) Для тренировки я использовал проигрыш, состоящий из двух составляющих. Первая - это ошибка реконструкции, которая является функцией кроссэнтропии:
# x: actual input
# x_hat: reconstructed input
epsilon = 1e-10 # <-- small number for numeric stability within log
recons_loss = - f.reduce_sum( x * tf.log( epsilon + x_hat) + (1 - x) * tf.log( epsilon + 1 - x_hat),
axis=1)
Второй - это KL-дивергенция, которая является мерой того, насколько похожи два распределения вероятностей, поскольку мы требуем, чтобы пространство скрытых переменных было распределением, аналогичным гауссовскому.
# z_mean: vector representing the means of the latent distribution
# z_log_var: vector representing the variances of the latent distribution
KL_div = -0.5 * tf.reduce_sum( 1 + z_log_var - tf.square(z_mean) - tf.exp(z_log_var),
axis=1)
Должен ли я использовать обе части потери при обучении для определения ошибки реконструкции нового изображения? Интуитивно я бы сказал «нет» и просто выбрал recon_loss.
2.) Как определить пороговое значение? Есть ли уже реализованная функция tf, которую я могу использовать?
Если у вас есть хороший источник для чего-либо, поделитесь ссылкой!
Спасибо!