網絡結構是卷積神經網絡(CNN)發展的關鍵。其中,網絡結構的改進至關重要。本文將介紹一種具有創新意義的卷積神經網絡——NIN(Network in Network)。
LeNet、AlexNet和VGG都有一個共同的設計模式:通過一系列的卷積層與匯聚層來提取空間結構特征;然后通過全連接層對特征的表征進行處理。
AlexNet和VGG對LeNet的改進主要在于如何擴大和加深這兩個模塊。 或者,可以想象在這個過程的早期使用全連接層。然而,如果使用了全連接層,可能會完全放棄表征的空間結構。
網絡中的網絡NiN 提供了一個非常簡單的解決方案:在每個像素的通道上分別使用多層感知機。
1. 網絡結構組成
NiN塊 使用了1×1的卷積層代表全連接層。
NIN的核心創新在于引入了“微網絡”(Network in Network)的概念。具體來說,每個卷積層后面都跟隨著一個1×1卷積核的微型網絡,用于對特征圖進行逐像素的特征變換,增加了網絡的非線性表達能力。這種設計使得模型能夠更深入地挖掘和利用特征信息。
與傳統的卷積神經網絡相比,NIN的結構設計更加緊湊,能夠以較少的參數實現更好的性能。其主要特點如下:
1×1卷積層的應用:通過1×1卷積核對特征圖進行逐像素的特征變換,增加模型的非線性表達能力。
全局平均池化層:在最后一層使用全局平均池化層代替全連接層,降低參數數量,減少過擬合風險,提高模型的泛化能力。
網絡深度的優化:NIN通過增加網絡的深度來提高模型的特征提取能力,同時保持了模型的簡潔性。

2. 代碼實現
代碼改編自《動手學深度學習》
import torch
from torch import nn
from d2l import torch as d2ldef 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())
net = nn.Sequential(nin_block(1, 96, kernel_size=11, strides=4, padding=0),nn.MaxPool2d(3, stride=2),nin_block(96, 256, kernel_size=5, strides=1, padding=2),nn.MaxPool2d(3, stride=2),nin_block(256, 384, kernel_size=3, strides=1, padding=1),nn.MaxPool2d(3, stride=2),nn.Dropout(0.5),# 標簽類別數是10nin_block(384, 10, kernel_size=3, strides=1, padding=1),nn.AdaptiveAvgPool2d((1, 1)),# 將四維的輸出轉成二維的輸出,其形狀為(批量大小,10)nn.Flatten())
X = torch.rand(size=(1, 1, 224, 224))
for layer in net:X = layer(X)print(layer.__class__.__name__,'output shape:\t', X.shape)輸出:
Sequential output shape: torch.Size([1, 96, 54, 54])
MaxPool2d output shape: torch.Size([1, 96, 26, 26])
Sequential output shape: torch.Size([1, 256, 26, 26])
MaxPool2d output shape: torch.Size([1, 256, 12, 12])
Sequential output shape: torch.Size([1, 384, 12, 12])
MaxPool2d output shape: torch.Size([1, 384, 5, 5])
Dropout output shape: torch.Size([1, 384, 5, 5])
Sequential output shape: torch.Size([1, 10, 5, 5])
AdaptiveAvgPool2d output shape: torch.Size([1, 10, 1, 1])
Flatten output shape: torch.Size([1, 10])
lr, num_epochs, batch_size = 0.1, 10, 128
train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size, resize=224)
d2l.train_ch6(net, train_iter, test_iter, num_epochs, lr, d2l.try_gpu())輸出:
loss 0.563, train acc 0.786, test acc 0.790
3087.6 examples/sec on cuda:0
3. NIN的影響
NIN在多個圖像分類任務中表現出了顯著的性能提升。通過在ImageNet數據集上的實驗驗證,NIN在Top-5錯誤率上達到了較低的水平,證明了其在圖像分類任務中的有效性。此外,NIN的結構設計使其適用于各種計算機視覺任務,包括目標檢測和圖像分割等。
與其他卷積神經網絡架構相比,NIN在網絡結構和性能上具有以下優勢:
更少的參數:NIN通過減少全連接層的數量,顯著降低了模型的參數數量。
更高的效率:由于參數數量的減少,NIN在訓練和推理過程中更加高效。
更好的泛化能力:全局平均池化層的使用提高了模型對新數據的適應能力。
NiN 使用由一個卷積層和多個1×1卷積層組成的塊。
NiN塊 可以在卷積神經網絡中使用,以允許更多的每像素非線性。
NiN去除了容易造成過擬合的全連接層,將它們替換為全局平均匯聚層(即在所有位置上進行求和)。該匯聚層通道數量為所需的輸出數量(例如,Fashion-MNIST的輸出為10)。
移除全連接層可減少過擬合,同時顯著減少NiN的參數。
NiN的設計影響了許多后續卷積神經網絡的設計。