卷積神經網絡之-NiN網絡(Network In Network)

機器視覺cv 發佈 2020-01-05T09:36:32+00:00

更多內容請關注『機器視覺 CV』簡介Network In Network 是發表於 2014 年 ICLR 的一篇 paper。當前被引了 3298 次。

更多內容請關注『機器視覺 CV

簡介

Network In Network 是發表於 2014 年 ICLR 的一篇 paper。當前被引了 3298 次。這篇文章採用較少參數就取得了 Alexnet 的效果,Alexnet 參數大小為 230M,而 Network In Network 僅為 29M,這篇 paper 主要兩大亮點:mlpconv (multilayer perceptron,MLP,多層感知機) 作為 "micro network" 和 Global Average Pooling(全局平均池化)。論文地址:https://arxiv.org/abs/1312.4400

創新點

(1) mlpconv Layer

在介紹 mlpconv Layer 之前,我們先看看經典的 Linear Convolutional Layer(線性卷積層)是怎麼進行操作的,


(i, j) 是特徵圖中像素的位置索引,x_ij 表示像素值,而 k 用於特徵圖通道的索引,W 是參數,經過 WX 計算以後經過一個 relu 激活進行特徵的抽象表示。

下面就介紹 mlpconv Layer 結構



i, j 表示像素下標,xi,j 表示像素值,wk,n 表示第 n 層卷積卷積參數。 以上結構可以進行跨通道的信息融合。MLP 的參數也可以使用 BP 算法訓練,與 CNN 高度整合;同時,1×1 卷積可以實現通道數的降維或者升維,11n,如果 n 小於之前通道數,則實現了降維,如果 n 大於之前通道數,則實現了升維。

(2) Global Average Pooling Layer

之前的卷積神經網絡的最後會加一層全連接來進行分類,但是,全連接層具有非常大的參數量,導致模型非常容易過擬合。因此,全局平均池化的出現替代了全連接層。我們在最後一層 mlpconv 得到的特徵圖使用全局平均池化(也就是取每個特徵圖的平均值)進而將結果輸入到 softmax 層中。

全局平均池化的優點

  • 全局平均池化沒有參數,可以避免過擬合產生。
  • 全局平均池可以對空間信息進行匯總,因此對輸入的空間轉換具有更強的魯棒性。

下圖是全連接層和全局平均池化的一個對比圖


整體網絡架構

NiN 網絡由三個 mlpconv 塊組成,最後一個 mlpconv 後使用全局平均池化。用 Pytorch 代碼實現如下:假設輸入是 32×32×3 (即 3 通道,32 高寬大小的圖片)

import torch
import torch.nn as nn

class NiN(nn.Module):
    def __init__(self, num_classes):
        super(NiN, self).__init__()
        self.num_classes = num_classes
        self.classifier = nn.Sequential(
                nn.Conv2d(3, 192, kernel_size=5, stride=1, padding=2),
                nn.ReLU(inplace=True),
                nn.Conv2d(192, 160, kernel_size=1, stride=1, padding=0),
                nn.ReLU(inplace=True),
                nn.Conv2d(160,  96, kernel_size=1, stride=1, padding=0),
                nn.ReLU(inplace=True),
                nn.MaxPool2d(kernel_size=3, stride=2, padding=1),
                nn.Dropout(0.5),

                nn.Conv2d(96, 192, kernel_size=5, stride=1, padding=2),
                nn.ReLU(inplace=True),
                nn.Conv2d(192, 192, kernel_size=1, stride=1, padding=0),
                nn.ReLU(inplace=True),
                nn.Conv2d(192, 192, kernel_size=1, stride=1, padding=0),
                nn.ReLU(inplace=True),
                nn.AvgPool2d(kernel_size=3, stride=2, padding=1),
                nn.Dropout(0.5),

                nn.Conv2d(192, 192, kernel_size=3, stride=1, padding=1),
                nn.ReLU(inplace=True),
                nn.Conv2d(192, 192, kernel_size=1, stride=1, padding=0),
                nn.ReLU(inplace=True),
                nn.Conv2d(192,  10, kernel_size=1, stride=1, padding=0),
                nn.ReLU(inplace=True),
                nn.AvgPool2d(kernel_size=8, stride=1, padding=0),

                )

    def forward(self, x):
        x = self.classifier(x)
        logits = x.view(x.size(0), self.num_classes)
        probas = torch.softmax(logits, dim=1)
        return logits, probas

結果分析

  • CIFAR-10 測試數據集

NIN + Dropout 得到 10.41% 的錯誤率,加上數據增強(平移和水平翻轉)錯誤率降到了 8.81%


以上曲線對比了有無 Dropout 機制前 200 epoch 的錯誤率,實驗結果表明,引入 Dropout 機制,可以降低測試集 20% 的錯誤率

在 CIFAR-10 測試數據集上對比了全連接層和全局平均池化的效果

  • CIFAR-100


上面對比方法時提到了 maxout,這是是蒙特婁大學信息與信息技術學院的幾位大牛 2013 年在 ICML 上發表的一篇論文,有興趣的可以看:https://arxiv.org/abs/1302.4389

  • Street View House Numbers (SVHN) 街景門牌號碼數據集
  • MNIST

NiN + Dropout 效果在 MNIST 上效果比 maxout +Dropout 遜色了點

總結


Network In Network 通過創新的創建 MLP 卷積層,提高了網絡的非線性表達同時降低了參數量,用全局均值池化代替全連接層,極大的降低了參數量。

參考:

  • 有三 AI【模型解讀】network in network 中的 1*1 卷積,你懂了嗎
  • http://teleported.in/posts/network-in-network/
  • https://openreview.net/forum?id=ylE6yojDR5yqX
  • https://d2l.ai/chapter_convolutional-modern/nin.html 動手學深度學習
  • https://github.com/jiecaoyu/pytorch-nin-cifar10
關鍵字: