Введение:

Алекс Крижевский, Джеффри Хинтон и Илья Суцкевер создали архитектуру нейронной сети под названием «AlexNet» и выиграли соревнование по классификации изображений (ILSVRC) в 2012 году. Они обучили свою сеть на 1,2 миллиона изображений с высоким разрешением в 1000 различных классов с 60 миллионами параметров и 650 000 нейронов. . Обучение проводилось на двух графических процессорах с концепцией разделения слоев, потому что в то время графические процессоры были немного медленными.

Оригинал статьи доступен на странице Классификация ImageNet с глубокими свёрточными нейронными сетями.

Также проверьте: Сверточная нейронная сеть и LeNet-5

Архитектура AlexNet:

Архитектура AlexNet состоит из пяти сверточных уровней, за некоторыми из которых следуют уровни максимального объединения, затем три полносвязных уровня и, наконец, классификатор softmax на 1000 путей.

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

Первый слой:

Входные данные для AlexNet представляют собой RGB-изображение размером 227x227x3, которое проходит через первый сверточный слой с 96 картами признаков или фильтрами размером 11x11 и шагом 4. Размеры изображения изменяются до 55x55x96.

Затем AlexNet применяет максимальный слой пула или слой субдискретизации с размером фильтра 3×3 и шагом, равным двум. Результирующие размеры изображения будут уменьшены до 27x27x96.

Второй уровень:

Далее идет второй сверточный слой с 256 картами признаков размером 5×5 и шагом 1.

Затем снова есть максимальный объединяющий слой с размером фильтра 3 × 3 и шагом 2. Этот слой такой же, как и второй слой, за исключением того, что он имеет 256 карт объектов, поэтому выходные данные будут уменьшены до 13x13x256.

Третий, четвертый и пятый уровни:

Третий, четвертый и пятый слои представляют собой сверточные слои с размером фильтра 3×3 и шагом, равным единице. В первых двух использовалось 384 карты объектов, а в третьем — 256 фильтров.

За тремя сверточными слоями следует слой максимального объединения с размером фильтра 3 × 3, шагом 2 и 256 карт объектов.

Шестой слой:
Выходные данные сверточного слоя выравниваются через полностью связанный слой с 9216 картами объектов, каждая из которых имеет размер 1 × 1.

Седьмой и восьмой слои
Далее идут два полносвязных слоя с 4096 единицами.

Выходной слой:
Наконец, есть выходной слой softmax ŷ с 1000 возможных значений.

Код Python для реализации модели AlexNet:

import keras
из keras.models import Sequential
из keras.layers import Dense, Activation, Dropout, Flatten, Conv2D, MaxPooling2D
from keras.layers.normalization import BatchNormalization
import numpy как np
np.random.seed(1000)

#Создать экземпляр пустой модели
model = Sequential()

# 1-й сверточный слой
model.add(Conv2D(filters=96, input_shape=(224,224,3), kernel_size=(11,11), strides=(4,4), padding='valid'))< br /> model.add(Activation('relu'))
# Max Pooling
model.add(MaxPooling2D(pool_size=(2,2), strides=(2,2), padding=' действительный'))

# 2-й сверточный слой
model.add(Conv2D(filters=256, kernel_size=(11,11), strides=(1,1), padding='valid'))
model.add(Activation ('relu'))
# Максимальный пул
model.add(MaxPooling2D(pool_size=(2,2), strides=(2,2), padding='valid'))

# 3-й сверточный слой
model.add(Conv2D(filters=384, kernel_size=(3,3), strides=(1,1), padding='valid'))
model.add(Activation («релу»))

# 4-й сверточный слой
model.add(Conv2D(filters=384, kernel_size=(3,3), strides=(1,1), padding='valid'))
model.add(Activation («релу»))

# 5-й сверточный слой
model.add(Conv2D(filters=256, kernel_size=(3,3), strides=(1,1), padding='valid'))
model.add(Activation ('relu'))
# Максимальный пул
model.add(MaxPooling2D(pool_size=(2,2), strides=(2,2), padding='valid'))

# Передача его в полносвязный слой
model.add(Flatten())
# 1-й полносвязный слой
model.add(Dense(4096, input_shape=(224*224*3, )))
model.add(Activation('relu'))
# Добавить Dropout для предотвращения переобучения
model.add(Dropout(0.4))

# 2-й полностью подключенный слой
model.add(Dense(4096))
model.add(Activation('relu'))
# Добавить отбрасываемый элемент
model.add(Dropout( 0,4))

# 3-й полностью подключенный слой
model.add(Dense(1000))
model.add(Activation('relu'))
# Добавить отбрасывание
model.add(Dropout( 0,4))

# Выходной слой
model.add(Dense(17))
model.add(Activation(‘softmax’))

модель.резюме()

# Скомпилируйте модель
model.compile(loss=keras.losses.categorical_crossentropy, Optimizer='adam', metrics=["accuracy"])

Первоначально опубликовано на engmrk.com 5 октября 2018 г.