Как стать автором
Обновить

Наглядно о том, как работает свёрточная нейронная сеть

Время на прочтение6 мин
Количество просмотров40K
Всего голосов 19: ↑15 и ↓4+11
Комментарии8

Комментарии 8

Максимальное объединение также выполняет функцию шумоподавления. Оно полностью отбрасывает зашумленные активации, а также устраняет шум вместе с уменьшением размерности.

В общем случае это вовсе не так. Например, для белых символов на черном фоне все ровно наоборот.

Есть заранее известные кернели — выделение границ, обнаружение вертикальных, горизонтальных, наклонных линий. А есть архитектуры, когда сеть при обучении самостоятельно создаёт кернели?

Мне кажется, это было бы перспективно.
Так сеть и должна создавать ядра при обучении. Иначе какой смысл в обучении?
Здесь в статьях про CNN не принято снисходить до математики обучения (потому что сами её привыкли запускать в готовых пакетах и понятия не имеют, как там всё с нуля делается).

Обучается сеть вот так (требуется CUDA).

А вот подробное описание, которого так не хватает подобным статьям.
А именно вот эту статью можете выбросить — она бесполезна, как и все ей подобные здесь.
Как я понял из второй ссылки, свёрточный слой обучается отдельно от других слоёв.
Но ему нужны эталонные данные, с чем минимизировать ошибку. И тут ни одной подсказки, где их взять.

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

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

Может ли сеть научиться сама выделять признаки? Например, каким-то образом прийти к ядру детектирования границ, просто анализируя 100500 фотографий и делая на этом вывод, что на изображениях есть объекты, у которых есть границы.
Нет! Свёрточный слой обучается ровно так же, как и обычные — методом обратного распространения ошибки. Смотрите, в конце нейросети вы вычислили ошибку. А дальше вы её протаскивается в обратном направлении, корректируя как веса обычного слоя, так и ядер свёрток.

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


А если они будут разной толщины и яркости? :)

Может ли сеть научиться сама выделять признаки? Например, каким-то образом прийти к ядру детектирования границ, просто анализируя 100500 фотографий и делая на этом вывод, что на изображениях есть объекты, у которых есть границы.


Она ОБЯЗАНА научится сама выделять признаки. Но объяснить сети про границы вам будет несколько сложно. Её задача — классификация, а не выделение границ. Если вы хотите обучать ядра для выделения границ, вам нужно сразу после всех свёрток не подавать выходы ядер на обычный полносвязный слой, а вычислять ошибку полученной свёртки с тем, что вы хотели получить после всех свёрток (те самые границы в тестовом наборе, строго говоря). И полученную ошибку уже и распространять в обратном направлении. Тогда ядра научатся детектировать границы так, как вам нужно.

и делая на этом вывод, что на изображениях есть объекты, у которых есть границы.


А, я кажется понял, что вы хотите — как в картинках с выделением объектов по контуру с указанием, что это за объект? Нет, это так просто не решается — там, полагаю, комбинация разных методик и алгоритмов (в том числе и свёрточная сеть). Свёрточная сеть может вам сказать, есть ли на показанном фрагменте некий объект (на котором она обучалась) и с какой вероятностью. Но сама она объект не найдёт. Обучается она так: показываем кошечку и ждём выхода с полносвязной сети на выходе «кошечки». Вычисляем ошибку классификации и прогоняем в обратном направлении.
А дальше вы её протаскивается в обратном направлении, корректируя как веса обычного слоя, так и ядер свёрток
Это всё меняет. Я неправильно понял и сделал неправильные выводы. Но обучить сразу 3 слоя это наверное очень сложно, с т.з. на вычислительные затраты.
А, я кажется понял, что вы хотите — как в картинках с выделением объектов по контуру
Нет, я хочу не этого. Я хочу, чтобы на наборе картинок, где есть разные участки — наклонная штриховка, шарики, градиенты и т.д., сеть создала свёртки для обнаружения этих самых особенностей. Но я заранее не знаю паттерны.
Но обучить сразу 3 слоя это наверное очень сложно, с т.з. на вычислительные затраты.


Нет, это не так затратно, как кажется. Просто когда образов десятки тысяч, вот тут и запускается обучение в параллель на многих ядрах CUDA. Иначе ждать будете очень долго. Там программа может обучаться далеко не только горизонталям и вертикалям. Она вполне способна сортировать по категориям и те же кошечек и собачек. Нужны только наборы для обучения и тестирования. Ну и к ней, вообще, нужен сортировщик по полученной нейросети (это прямой прогон по сети без обучения с выбором максимального отклика). :)

еть создала свёртки для обнаружения этих самых особенностей. Но я заранее не знаю паттерны.


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

У вас нулевое заполнение учтено только с одной стороны

Зарегистрируйтесь на Хабре, чтобы оставить комментарий