Это вторая часть серии, в которой я собираюсь пройти через создание AlexNet и обучение ее на данных CIFAR-10 с нуля. В этой части речь пойдет исключительно о создании AlexNet на основе бумаги.

AlexNet

AlexNet предполагает, что входное изображение имеет размер 224 x 224 x 3, где 3 представляет канал RGB цветного изображения. Поскольку мы собираемся делать это партиями (упомянутыми в части 1), мы создадим четырехмерный заполнитель для входного изображения.

Первый слой свертки

«Первый сверточный слой фильтрует входное изображение 224 × 224 × 3 с 96 ядрами размером 11 × 11 × 3 с шагом 4 пикселя». [1]

В разделе 3.1 статьи отмечается, что AlexNet также применяет нелинейность ReLU после сверточного слоя.

Третий входной параметр функции conv2d - это список [1, 4, 4, 1]. В документации Tensorflow для conv2d описано, что для наиболее распространенного случая одинаковых горизонтальных и вершинных шагов strides = [1, stride, stride, 1]. По сути, это означает, что горизонтальных и вертикальных шагов четыре.

Обратите внимание, что отступ для conv2d установлен на SAME. Чтобы понять, что делает padding, вы можете прочитать этот проницательный ответ на Quora. Короче говоря, если вместо этого для параметра padding установлено значение VALID, форма вывода будет другой, и это повлияет на всю структуру вывода модели.

В разделе 3.3 документа упоминается добавление «Local Response Normalization» после ReLU. К счастью, это функция, предоставляемая Tensorflow, которую мы можем просто добавить после первого слоя свертки. Результатом этого является максимальный пул.

Второй слой свертки

«Второй сверточный слой принимает на входе (нормализованный по отклику и объединенный) вывод первого сверточного слоя и фильтрует его 256 ядрами размером 5 × 5 × 48» [1]

Процесс аналогичен первому сверточному слою. Фактически, нередко объединять conv2d, bias, relu, lrn и max_pool в одну функцию. Однако ради этого урока я стараюсь быть более точным в коде.

Важно отметить, что входным ядром для второго сверточного слоя является [5, 5, 96, 256]. 5, 5 представляет 5 x 5 размер ядра. Однако вместо width48 используется width96. Из архитектурной схемы AlexNet видно, что первый слой свертки разделен на два пути шириной 48 каждый. Их объединение дает ширину 96. Таким образом, второй слой свертки продолжает этот путь, и это можно увидеть на [5, 5, 96, 256]. По сути, форма сверточного слоя для каждого слоя равна [kernel_size, kernel_size, previous layer width, this layer width].

Третий слой свертки

«Третий, четвертый и пятый сверточные слои соединяются друг с другом без каких-либо промежуточных слоев объединения или нормализации. Третий сверточный слой имеет 384 ядра размером 3 × 3 × 256, подключенных к (нормализованным, объединенным) выходам второго сверточного слоя »[1]

Добавление третьего слоя очень похоже на первые два, насколько это касается ReLU. Этот третий уровень не включает lrn или max_pool.

Четвертый и пятый слой свертки

Четвертый и пятый сверточные слои такие же, как и третий, за исключением некоторых различий в весах.

Оба полностью связанных слоя

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

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

Первый полностью связанный слой

Переменная fc_size установлена ​​на 256, так как это соответствует выходным данным последнего уровня ConvNet. Перед тем, как пройти через полностью связанный слой, результат ConvNet сглаживается до одномерного массива с использованием tf.layers.flatten. Как только данные сведены, они становятся простым f(Wx + b) полностью связанным слоем.

Второй полностью связанный слой

Второй полностью связанный слой похож на первый. Описывать особо нечего.

Выходной слой

Последний слой выводит на основе n_classes, который установлен в начале файла. Переменная out - это последний выходной уровень AlexNet.

Источники

[1] Крижевский, Алекс, Илья Суцкевер и Джеффри Э. Хинтон. «Классификация Imagenet с глубокими сверточными нейронными сетями». В Достижения в области нейронных систем обработки информации, стр. 1097–1105. 2012 г.

[2] Джеффрис, Дэниел. Изучение искусственного интеллекта, если вы плохо разбираетесь в математике - P5 - Глубокое обучение и сверточные нейронные сети на простом языке… Hacker Noon. 27 февраля 2017 г. По состоянию на 06 августа 2018 г. https://hackernoon.com/learning-ai-if-you-suck-at-math-p5-deep-learning-and-convolutional-neural-nets-in- plain-english-cda79679bbe3.