更多內容請關注『機器視覺 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