NiN: используйте сверточные слои 1 × 1 вместо полносвязных слоев.

глубокое обучение
NiN: используйте сверточные слои 1 × 1 вместо полносвязных слоев.

Аккаунт WeChat: ilulaoshi, ссылка на личный сайт:Мистер Лу.info/machine- сейчас...

Основные режимы сетей LeNet, AlexNet и VGG: сначала использовать сверточный слой для извлечения пространственных характеристик изображения, затем использовать полносвязный слой и, наконец, выводить результат классификации. Ян Шуичэн и др. предложили «Сеть в сети» для построения сверточных слоев и полносвязных слоев с другой точки зрения.

1×1 сверточный слой

Мы знаем, что слой свертки обычно должен устанавливать высоту и ширину, и он будет идентифицировать функции изображения в окне свертки. Если высота и ширина сверточного слоя ровно равны 1, то схема расчета выглядит следующим образом:

1×1卷积层

На рисунке ядро ​​свертки имеет 3 входных канала, 2 выходных канала,(K0,0,K0,1,K0,2)(К_{0,0}, К_{0,1}, К_{0,2})Параметр, соответствующий первому каналу выхода,(K1,0,K1,1,K1,2)(К_{1,0}, К_{1,1}, К_{1,2})Параметр, соответствующий второму каналу вывода. Выходные данные умножаются на светлую часть входных данных и на светлую часть ядра свертки один за другим следующим образом:

I0,i,j×K0,0+I1,i,j×K0,1+I2,i,j×K0,2I_{0, i, j} \times K_{0, 0} + I_{1, i, j} \times K_{0, 1} + I_{2, i, j} \times K_{0, 2}

мы можем поставить(I0,i,j,I1,i,j,I2,i,j)(I_{0, i, j}, I_{1, i, j}, I_{2, i, j})Входные векторы на разных каналах понимаются как признаки в сети MLP, а(K0,0,K0,1,K0,2)(K_{0, 0}, K_{0, 1}, K_{0, 2})Под весовыми параметрами в сети MLP понимаются, а признаки и веса перемножаются один за другим, что практически аналогично работе полносвязного слоя. Затем можно использовать сверточный слой 1 × 1, чтобы делать то, что должен делать полносвязный слой.

После свёрточного слоя 1×1 высота и ширина не меняются, но меняется количество каналов. В приведенном выше примере количество выходных каналов равно 2, высота и ширина вывода остаются неизменными, а количество каналов становится равным 2.

NiN

NiN в основном использует сверточный слой 1×1 для замены полносвязного уровня, который отличается от LeNet/AlexNet/VGG и других сетей, как показано на следующем рисунке:

NiN使用1×1卷积层替代全连接层

Подобно 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())

Структура сети показана на следующем рисунке:

VGG和NiN网络结构

Мы строим сеть 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 повлияли на разработку серии последующих сверточных нейронных сетей.

использованная литература

  1. Lin, M., Chen, Q., & Yan, S. (2013). Network in network.
  2. 2 come.love/chapter_con…
  3. Тан Шусен Что/погружение-в-Д…