Сверточная нейронная сеть AlexNet
1. Введение
LeNet была одной из первых сверточных нейронных сетей, продвинувших область глубокого обучения. Эта новаторская работа Яна Лекуна была названа LeNet5 после нескольких успешных итераций с 1988 года. AlexNet был предложен в статье «Классификация ImageNet с глубокими свёрточными нейронными сетями», опубликованной Алексом Крижевским и другими в 2012 году, и выиграл чемпионат ImageNet LSVRC 2012 года, вызвавший большую сенсацию. Можно сказать, что AlexNet представляет собой сетевую структуру, имеющую историческое значение. До этого глубокое обучение долгое время молчало. С момента рождения AlexNet в 2012 году все последующие чемпионы ImageNet были созданы с помощью сверточных нейронных сетей (CNN). уровень становится все глубже и глубже, превращая CNN в модель основного алгоритма распознавания и классификации изображений, что приводит к взрыву глубокого обучения. В этой статье подробно объясняется модель AlexNet и ее реализация с использованием Keras. Прежде чем мы начнем, давайте поговорим о сверточных нейронных сетях.
2. Сверточные нейронные сети
2.1 Сверточный слой
Свертка — это математическая операция, которая каким-то образом «применяет» одну функцию к другой, и результат можно понимать как «смесь» двух функций. Однако как это помогает обнаруживать объекты на изображениях? Оказывается, свертки очень хорошо обнаруживают простые структуры на изображениях, а затем комбинируют эти простые функции для создания более сложных функций. В сверточной сети этот процесс происходит на нескольких уровнях, каждый из которых выполняет свертку на выходе предыдущего слоя. Цель операции свертки состоит в том, чтобыИзвлечение различных функций ввода, первый сверточный слой может извлекать только некоторые низкоуровневые объекты, такие как ребра, линии и углы, а другие слои сетей могут итеративно извлекать более сложные объекты из низкоуровневых объектов.
Итак, какую свертки вы бы использовали в компьютерном зрении? Чтобы понять это, сначала поймите, что такое изображение. Изображение представляет собой массив байтов второго или третьего порядка, массив второго порядка содержит 2 измерения ширины и высоты, а массив третьего порядка имеет 3 измерения, включая ширину, высоту и канал, поэтому изображение в градациях серого занимает второе место. -order, тогда как RGB График третьего порядка (содержит 3 канала). Значение байта просто интерпретируется как целочисленное значение, описывающее конкретное количество каналов, которые должны использоваться в соответствующем пикселе. Таким образом, в основном, имея дело с компьютерным зрением, вы можете думать об изображении как о 2D-массиве чисел (для изображений RGB или RGBA думайте о них как о 3 или 4 2D-массивах чисел друг над другом).
Рисунок 1: Схематическая диаграмма операции свертки (левый вход, средний фильтр, правый выход)Нажмите, чтобы увидеть демонстрацию расчета
Следует отметить, что шаг и размер фильтра являются гиперпараметрами, а это означает, что модель их не изучает. Поэтому вам придется применить научное мышление, чтобы определить, какие значения этих величин лучше всего подходят для вашей модели. Для сверток последнее понятие, которое вам нужно понять, — это заполнение. Если ваше изображение не может соответствовать фильтру целое число раз (с учетом шагов), вы должны дополнить изображение. Есть два способа сделать это: ДЕЙСТВУЮЩЕЕ заполнение и ТАКОЕ заполнение. По сути, VALID padding отбрасывает все оставшиеся значения по краям изображения. То есть, если фильтр равен 2 x 2, шаг равен 2, а ширина изображения равна 3, то заполнение VALID игнорирует значение третьего столбца изображения. SAME padding добавляет значения (обычно 0) к краям изображения, чтобы увеличить его размерность до тех пор, пока фильтр не сможет соответствовать целому числу раз. Это заполнение обычно выполняется симметрично (то есть предпринимается попытка добавить одинаковое количество столбцов/строк с каждой стороны изображения).
2.2 Уровень активации
Слой активации в основном является функцией функции активации, так что же такое функция активации? В нейронной сети, когда входной стимул достигает определенной интенсивности, нейрон активируется для создания выходного сигнала. Функция, моделирующая этот процесс активации клетки, называется функцией активации. Стандартный способ моделирования выхода f нейрона как функции его входа x состоит в использовании
или сигмовидная функция. Что касается времени обучения градиентному спуску, AlexNet предлагает функцию ReLu, которая в 6 раз быстрее, чем описанный выше метод.. ReLU расшифровывается как Rectified Linear Units, это поэлементная операция (применяемая к каждому пикселю) и нелинейная операция, которая заменяет все отрицательные значения пикселей на карте объектов нулями. Его цель — ввести нелинейность в сверточные нейронные сети, потому что в реальной жизни большая часть данных, которые мы хотим изучить с помощью нейронных сетей, нелинейны (свертка — это линейная операция — матричное умножение и сложение по элементам, поэтому мы надеемся решить нелинейную проблему, введя нелинейные функции, такие как ReLU).Рисунок 2: Функция ReLU (вход меньше 0, выход равен 0, вход больше 0, выход — исходное значение)
2.3 Слой объединения
Еще один важный слой, который вы увидите в сверточных сетях, — это слой пула. Слои объединения бывают разных форм: максимальное, среднее, сумма и т. д. Но чаще всего используется максимальное объединение, когда входная матрица разбивается на сегменты одинакового размера, и максимальное значение в каждом сегменте используется для заполнения соответствующего элемента выходной матрицы. Слой объединения можно рассматривать как состоящий из сетки единиц объединения, отстоящих друг от друга на s пикселей, причем каждое объединение суммирует окрестности размером z×z с центром в местоположении единицы объединения. Если мы установим s = z (размер окна объединения равен шагу), мы получим традиционное локальное объединение, обычно используемое в CNN. Если мы установим s
Рисунок 3: Максимальное объединение (левый размер 16X16 разделен на 4 блока, черный кружок — самое большое число)
2.4 Полносвязный слой
Полносвязный слой — это традиционный многослойный персептрон, который использует функцию активации softmax в выходном слое (также можно использовать другие классификаторы, такие как SVM). Термин «полностью связанный» означает, что каждый нейрон в предыдущем слое связан с каждым нейроном в следующем слое. Это обычный уровень сверточной сети, в котором все выходы предыдущего уровня подключены ко всем узлам следующего уровня. Когда сверточный слой преобразуется в полносвязный слой, общее количество нейронов остается неизменным.
3. Модель AlexNet
3.1 Введение в модель
Рисунок 4: Модель AlexNet (5 сверточных слоев + 3 полносвязных слоя, всего 8 нейронных сетей, использующих 2GPU, поэтому она разделена на верхнюю и нижнюю части)
Модель AlexNet содержит 60 миллионов параметров и 650 000 нейронов, в том числе 5 сверточных слоев, за несколькими из которых следуют слои максимального пула, 3 полносвязных слоя и, наконец, слой 1000 Road softmax. Для ускорения обучения AlexNet использует функцию нелинейной активации Relu и эффективный метод свертки на основе графического процессора. Чтобы уменьшить переоснащение полносвязного слоя, AlexNet применяет новейший метод «Dropout» для предотвращения переобучения, который оказался очень эффективным.
3.2Локальная нормализация (Local Response Normalization, сокращенно LRN)
В нейробиологии существует понятие «латеральное торможение», которое относится к активированному нейрону, подавляющему соседние нейроны. Целью нормализации является «подавление», а локальной нормализации является использование идеи «побочного подавления» для достижения локального подавления, особенно при использовании ReLU, это «побочное подавление» очень полезно, потому что результат ответа ReLU неограничен (может быть очень большим), поэтому требуется нормализация. Методы, использующие локальную нормализацию, помогают повысить способность к обобщению.
4. Переоснащение AlexNet
4.1 Увеличение данных
Самый простой и наиболее распространенный способ уменьшить переоснащение данных изображения — это искусственно увеличить набор данных с помощью преобразования с сохранением меток. Модель AlexNet использует две разные формы, каждая из которых позволяет генерировать преобразованное изображение из исходного изображения с очень небольшими вычислениями, поэтому преобразованное изображение не нужно хранить на диске. Первая форма увеличения данных состоит из создания преобразований изображения и горизонтальных отражений. Вторая форма увеличения данных включает изменение интенсивности каналов RGB в обучающих изображениях.
Рисунок 5: Три способа увеличения данных
4.2 Dropout
Для слоя нейронов Dropout устанавливает выход каждого нейрона скрытого слоя равным нулю с вероятностью 0,5. Нейроны, «выпавшие» таким образом, не используются ни для прямого распространения, ни участвуют в обратном распространении. Таким образом, каждый раз при представлении входных данных нейронная сеть пробует другую структуру, каждая из которых имеет общий вес. Поскольку существование нейронов не может зависеть от других конкретных нейронов, этот метод уменьшает сложные межадаптационные отношения нейронов. Из-за этого он вынужден изучать более надежные функции, которые полезны при объединении некоторых разных случайных подмножеств других нейронов. Без Dropout сеть AlexNet демонстрирует много переобучения.
Рис. 6. Схема дропаута
5. Интерпретация исходного кода
5.1 Наборы данных и зависимости импорта
# (1) Importing dependency
import keras
from keras.models import Sequential
from keras.layers import Dense, Activation, Dropout, Flatten, Conv2D, MaxPooling2D
from keras.layers.normalization import BatchNormalization
import numpy as np
np.random.seed(1000)
# (2) Get Data
import tflearn.datasets.oxflower17 as oxflower17
x, y = oxflower17.load_data(one_hot=True)
# (3) Create a sequential model
model = Sequential()
Модель AlexNet построена на проблеме классификации тысяч, и ее вычислительная мощность очень требовательна к компьютерам. Здесь мы используем набор данных TensorFlow oxflower17 для простого воспроизведения, Этот набор данных классифицирует цветы по категориям 17, и каждая категория имеет фотографии 80. Keras включает в себя реализации многих стандартных строительных блоков нейронных сетей, таких как слои, цели, функции активации, оптимизаторы и ряд инструментов, упрощающих работу с изображениями и текстовыми данными. В Keras есть два основных типа моделей: последовательная последовательная модель и модель класса Model, использующая функциональный API. Здесь используется последовательная модель.
5.3Первая свертка + пул
# 1st Convolutional Layer
model.add(Conv2D(filters=96, input_shape=(224,224,3), kernel_size=(11,11), strides=(4,4), padding='valid'))
model.add(Activation('relu'))
# Pooling
model.add(MaxPooling2D(pool_size=(2,2), strides=(2,2), padding='valid'))
# Batch Normalisation before passing it to the next layer
model.add(BatchNormalization())
Размер сверточного слоя 1 — 224X224X3, размер ядра свертки — 11X11X3, число — 48, шаг — 4.
Расчет сверточного слоя выглядит следующим образом:
- Размер тела входных данных
- 4 гиперпараметра (модель не научится оптимизировать):
- Количество фильтров
- Размер фильтрующего пространства
- Размер шага операции свертки
- Количество дополнений нулями (SAME padding)
- Размер тела выходных данных
Здесь W1=224, H1=224, D1=3, K=48, F=11, S=4, P=1,5.
Вычислить сверточный слой 2 с W2=(224-11+3)/4+1=55, аналогично H2=55, D2=K*2=96.
После операции свертки размер изображения выходного признака составляет 55X55X96.
Здесь используется максимальное объединение и размер шага S=2, тогда W=(55-3)/2+1=27.
После объединения размер выходного изображения функции составляет 27X27X96.
5.4 Вторая свертка + объединение
# 2nd Convolutional Layer
model.add(Conv2D(filters=256, kernel_size=(11,11), strides=(1,1), padding='valid'))
model.add(Activation('relu'))
# Pooling
model.add(MaxPooling2D(pool_size=(2,2), strides=(2,2), padding='valid'))
# Batch Normalisation
model.add(BatchNormalization())
Размер сверточного слоя 2 — 55X55X96, размер ядра свертки — 5X5, число — 128, шаг — 1.
Точно так же размер изображения признака может быть получен после свертки 27X27X256.
После объединения размер выходного изображения функции составляет 13X13X256. **
5.5 Третья свертка
# 3rd Convolutional Layer
model.add(Conv2D(filters=384, kernel_size=(3,3), strides=(1,1), padding='valid'))
model.add(Activation('relu'))
# Batch Normalisation
model.add(BatchNormalization())
После свертки размер изображения функции составляет 13X13X384.
5.6 Четвертая свертка
# 4th Convolutional Layer
model.add(Conv2D(filters=384, kernel_size=(3,3), strides=(1,1), padding='valid'))
model.add(Activation('relu'))
# Batch Normalisation
model.add(BatchNormalization())
После свертки размер изображения функции составляет 13X13X284.
5.7 Пятая свертка + объединение
# 5th Convolutional Layer
model.add(Conv2D(filters=256, kernel_size=(3,3), strides=(1,1), padding='valid'))
model.add(Activation('relu'))
# Pooling
model.add(MaxPooling2D(pool_size=(2,2), strides=(2,2), padding='valid'))
# Batch Normalisation
model.add(BatchNormalization())
После свертки размер изображения функции составляет 13X13X256.
После объединения размер изображения функции составляет 6X6X256.
5.8 Полностью подключенный уровень 6
# Passing it to a dense layer
model.add(Flatten())
# 1st Dense Layer
model.add(Dense(4096, input_shape=(224*224*3,)))
model.add(Activation('relu'))
# Add Dropout to prevent overfitting
model.add(Dropout(0.4))
# Batch Normalisation
model.add(BatchNormalization())
Размер полносвязного слоя 6 6X6X256, всего 4096 нейронов, выходной вектор 4096X1.
5.9 Полностью подключенный уровень 7
# 2nd Dense Layer
model.add(Dense(4096))
model.add(Activation('relu'))
# Add Dropout
model.add(Dropout(0.4))
# Batch Normalisation
model.add(BatchNormalization())
Размер полносвязного слоя 7 составляет 4096X1, всего 4096 нейронов, а выходной вектор равен 4096X1.
5.10 Полностью подключенный уровень 8
# 3rd Dense Layer
model.add(Dense(1000))
model.add(Activation('relu'))
# Add Dropout
model.add(Dropout(0.4))
# Batch Normalisation
model.add(BatchNormalization())
Полносвязный слой 8 имеет входной размер 4096X1, всего 4096 нейронов и выходной вектор 1000X1.
5.11 Выходной слой и обучение
# Output Layer
model.add(Dense(17))
model.add(Activation('softmax'))
model.summary()
# (4) Compile
model.compile(loss='categorical_crossentropy', optimizer='adam',metrics=['accuracy'])
# (5) Train
model.fit(x, y, batch_size=64, epochs=1, verbose=1, validation_split=0.2, shuffle=True)
Окончательно результат получается после прохождения полносвязного слоя через функцию активации softmax.
На полученном графике функции потерь значение потерь обучающего набора достигает минимума на 23 итерации. Из-за ограниченного объема данных значение потерь тестового набора не может быть приведено к идеальному положению. (абсцисса — количество итераций, ордината — значение функции потерь)
Видно, что на тренировочном наборе может быть достигнута точность почти 90%. (абсцисса — количество итераций, ордината — точность)
Поскольку набор данных слишком мал, точность тестового набора не может достичь желаемого значения.
6. Резюме и перспективы
В настоящее время вы можетеМОНайдите проекты на базе AlexNet на платформеFlower, Этот проект объединяет тысячи классификаций исходного текста и, наконец, составляет 17 классификаций цветов. В процессе обучения, если вы столкнетесь с трудностями или обнаружите наши ошибки, вы можете связаться с нами в любое время.
Адрес исходного кода проекта:Woohoo. Тихо тянуть. Талант: 8899/исследование/5 есть...
Подводя итог основным вкладам AlexNet:
- Двухсторонняя реализация графического процессора для более быстрого обучения
- Функция нелинейной активации Relu для сокращения времени обучения и ускорения обучения
- Объединение с перекрытием повышает точность и не допускает переобучения.
- Для уменьшения переобучения используются увеличение данных и «выпадение»
- Используйте нормализацию локального отклика для повышения точности
- 5 сверточных слоев + 3 полносвязных слоя с хорошими структурными характеристиками
7. Ссылка
- бумага:Бумаги.Грязевой Бодхисаттва.Цао Цао/бумага/4824-…
- Переведенная версия статьи:zhuanlan.zhihu.com/p/35400048
- набор данных:woohoo.robots.O-type.AC.UK/~v GG/data/…
- Керас:keras.io/zh/
- алгоритм:Woohoo Нет данных hack.com/building - Али…
- Блог:no.OSCHINA.net/U/876354/ Первоначально…
- Блог:Woohoo. IBM.com/developer Я…
о нас
Mo(URL:momodel.cn) поддерживает PythonПлатформа онлайн-моделирования искусственного интеллекта, который помогает быстро разрабатывать, обучать и развертывать модели.
Клуб искусственного интеллекта МоЭто клуб, созданный командой разработчиков и дизайнеров веб-сайта и посвященный снижению порога для разработки и использования искусственного интеллекта. Команда имеет опыт обработки и анализа больших данных, визуализации и моделирования данных, реализовывала многодисциплинарные интеллектуальные проекты и обладает полным спектром возможностей проектирования и разработки от начала до конца. Основными направлениями исследований являются анализ управления большими данными и технологии искусственного интеллекта, и их использование для продвижения научных исследований, основанных на данных.
В настоящее время клуб каждую субботу проводит офлайн-мероприятия технического салона на тему машинного обучения в Ханчжоу, а также время от времени проводит обмен документами и академические обмены. Я надеюсь собрать друзей из всех слоев общества, которые интересуются искусственным интеллектом, продолжать общаться и расти вместе, а также способствовать демократизации и популяризации искусственного интеллекта.