Хотя это и не вопрос программирования, я не нашел ничего об этой теме на этом сайте.В настоящее время я имею дело с (вариационными) автоэнкодерами ((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)
Для определения ошибки восстановления нового изображения, должен ли я использовать обе части потери тренировки? Интуитивно я бы сказал,скажите «нет» и просто идите с разведкой.
2.) Как определить пороговое значение?Уже реализована функциональность tf, которую я могу использовать?
Если у вас есть хороший источник для чего-либо связанного, пожалуйста, поделитесь ссылкой!
Спасибо!