Deeplearning.ai: CNN, неделя 2 - Архитектура сверточной нейронной сети
Тематические исследования CNN
Как собрать компоненты CNN?
Учитесь на другом исходном коде / архитектуре CNN.
LeNet-5, AlexNet, VGG, ResNet, нейронная сеть Inception.
Идеи из одного приложения / архитектуры могут передаваться в другие области.
Классическая сеть
Letnet-5: полутоновое изображение чисел (32 x 32) - ›два времени фильтрации и объединения (4 слоя) → 2 слоя полностью связанных → soft max func → подписи. Цель распознавать числа.
AlexNet: почти то же самое, что и LeNet, расширяет больше слоев и параметров в масштабе миллионов.
VGG-16: все Conv и max-poll в сети имеют одинаковые настройки. Но сеть очень большая, больше, чем AlexNet. Интересно, что в то время как максимальное объединение уменьшает размер «тензора» данных, количество фильтров увеличивается в соответствии со шкалой 2.
Реснет
Исчезающая, взрывающаяся информация о градиенте? Как обучить очень глубокую нейронную сеть?
Остаточный блок. Как правило, ввод будет обрабатываться в рамках двух линейных преобразований с активацией Relu. Остаточная сеть копирует вход непосредственно во второй выход преобразования и передает сумму в окончательный Relu.
Остаточная сеть: сложите множество остаточных блоков вместе. Простая очень глубокая сеть постепенно теряет свою надежность после определенной глубины, увеличивая ошибку. Тем не менее, ResNet не столкнулся с этой проблемой.
Почему ResNet работает?
Давайте подумаем о сценарии обучения: если W [l + 1] = 0 и b [l + 1] = 0, то выход a [l + 2] = a [l] и, таким образом, «g» является тождественной функцией. Напомним, что Relu отфильтровывает отрицательные значения a [l].
Тогда в худшем случае ничего не изучая или нулевых весов, сеть все еще может изучить функцию идентификации. Что мы знаем хотя бы одно решение для сети.
В «простой» сети, если W [l + 1] = 0 и b [l + 1] = 0, то a [l + 2] = 0. Конечно, когда вес исчезает, ничего значимого не возвращается. Мы не знаем «худшего» решения.
Тогда «остаток» означает изучение чего-то остаточного / добавленного преобразования фактического ввода, но полезного. «Обычная» сеть просто изучает последовательное преобразование ввода через слои.
Сеть в сети
1 х 1 свертка. Технически, оператор 1x1 conv в матрицах - это усиление входных данных. НО, стоит, когда входными данными являются тензоры, например: изображение РБГ.
Фильтр теперь имеет размер 1x1x «глубина» в соответствии с 3-м измерением тензора данных. Взятие оператора conv (поэлементное умножение в 3-м измерении) → сумма → ReLu. То же самое работает в сети с 1 выходным узлом. Затем он возвращает число при применении свертки 1x1 на одном «желтом» слайде тензора данных. Несмотря на «глубину» тензора, на выходе получаются матрицы: Relu линейного преобразования путем свертки 1x1x «глубины» по тензорным слайдам.
Когда применяется много фильтров, выходная «глубина» - это количество фильтров. Это отклики тензора данных по каждой конфигурации свертки. Или отклики разных линейных преобразований. Это заставляет меня вспомнить о машинном обучении со случайной проекцией, которое использовалось 5 или 6 лет назад, это горячая тема. Или экстремальное машинное обучение :).
Разница с ›1 размером convo в том, что 1x1 сохраняет исходный размер 2 измерения. Затем уменьшается количество каналов, экономя время вычислений. Просто, но крепко :).
Начальная сеть
Сложно выбрать пул, конво или гиперпараметры?
Позвольте сделать все это с входными данными и сложить результаты вместе.
Вычислительная стоимость - проблема. Для 32 фильтров размером 5x5 в примере вход 28x28x192 → компьютер должен произвести вычисление 120 миллионов.
НО свертка 1x1 - наш друг. Let сначала уменьшает количество входных слоев или «глубину», а «начало» выполняет позже. Это «бутылочная» сеть.
Применяя 16 фильтров размером 1x1x192, чтобы уменьшить входной тензор до 28x28x16 и продолжить свертку 5x5….
Расчетное значение уменьшено со 120 миллионов до 2,4 м + 10,0 м = 12,4 м. Уменьшить примерно в 10 раз.
Резюме: сделайте их все + объедините
Начальный модуль
Я заметил, что когда размер фильтра свертки увеличивается, количество фильтров уменьшается. Может быть, больше «действий», чем копание «мелких» деталей.
Можно добавить какой-нибудь узел softmax посередине для выполнения задачи прогнозирования.
Это GoogLeNet
Использование реализации с открытым исходным кодом
Трудно воспроизвести только с публикацией статьи по глубокому обучению.
Проще поискать в Интернете автора реализации.
Google сети «ключевое слово + github»
Передача обучения
Многие открытые наборы данных, исходный код, предварительно обученная модель → могут использовать начальный вес → обучаться в новой области.
Например:
ЕСЛИ вы хотите обучить классификатор классифицирующим изображениям, содержащим «кошачьи» имена Тигра, Мисти и т. Д.
Какой самый быстрый способ обучить его на менее доступных данных о них?
Давайте использовать обученные веса для больших наборов данных, например ImageNet, в качестве входного веса и сетевой структуры для нашей цели. Есть 3 способа его использования:
1. Используйте все обученные веса, «заморозьте» их (без переобучения), используйте выходные данные окончательного сетевого уровня, добавьте полностью связанный слой softmax и изучите его классификационные веса. Таким образом, мы используем расстояние от точки данных до другого «известного» класса в качестве функции для изучения.
2. Практически так же, как и в первом способе, за исключением переобучения некоторых финальных слоев, используйте загруженные веса в качестве начальных точек.
3. Переобучение всей сети с начальными загруженными весами. Конечно, это может произойти, если мы расширяем или модифицируем «структуру» кластера классов, а не находим ее структуру с самого начала.
Резюме: экономьте время и ресурсы, быстрее развивайтесь.
Увеличение данных
Тренировать задачу компьютерного зрения довольно сложно с точки зрения доступности данных. Как создать больше данных?
Меньше данных = больше ручной инженерии / реальной работы человека по обработке данных / извлечению признаков / аннотированию данных / более сложным алгоритмам. Но трансферное обучение может помочь.
Больше данных = простые алгоритмы / учиться на данных / меньше инженерии.
Как получить более высокие оценки?
Объединение: обучайте алгоритмы независимо, усредняйте их результаты.
Мульти-кадрирование во время тестирования: запускайте классификаторы для разных культур тестового изображения и усредняйте результат.