Pull to refresh

Comments 19

Тоже пришлось повоевать в свое время с автоэнкодерами, MNIST слишком примитивный и при расширении сети на большие разрешения все усложняется. Рабочих примеров кода мало, т. к. автокодировщик для картинок никому не нужен, а с другими данными все очень легко.

На большой глубине (с черно-белыми изображениями) из сигмоидальных функций лучше всего работает гиперболический тангенс, в некоторых случаях даже линейная от -1 до 1. Еще лучше — специализированные лямбда-активации, энкодер можно задать обычными свертками и пулингами, а на декодер приходится писать специализированные шейдеры, для быстрой сходимости и компенсации артефактов.

И да, для больших изображений все-таки автокодировщики не годятся, ту же задачу можно решить намного эффективней и изящней при помощи GAN.
На практике у меня уже вполне себе хорошо сработал кодировщик на tanh, а декодирующий слой на relu. Плюс, и правда, на сверточных сетях все достаточно неплохо себя ведет. Планирую еще эксперименты со SDAE, чтобы еще больше картинку можно было использовать, ибо на 64х64 теряется часть нужных деталей в датасете.

Тут тоже ведь момент, у меня не стоит задачи чтобы он отлично воспроизводил все, мне надо чтобы он даже слегка оверфитнулся на типовые изображения, чтобы потом достаточна ошибка была на нестандартных…

А статья так — раз уж начал копать, можно заодно и оформить текстом )

вообще, автокодировщики в обратную сторону "должны" повторять кодирующую архитектуру, а иначе на вложениях (эмбеддингах) не будет хорошего векторного пространства, которое все любят.

Ко многих туториалах первый кодирующий слой и последний декодирующий имеют разные активации, при этом только размеры симметричные. Сходу, если честно, мне кажется это довольно логичным. А кто такое хорошее векторное пространство? )

если первый и последний то норм.
хорошее векторное пространство, это если взять, например, такую архитектуру
dense(20)
dense(10) // конец кодировщика
dense(20),


и взять представления с промежуточного слоя, то эти вектора (эмбеддинги) имеют хорошие свойства с точки зрения "семантики" данных.


для ваших картинок можно найти среднюю траекторию, сложить или умножить на скаляр, или, если есть кластеры, можно деформировать одно изображение в другое (например как будет себя вести конкретный самолёт, как если бы он сжигал топливо), ну про аномалии сами понимаете.

А кто не согласен, тот может (контр)аргументировать .

ладно, можно не аргументировать. поэкспериментировал, все энкодеры "плохие", неважно, симметричные или нет. все делают переход нелинейно.

Спасибо за описание ваших приключений) Интересно было почитать. Если поделитесь датасетом, думаю я не один благодарен буду.


А вообще энкодеры нужны обычно для того, что вы похоже заготовили на вторую часть статьи.


И еще, касательно приключений. Очень занятный (инженерный) у вас способ сетки отлаживать, надо заметить. В любом случае, лосс это "описание" задачи, которую решает сетка, ну хорошо, что через хоть такие истории, но вы это засветили.


Жду вторую часть.

Спасибо, теперь придется вторую часть писать =)
Датасет выложил вот сюда: gofile.io/?c=jBNJM7
Там и сырые данные и сгенерированные из них картинки двух размеров.

спасибо! скачал)

Просто какие-то линии на черном фоне, причем на картинке 64х64 заполнено порядка 2% точек. Если посмотреть много картинок, то там, конечно, оказывается, что большая часть линий довольно похожа.


Я конечно не «настоящий сварщик», но может попробовать искать аномалии с помощью Нормального распределения (Гаусса)?

image
Скорее всего вы правы и есть более простые методы найти там аномалии. Я даже отдельно упомянул где-то в статье, что мне хотелось волшебства. Т.к. проект «just for fun» — хочется опыта, а не результата =)
А как искать аномалии с помощью распределения? Т.е. вот есть датасет — там бывают очень короткие линии, бывают очень длинные — и это нормально, бывают прямые, а бывают изогнутые. А бывают линии, завернутые в кольцо — и это явная аномалия. Как-то можно с помощью распределения Гаусса такие выловить?

Если идти по пути математики — я бы предположил, что можно изначально каждую координату самолета рассматривать как график, поискать его производную, если она переходит 0 два раза — то есть вероятность аномалии.
Но, опять, из меня тоже тот еще сварщик, поэтому и учусь )
Первый шаг, насколько я знаю — это проверить сами параметры насколько они отвечают нормальному распределению, а именно вывести их на гистограмме и если они не похожи на колокол — сделать логарифмическое трансформирование x = log(x).
Затем вычислить по формуле медиану(мат ожидание) μ и среднеквадратическое отклонение σ.
Посчитать и затем результат сравнить с параметром эпсилон p(x) < ε, где эпсилон это параметр чувствительности уровня погрешности, то есть этим параметром вы сможете отсеять именно изогнутые в кольцо линии. Если результат вычислений меньше эпсилон — это аномалия, p(x) ≥ ε — не аномалия. Эпсилон выставляется вручную.

Я правда немного подумал еще — если у вас в датасете достаточно «нормальных» и «аномальных» данных, а сами аномалии имеют малое количество вариаций (типов), то эффективнее будет использовать обычное обучение с учителем, как вы и сделали.
А что в моем случае будет теми самыми параметрами? С каждым отдельным пикселем так делать?
Как я понял вы изначально работаете с координатами.
Автору в карму. Статью в мемориез. Смотреть новым внимательным взглядом на стандартные вещи — правильно.
А почему изначально принято решение использовать несверточную архитектуру?
Автоэнкодер на сверточных сетях у меня есть рабочий для этой задачи, но мне он кажется серьезным перебором для задачи такого уровня. На задворках сознания крутится ощущение, что для такой элементарной задачи должно быть глубоко плевать на функции активации, сверточная или плоская сетка и вот это все, оно должно работать влет как угодно. Вполне возможно я не прав, вторая часть покажет :D
В сверточной сети меньше параметров, они шарятся между частями изображения — легче избежать оверфита. Внутренние функции активации не должны сильно влиять, да.
Sign up to leave a comment.

Articles