Практическое определение порога аномалии в (вариационных) автоэнкодерах - PullRequest
0 голосов
/ 29 мая 2018

Хотя это и не вопрос программирования, я не нашел ничего об этой теме на этом сайте.В настоящее время я имею дело с (вариационными) автоэнкодерами ((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, которую я могу использовать?

Если у вас есть хороший источник для чего-либо связанного, пожалуйста, поделитесь ссылкой!

Спасибо!

1 Ответ

0 голосов
/ 29 мая 2018

У меня недавно была похожая проблема.VAE очень хорошо проецируют данные больших размеров в скрытое пространство меньших размеров.Изменение скрытого вектора и подача его в часть декодера создает новые выборки.

Надеюсь, я правильно понял ваш вопрос, вы пытаетесь выполнить обнаружение аномалий с помощью части кодера в скрытом пространстве меньшего размера?

Полагаю, вы обучили VAE на MNIST.Что вы можете сделать, так это получить все скрытые векторы MNIST-цифр и сравнить латентный вектор вашей новой цифры через евклидово расстояние до них.Порог будет максимальным расстоянием, установленным вами.

Код будет выглядеть примерно так:

x_mnist_encoded = encoder.predict(x_mnist, batch_size=batch_size) #array of MNIST latent vectors
test_digit_encoded = encoder.predict(x_testdigit, batch_size=1) #your testdigit latent vector

#calc the distance
from scipy.spatial import distance
threshold = 0.3 #min eucledian distance

for vector in x_mnist_encoded:
 dst = distance.euclidean(vector,test_digit_encoded[0])

 if dst <= threshold:
  return True

Код VAE от https://blog.keras.io/building-autoencoders-in-keras.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...