Новый уровень развития ImageNet
Сети сжатия и возбуждения (SENets) представляют собой строительный блок для CNN, который улучшает взаимозависимости каналов практически без затрат на вычисления. Они использовались на конкурсе ImageNet в этом году и помогли улучшить результат прошлого года на 25%. Помимо этого огромного повышения производительности, их можно легко добавить к существующим архитектурам. Основная идея такова:
Давайте добавим параметры к каждому каналу сверточного блока, чтобы сеть могла адаптивно регулировать вес каждой карты функций.
Как бы просто это ни звучало, вот и все. Итак, давайте подробнее рассмотрим, почему это так хорошо работает и как мы потенциально можем улучшить любую модель с помощью пяти простых строк кода.
"Почему"
CNN используют свои сверточные фильтры для извлечения иерархической информации из изображений. Нижние слои находят тривиальные элементы контекста, такие как края или высокие частоты, в то время как верхние слои могут обнаруживать лица, текст или другие сложные геометрические формы. Они извлекают все необходимое для эффективного решения задачи.
Все это работает путем объединения пространственной и канальной информации изображения. Различные фильтры сначала находят пространственные характеристики в каждом входном канале, а затем добавляют информацию по всем доступным выходным каналам. Более подробно я рассмотрел эту операцию в другой статье.
Все, что вам сейчас нужно понять, это то, что сеть одинаково взвешивает каждый из своих каналов при создании выходных карт функций. SENets - это все, чтобы изменить это, добавив механизм с учетом содержимого для адаптивного взвешивания каждого канала. В самой простой форме это может означать добавление одного параметра к каждому каналу и присвоение ему линейного скаляра, насколько каждый из них релевантен.
Однако авторы пошли еще дальше. Во-первых, они получают общее представление о каждом канале, сводя карты функций к одному числовому значению. В результате получается вектор размером n, где n равно количеству сверточных каналов. Затем он проходит через двухуровневую нейронную сеть, которая выводит вектор того же размера. Эти значения n теперь можно использовать в качестве весов на исходных картах функций, масштабируя каждый канал в зависимости от его важности.
"Как"
В последнем абзаце вы, возможно, немного потеряли уверенность в том, что это действительно так просто, как я обещал. Итак, давайте сразу перейдем к реализации SE-блока.
def se_block(in_block, ch, ratio=16): x = GlobalAveragePooling2D()(in_block) x = Dense(ch//ratio, activation='relu')(x) x = Dense(ch, activation='sigmoid')(x) return multiply()([in_block, x])
- Функция получает входной сверточный блок и текущее количество каналов, которые у него есть.
- Мы сжимаем каждый канал до одного числового значения, используя средний пул.
- Полностью связанный слой, за которым следует функция ReLU, добавляет необходимую нелинейность. Сложность выходного канала также снижается в определенном соотношении.
- Второй полностью связанный слой, за которым следует сигмовидная активация, дает каждому каналу функцию плавного стробирования.
- Наконец, мы взвешиваем каждую карту функций сверточного блока на основе результата нашей боковой сети.
Эти пять шагов почти не добавляют дополнительных вычислительных затрат (менее 1%) и могут быть добавлены к любой модели.
Авторы показывают, что добавляя SE-блоки в ResNet-50, можно ожидать почти такой же точности, как у ResNet-101. Это впечатляет для модели, требующей лишь половины вычислительных затрат. В документе далее исследуются другие архитектуры, такие как Inception, Inception-ResNet и ResNeXt. Последнее приводит их к модифицированной версии, которая показывает топ-5 ошибок 3,79% на ImageNet.
Что меня больше всего поражает в SENets, так это их простота и эффективность. Возможность практически бесплатно добавить этот подход к любой модели должна заставить вас вернуться к чертежной доске и переобучить все, что вы когда-либо создавали.
Это первая статья из серии резюме, которую я собираюсь написать. Я хочу заставить себя читать и понимать новые статьи, чтобы не отставать от последних тенденций в области искусственного интеллекта. Если вы хотите внести свой вклад или найти ошибки в моих статьях, свяжитесь со мной.