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

Что такое слой свертки?

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

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

Закладываем фундамент

Прежде чем мы сможем перейти к сути поставленной задачи, мы должны спланировать архитектуру нашего кода. Когда мы впервые создаем наш слой, нам нужно знать размер ядра, длину шага и скорость обучения. Затем мы должны инициализировать веса наших фильтров.

Feed Forward

Теперь мы можем перейти к кормлению. Это относительно просто, так как все, что нам нужно сделать, это свернуть входные данные с помощью нашего фильтра. Для этого мы будем продолжать смещать наши координаты x и y в зависимости от длины нашего шага. По этим координатам x и y мы будем рассматривать точки данных на уровне входных данных, которые перекрываются с нашим фильтром. Затем мы сохраним результат, так как он будет необходим для просмотра результатов нашего сверточного слоя.

Обратное распространение

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

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

Сфера

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

Я надеюсь, что это пошаговое руководство дало некоторое представление о том, как работают сверточные слои и как их можно создавать с нуля. Если вы пытаетесь разрабатывать собственные проекты машинного обучения с нуля, вам может быть полезно использовать сверточные слои и их невероятную способность обрабатывать двумерные данные. Остается еще много деталей о сверточных сетях, которых я не коснулся. Такие вещи, как заполнение, объединение слоев, каналов и т. Д., Являются общими особенностями моделей глубокого обучения, использующих сети свертки. Если вы хотите узнать больше об этих деталях, я бы порекомендовал это видео. Если вы хотите проверить свои навыки в реальных проектах, я рекомендую проверить совместные проекты AI Omdena.