前面幾篇文章介紹的LeNet、AlexNet和VGG在設計上的共同之處是:先以由卷積層構成的模塊充分抽取空間特征,再以由全連接層構成的模塊來輸出分類結果,其中,AlexNet和VGG對LeNet的改進主要在于如 何對這兩個模塊加寬(增加通道數)和加深,今天我們來介紹網路中的網路(NiN):它提出了另外 一個思路,即串聯多個由卷積層和“全連接”層構成的小網路來構建一個深層網路,
我們知道卷積層的輸入和輸出通常是四維陣列(樣本,通道,高,寬),而全連接層的輸入和輸出則通常是二維陣列(樣本,特征),如果想在全連接層后再接上卷積層,則需要將全連接層的輸出變換為 四維,現在我們用一種特殊的卷積1*1卷積層,它可以看成全連接層,其中空間維度(高和寬)上的每個元素相當于樣本,通道相當于1*1特征,因此,NiN使用這個特殊的卷積層來替代全連接層,從而使空間資訊能夠自然傳遞到后面的層中去,下圖對比了NiN同AlexNet和VGG等網路在結構上的主要區別,

上圖是AlexNet和VGG的網路結構區域,下面圖是NiN的網路結構區域

NiN塊是NiN中的基礎塊,它由一個卷積層加兩個充當全連接層的1x1卷積層串聯而成,其中第一個卷積層的超引數可以自行設定,而第二和第三個卷積層的超引數一般是固定的,
import time
import torch
from torch import nn, optim
import sys
sys.path.append("..")
?
import d2lzh_pytorch as d2l
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
def nin_block(in_channels, out_channels, kernel_size, stride, padding): blk = nn.Sequential(nn.Conv2d(in_channels, out_channels, kernel_size, stride, 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())
return blk
?
總結:
- NiN重復使用由卷積層和代替全連接層的1x1卷積層構成的NiN塊來構建深層網路,
2.NiN去除了容易造成過擬合的全連接輸出層,而是將其替換成輸出通道數等于標簽類別數的NiN塊 和全域平均池化層,
3.NiN的以上設計思想影響了后面一系列卷積神經網路的設計,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/379388.html
標籤:AI
上一篇:從秦瓊賣馬說起
