一、全連接層問題
1、卷積層的參數:輸入的通道數乘以輸出的通道數再乘以窗口的高寬
2、全連接層的參數就是輸入的元素個數乘以輸出的元素個數,也就是輸入的通道數乘以輸入的高寬,再乘以輸出的通道數乘以輸出的高寬,賊大的量級
3、一個卷積層后跟兩個全連接層(1*1卷積,步幅1,無填充,輸出形狀跟卷積層輸出一樣,起到全連接作用):1×1卷積層相當于一個全連接層,它所做的操作是,按照像素去逐一做的全連接層
二、NiN架構
1、無全連接層
2、交替使用NiN塊和步幅為2的最大池化層(逐步減小高寬和增大通道數)
3、最后使用全局平均池化層得到輸出(輸出通道數是類別數),全局池化層它的高寬等于輸入的高寬,等價于對一個類別來說,把它的平均拿出來,把這個值當做類別的預測,再加上soft max就能得到我們的預測了,這樣我們就可以不用使用全連接層了,減少我們所占用內存的參數個數
三、總結
1、NiN使用由一個卷積層和多個1×1卷積層組成的塊。該塊可以在卷積神經網絡中使用,以允許更多的每像素非線性。
2、NiN去除了容易造成過擬合的全連接層,將它們替換為全局平均匯聚層(即在所有位置上進行求和)。該匯聚層通道數量為所需的輸出數量(例如,Fashion-MNIST的輸出為10)。
3、移除全連接層可減少過擬合,同時顯著減少NiN的參數。
4、NiN的設計影響了許多后續卷積神經網絡的設計。
四、代碼
1、NiN塊
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())
2、NiN模型
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())