Аккаунт WeChat: ilulaoshi, ссылка на личный сайт:Мистер Лу.info/machine- сейчас...
Основные режимы сетей LeNet, AlexNet и VGG: сначала использовать сверточный слой для извлечения пространственных характеристик изображения, затем использовать полносвязный слой и, наконец, выводить результат классификации. Ян Шуичэн и др. предложили «Сеть в сети» для построения сверточных слоев и полносвязных слоев с другой точки зрения.
1×1 сверточный слой
Мы знаем, что слой свертки обычно должен устанавливать высоту и ширину, и он будет идентифицировать функции изображения в окне свертки. Если высота и ширина сверточного слоя ровно равны 1, то схема расчета выглядит следующим образом:
На рисунке ядро свертки имеет 3 входных канала, 2 выходных канала,Параметр, соответствующий первому каналу выхода,Параметр, соответствующий второму каналу вывода. Выходные данные умножаются на светлую часть входных данных и на светлую часть ядра свертки один за другим следующим образом:
мы можем поставитьВходные векторы на разных каналах понимаются как признаки в сети MLP, аПод весовыми параметрами в сети MLP понимаются, а признаки и веса перемножаются один за другим, что практически аналогично работе полносвязного слоя. Затем можно использовать сверточный слой 1 × 1, чтобы делать то, что должен делать полносвязный слой.
После свёрточного слоя 1×1 высота и ширина не меняются, но меняется количество каналов. В приведенном выше примере количество выходных каналов равно 2, высота и ширина вывода остаются неизменными, а количество каналов становится равным 2.
NiN
NiN в основном использует сверточный слой 1×1 для замены полносвязного уровня, который отличается от LeNet/AlexNet/VGG и других сетей, как показано на следующем рисунке:
Подобно VGG, NiN также предлагает концепцию базового блока, базовый блок NiN состоит из общего сверточного слоя и двух сверточных слоев 1×1.
def nin_block(in_channels, out_channels, kernel_size, strides, padding):
return nn.Sequential(
nn.Conv2d(in_channels, out_channels, kernel_size, strides, padding),
nn.ReLU(),
nn.Conv2d(out_channels, out_channels, kernel_size=1), nn.ReLU(),
nn.Conv2d(out_channels, out_channels, kernel_size=1), nn.ReLU())
Структура сети показана на следующем рисунке:
Мы строим сеть NiN на основе набора данных Fashion-MNIST, а количество входных каналов равно 1. Существует четыре основных блока сети NiN:
- Первый базовый блок состоит из 11×11 сверточных слоев и 2 сверточных слоев 1×1.
- Второй базовый блок состоит из 5×5 сверточных слоев и 2 сверточных слоев 1×1.
- Третий базовый блок состоит из сверточных слоев 3×3 и 2 сверточных слоев 1×1.
- Четвертый базовый блок состоит из сверточных слоев 3×3 и 2 сверточных слоев 1×1.
NiN удаляет последний полносвязный слой LeNet/AlexNet/VGG.Вместо этого NiN использует блок NiN с количеством выходных каналов, равным количеству категорий меток, а затем использует глобальный средний объединяющий слой для усреднения всех элементов в каждом канале. и непосредственно использовать в классификации. После последнего базового блока размерность данных становится равной 10 × 5 × 5, где 10 — это количество каналов, которое также является количеством классификационных меток. Нам нужно преобразовать матрицу 5x5 в 1x1 (скаляр), используя глобальный средний объединяющий слой.
Дизайн NiN может значительно уменьшить размер параметра модели, тем самым облегчая переоснащение. Однако такая конструкция иногда увеличивает время обучения для получения корректной модели.
def nin():
'''
Returns the NiN network
'''
# Fashion-MNIST 1 * 28 * 28, resize into the input into 1 * 224 * 224
# input shape: 1 * 224 * 224
net = nn.Sequential(
# 1 * 224 * 224 -> 96 * 54 * 54
nin_block(1, 96, kernel_size=11, strides=4, padding=0),
# 96 * 54 * 54 -> 96 * 26 * 26
nn.MaxPool2d(kernel_size=3, stride=2),
# 96 * 26 * 26 -> 256 * 26 * 26
nin_block(96, 256, kernel_size=5, strides=1, padding=2),
# 256 * 26 * 26 -> 256 * 12 * 12
nn.MaxPool2d(3, stride=2),
# 256 * 12 * 12 -> 384 * 12 * 12
nin_block(256, 384, kernel_size=3, strides=1, padding=1),
# 384 * 12 * 12 -> 384 * 5 * 5
nn.MaxPool2d(3, stride=2),
nn.Dropout(0.5),
# 384 * 5 * 5 -> 10 * 5 * 5
nin_block(384, 10, kernel_size=3, strides=1, padding=1),
# 10 * 5 * 5 -> 10 * 1 * 1
nn.AdaptiveAvgPool2d((1, 1)),
# get the final classification result
nn.Flatten())
return net
Процесс обучения модели в основном аналогичен LeNet, AlexNet и VGG, которые использовались ранее, и все коды помещаются вGitHubначальство.
резюме
- NiN повторно строит сеть, используя базовые блоки NiN, которые состоят из сверточных слоев и сверточных слоев 1 × 1 вместо полносвязных слоев.
- NiN удаляет полносвязный слой, склонный к переоснащению. В финальном разделе вывода количество выходных каналов равно количеству категорий меток, а для получения окончательного результата классификации используется глобальный средний объединяющий слой. После удаления полносвязных слоев размер параметра модели также значительно уменьшается.
- Вышеупомянутые дизайнерские идеи NiN повлияли на разработку серии последующих сверточных нейронных сетей.
использованная литература
- Lin, M., Chen, Q., & Yan, S. (2013). Network in network.
- 2 come.love/chapter_con…
- Тан Шусен Что/погружение-в-Д…