Хотите начать разработку сверточных нейронных сетей? Это исчерпывающее руководство по дизайну

машинное обучение Нейронные сети

Из hackernoon Джорджа Сейфа, составленного Heart of the Machine.

Этот пост можно использовать в качестве руководства по проектированию CNN для конкретных задач классификации. Автор представляет методы, используемые в процессе проектирования CNN, с точки зрения типа сети, проектирования архитектуры, обработки данных и обучения передаче, уделяя особое внимание компромиссу между тремя показателями точности, скорости и потребления памяти.

Вы хотите начать классифицировать изображения, но не знаете, с чего начать. Какую предварительно обученную сеть следует использовать? Как я могу изменить сеть, чтобы она соответствовала моим потребностям? Должна ли ваша сеть содержать 20 или 100 слоев? Какие самые быстрые и точные? Это множество вопросов, с которыми вы столкнетесь при выборе лучшей CNN для классификации изображений.

При выборе CNN для классификации изображений необходимо оптимизировать 3 основных показателя: точность, скорость и потребление памяти. Производительность по этим показателям зависит от выбранной вами CNN и любых модификаций, которые вы в нее вносите. Различные сети (такие как VGG, Inception, ResNet и т. д.) имеют разные компромиссы в отношении этих показателей. Кроме того, вы можете изменять эти сетевые структуры, например, вырезая определенные слои, добавляя определенные слои, используя расширенные свертки внутри сети или различные методы обучения сети.

Эту статью можно использовать в качестве руководства по проектированию CNN для конкретных задач классификации. В частности, мы сосредоточимся на 3 основных метриках: точности, скорости и потреблении памяти. Мы рассмотрим множество различных классификационных CNN и изучим их соответствующие свойства по отношению к этим трем метрикам. Мы также рассмотрим возможные модификации этих базовых CNN и то, как эти модификации влияют на эти показатели. Наконец, мы рассмотрим, как оптимально спроектировать CNN для конкретных задач классификации изображений.

Тип сети

Существует явный компромисс между типом сети и этими тремя показателями. Прежде всего, вы обязательно захотите использовать дизайн типа Inception или ResNet. Они новее, чем VGGNet и AlexNet, и предлагают лучший компромисс между скоростью и точностью (как вы можете видеть на графике выше). Джастин Джонсон из Стэнфордского университета провел отличный тест для некоторых из них (GitHub.com/Джей Си Джонсон/От…).

Выбор Inception и ResNet — это действительно компромисс между скоростью и точностью: для точности используйте сверхглубокий ResNet, для скорости используйте Inception.

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

Недавние достижения в общей конструкции CNN предложили несколько отличных альтернатив, которые могут ускорить CNN без большой потери точности и уменьшить потребление памяти. Все эти методы могут быть легко интегрированы в любой из вышеперечисленных классов сверточных нейронных сетей.

  • Мобильные сети (АР Вест V.org/PDF/1801.04…) использует свертки, разделенные по глубине, чтобы значительно сократить объем вычислений и потребление памяти, при этом жертвуя точностью всего от 1% до 5%, в зависимости от экономии вычислительных ресурсов, которую вы хотите достичь.
  • XNOR-Net (АР Вест V.org/PDF/1603.05…) использует бинарную свертку, то есть операция свертки включает только два возможных значения: 0 или 1. При таком дизайне сеть может иметь высокую степень разреженности и может быть легко сжата без использования слишком большого объема памяти.
  • Шаффлнет (АР Вест V.org/PDF/1707.01…) использует свертку групп точек и рандомизацию каналов, чтобы значительно снизить вычислительные затраты при сохранении более высокой точности, чем MobileNets. Фактически, они могут достичь точности ранних классификационных CNN, более чем в 10 раз превышающей скорость вычислений.
  • Обрезка сети (АР Вест V.org/PDF/1605.06…) — это метод удаления некоторых весов CNN, чтобы сократить время выполнения и потребление памяти и, надеюсь, не снизить точность. Чтобы сохранить точность, удаленные детали не должны сильно влиять на конечный результат. Документ по ссылке показывает, как легко это можно сделать с помощью ResNets.

глубина сети

Этот проще: обычно добавление большего количества слоев повышает точность за счет некоторой скорости и памяти. Однако мы поняли, что этот компромисс подвержен незначительному эффекту, то есть чем больше слоев мы добавляем, тем меньший прирост точности достигается за счет добавления каждого слоя.

функция активации

Относительно активационных функций в последнее время ведется много споров. Тем не менее, хорошее эмпирическое правило — начинать с ReLU. Использование ReLU обычно сразу дает хорошие результаты. В отличие от ELU, PReLU или LeakyReLU, требуются некоторые утомительные настройки. Когда вы уверены, что ваш проект может достичь хороших результатов с ReLU, вы можете настроить другие части и настроить их параметры, чтобы попытаться добиться окончательного улучшения точности.

размер ядра свертки

Вы можете подумать, что использование ядер свертки большего размера всегда приводит к максимальной точности за счет скорости и памяти. Однако это не всегда так, поскольку в исследованиях неоднократно обнаруживалось использование более крупных ядер свертки, затрудняющих расхождение сети. Было бы лучше использовать меньшее ядро ​​(например, 3×3). И ResNet, и VGGNet довольно подробно иллюстрируют это. Как показано в этих двух документах, вы также можете использовать ядро ​​​​1 × 1, чтобы уменьшить количество функций.

Атральная извилина

Чтобы иметь возможность использовать пиксели далеко от центра, Dilated Convolution использует пробелы между весами ядра свертки. Это позволяет сети экспоненциально расширять рецептивное поле без увеличения количества параметров, то есть вообще без увеличения потребления памяти. Было показано, что свертки Atrous повышают точность сети с небольшим компромиссом в скорости.

увеличение данных

Вы должны часто выполнять аугментацию данных. Было показано, что использование большего количества данных постоянно повышает производительность, даже до предела (АР Вест V.org/PDF/1707.02…). С увеличением данных вы можете получить больше данных бесплатно. Тип расширения зависит от вашего приложения. Например, если вы работаете над приложением для беспилотных автомобилей, вы можете столкнуться с автомобилями, деревьями и зданиями на дороге, поэтому нет смысла переворачивать изображение по вертикали. Тем не менее, вы обязательно столкнетесь с изменениями освещения из-за изменений погоды или смены сцены, и имеет смысл улучшить данные, изменив освещение и перевернув по горизонтали. Взгляните на эту библиотеку увеличения данных (GitHub.com/Музыкальная драма/IMG AU…)

Обучить оптимизатора

Когда вы, наконец, захотите обучить сеть, есть несколько алгоритмов оптимизации на выбор. Многие говорят, что SGD дает наилучшие результаты с точки зрения точности, и по моему опыту это правда. Однако настройка параметров и параметров скорости обучения утомительна и сложна. С другой стороны, хотя использование адаптивной скорости обучения (например, Adam, Adagrad или Adadelta) проще и быстрее, вы можете не получить такой же оптимальной точности, как SGD.

Лучше, чтобы оптимизатор следовал тому же «стилю», что и функция активации: сначала используйте самую простую, посмотрите, работает ли она, а затем используйте более сложные для настройки и оптимизации. Я лично рекомендую начать с Адама, потому что, по моему опыту, его проще всего использовать: установите не слишком высокую скорость обучения, обычно по умолчанию 0,0001, и вы получите действительно хорошие результаты. Затем вы можете начать с SGD с нуля или даже начать с Адама и доработать его с помощью SGD. По факту,эта статьянайти применение Адам, переключившись на SGD в середине, может добиться наилучшей точности самым простым способом. Взгляните на этот график из статьи:

баланс классов

Во многих случаях вы столкнетесь с несбалансированными данными, особенно в реальных приложениях. Приведем простой пример из реальной жизни: из соображений безопасности вы обучаете глубокую сеть предсказывать, вооружен ли кто-то на входном видео смертоносным оружием. Но в ваших тренировочных данных у вас всего 50 видео людей с оружием и 1000 видео людей без оружия! Если вы сразу обучите свою сеть на этих данных, ваша модель определенно будет предсказывать, что кто-то не вооружен высоким предубеждением.

Проблема дисбаланса классов может быть решена следующими способами:

  • Используйте веса классов в функции потерь. По сути, классы с недостаточным количеством выборок получают более высокие веса в функции потерь, так что неправильная классификация конкретного класса приведет к более высоким ошибкам в функции потерь.
  • Передискретизация: повторите выборку классов, которых недостаточно в обучающей выборке, что помогает уравнять распределение выборок. Этот метод лучше всего работает, когда доступно меньше данных.
  • Понижение дискретизации: вы также можете просто пропустить некоторые обучающие выборки в классе, который содержит слишком много выборок. Этот метод лучше всего работает, когда доступно много данных.
  • Увеличение данных: увеличение данных для данных класса меньшинства.

Оптимизация трансферного обучения

Для большинства приложений более целесообразно использовать трансферное обучение, чем обучать сеть с нуля. Однако выбор заключается в том, какие слои вы хотите удалить, а какие оставить. Это очень зависит от ваших данных. Чем больше ваши данные похожи на данные, используемые предварительно обученной сетью (обычно обучаемой в ImageNet), тем меньше слоев вам потребуется переобучить, и наоборот. Например, предположим, вы хотите обучить сеть различать, содержит ли изображение виноград, поэтому у вас есть большое количество изображений с виноградом и без него. Эти изображения очень похожи на те, которые используются в ImageNet, поэтому вам нужно переобучить только последние несколько слоев, возможно, только полностью связанные слои. Однако, если вы пытаетесь классифицировать, содержит ли изображение космического пространства планету, эти данные и Данные в ImageNet сильно отличаются, поэтому вам также необходимо переобучить последующие сверточные слои. Короче говоря, следует придерживаться следующих принципов:

Суммировать

В этой статье представлено исчерпывающее руководство по проектированию CNN для приложений классификации изображений. Надеюсь, вам понравилось читать эту статью, и вы узнали что-то новое и полезное.

Оригинальная ссылка:hacker noon.com/ah-com pre очень…