Это вторая часть серии, в которой я собираюсь пройти через создание 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.