Комментарии 8
Максимальное объединение также выполняет функцию шумоподавления. Оно полностью отбрасывает зашумленные активации, а также устраняет шум вместе с уменьшением размерности.
В общем случае это вовсе не так. Например, для белых символов на черном фоне все ровно наоборот.
+1
Есть заранее известные кернели — выделение границ, обнаружение вертикальных, горизонтальных, наклонных линий. А есть архитектуры, когда сеть при обучении самостоятельно создаёт кернели?
Мне кажется, это было бы перспективно.
Мне кажется, это было бы перспективно.
0
Так сеть и должна создавать ядра при обучении. Иначе какой смысл в обучении?
Здесь в статьях про CNN не принято снисходить до математики обучения (потому что сами её привыкли запускать в готовых пакетах и понятия не имеют, как там всё с нуля делается).
Обучается сеть вот так (требуется CUDA).
А вот подробное описание, которого так не хватает подобным статьям.
А именно вот эту статью можете выбросить — она бесполезна, как и все ей подобные здесь.
Здесь в статьях про CNN не принято снисходить до математики обучения (потому что сами её привыкли запускать в готовых пакетах и понятия не имеют, как там всё с нуля делается).
Обучается сеть вот так (требуется CUDA).
А вот подробное описание, которого так не хватает подобным статьям.
А именно вот эту статью можете выбросить — она бесполезна, как и все ей подобные здесь.
+1
Как я понял из второй ссылки, свёрточный слой обучается отдельно от других слоёв.
Но ему нужны эталонные данные, с чем минимизировать ошибку. И тут ни одной подсказки, где их взять.
Изучив первую ссылку, я нашёл тестовый набор с вертикальными и горизонтальными линиями.
Но блин! Если я знаю, что мне нужна свёртка, которая детектирует вертикальные и горизонтальные линии, мне проще ядро написать явно — вручную и без ошибок.
Может ли сеть научиться сама выделять признаки? Например, каким-то образом прийти к ядру детектирования границ, просто анализируя 100500 фотографий и делая на этом вывод, что на изображениях есть объекты, у которых есть границы.
Но ему нужны эталонные данные, с чем минимизировать ошибку. И тут ни одной подсказки, где их взять.
Изучив первую ссылку, я нашёл тестовый набор с вертикальными и горизонтальными линиями.
Но блин! Если я знаю, что мне нужна свёртка, которая детектирует вертикальные и горизонтальные линии, мне проще ядро написать явно — вручную и без ошибок.
Может ли сеть научиться сама выделять признаки? Например, каким-то образом прийти к ядру детектирования границ, просто анализируя 100500 фотографий и делая на этом вывод, что на изображениях есть объекты, у которых есть границы.
0
Нет! Свёрточный слой обучается ровно так же, как и обычные — методом обратного распространения ошибки. Смотрите, в конце нейросети вы вычислили ошибку. А дальше вы её протаскивается в обратном направлении, корректируя как веса обычного слоя, так и ядер свёрток.
А если они будут разной толщины и яркости? :)
Она ОБЯЗАНА научится сама выделять признаки. Но объяснить сети про границы вам будет несколько сложно. Её задача — классификация, а не выделение границ. Если вы хотите обучать ядра для выделения границ, вам нужно сразу после всех свёрток не подавать выходы ядер на обычный полносвязный слой, а вычислять ошибку полученной свёртки с тем, что вы хотели получить после всех свёрток (те самые границы в тестовом наборе, строго говоря). И полученную ошибку уже и распространять в обратном направлении. Тогда ядра научатся детектировать границы так, как вам нужно.
А, я кажется понял, что вы хотите — как в картинках с выделением объектов по контуру с указанием, что это за объект? Нет, это так просто не решается — там, полагаю, комбинация разных методик и алгоритмов (в том числе и свёрточная сеть). Свёрточная сеть может вам сказать, есть ли на показанном фрагменте некий объект (на котором она обучалась) и с какой вероятностью. Но сама она объект не найдёт. Обучается она так: показываем кошечку и ждём выхода с полносвязной сети на выходе «кошечки». Вычисляем ошибку классификации и прогоняем в обратном направлении.
Но блин! Если я знаю, что мне нужна свёртка, которая детектирует вертикальные и горизонтальные линии, мне проще ядро написать явно — вручную и без ошибок.
А если они будут разной толщины и яркости? :)
Может ли сеть научиться сама выделять признаки? Например, каким-то образом прийти к ядру детектирования границ, просто анализируя 100500 фотографий и делая на этом вывод, что на изображениях есть объекты, у которых есть границы.
Она ОБЯЗАНА научится сама выделять признаки. Но объяснить сети про границы вам будет несколько сложно. Её задача — классификация, а не выделение границ. Если вы хотите обучать ядра для выделения границ, вам нужно сразу после всех свёрток не подавать выходы ядер на обычный полносвязный слой, а вычислять ошибку полученной свёртки с тем, что вы хотели получить после всех свёрток (те самые границы в тестовом наборе, строго говоря). И полученную ошибку уже и распространять в обратном направлении. Тогда ядра научатся детектировать границы так, как вам нужно.
и делая на этом вывод, что на изображениях есть объекты, у которых есть границы.
А, я кажется понял, что вы хотите — как в картинках с выделением объектов по контуру с указанием, что это за объект? Нет, это так просто не решается — там, полагаю, комбинация разных методик и алгоритмов (в том числе и свёрточная сеть). Свёрточная сеть может вам сказать, есть ли на показанном фрагменте некий объект (на котором она обучалась) и с какой вероятностью. Но сама она объект не найдёт. Обучается она так: показываем кошечку и ждём выхода с полносвязной сети на выходе «кошечки». Вычисляем ошибку классификации и прогоняем в обратном направлении.
0
А дальше вы её протаскивается в обратном направлении, корректируя как веса обычного слоя, так и ядер свёртокЭто всё меняет. Я неправильно понял и сделал неправильные выводы. Но обучить сразу 3 слоя это наверное очень сложно, с т.з. на вычислительные затраты.
А, я кажется понял, что вы хотите — как в картинках с выделением объектов по контуруНет, я хочу не этого. Я хочу, чтобы на наборе картинок, где есть разные участки — наклонная штриховка, шарики, градиенты и т.д., сеть создала свёртки для обнаружения этих самых особенностей. Но я заранее не знаю паттерны.
0
Но обучить сразу 3 слоя это наверное очень сложно, с т.з. на вычислительные затраты.
Нет, это не так затратно, как кажется. Просто когда образов десятки тысяч, вот тут и запускается обучение в параллель на многих ядрах CUDA. Иначе ждать будете очень долго. Там программа может обучаться далеко не только горизонталям и вертикалям. Она вполне способна сортировать по категориям и те же кошечек и собачек. Нужны только наборы для обучения и тестирования. Ну и к ней, вообще, нужен сортировщик по полученной нейросети (это прямой прогон по сети без обучения с выбором максимального отклика). :)
еть создала свёртки для обнаружения этих самых особенностей. Но я заранее не знаю паттерны.
Сеть создаст не свёртки для обнаружения этих участков, а свёртки, соответствующие её представлению о том, что она считает важным, а что нет. При этом эти свёртки зависят от начального состояния сети. И работают они в паре с обычной сетью. То есть, вы получите рабочую сеть, но ядра не будут соответствовать вашему представлению о том, как бы вы сделали такое обучение.
+1
У вас нулевое заполнение учтено только с одной стороны
0
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Наглядно о том, как работает свёрточная нейронная сеть