更多內容請關注『機器視覺CV』公眾號
論文地址:https://papers.nips.cc/paper/4824-imagenet-classification-with-deep-convolutional-neural-networks.pdf
2012 年, AlexNet 橫空出世。這個模型的名字來源於論⽂第一作者的姓名 Alex Krizhevsky。AlexNet 使⽤了 8 層卷積神經⽹絡,並以很⼤的優勢贏得了 ImageNet 2012 圖像識別挑戰賽冠軍。
- top1: 37.5%
- top5: 17.0%
- 6 千萬參數 650000 個神經元
與 LeNet 相比較
第⼀,與相對較小的 LeNet 相⽐, AlexNet 包含 8 層變換,其中有 5 層卷積和 2 層全連接隱藏層,以及 1 個全連接輸出層。AlexNet 第⼀層中的卷積窗⼝形狀是 11×11。因為 ImageNet 中絕⼤多數圖像的⾼和寬均⽐ MNIST 圖像 的⾼和寬⼤ 10 倍以上, ImageNet 圖像的物體佔⽤更多的像素,所以需要更⼤的卷積窗⼝來捕獲物體。第⼆層中的卷積窗⼝形狀減⼩到 5×5 ,之後全採⽤ 3×3。此外,第⼀、第⼆和第五個卷積層之後都使用了窗⼝形狀為 3×3 、步幅為 2 的最⼤池化層。⽽且, AlexNet 使用的卷積通道數也⼤於 LeNet 中的卷積通道數數⼗倍。
第⼆,AlexNet 將 sigmoid 激活函數改成了更加簡單的 ReLU 激活函數。⼀⽅⾯, ReLU 激活函數的計算更簡單,例如它並沒有 sigmoid 激活函數中的求冪運算。另⼀⽅⾯,ReLU 激活函數在不同的參數初始化⽅法下使模型更容易訓練。這是由於當 sigmoid 激活函數輸出極接近 0 或 1 時,這些區域的梯度幾乎為 0,從⽽造成反向傳播⽆法繼續更新部分模型參數;⽽ ReLU 激活函數在正區間的梯度恆為 1。因此,若模型參數初始化不當, sigmoid 函數可能在正區間得到幾乎為 0 的梯度,從⽽令模型⽆法得到有效訓練。
Relu 比 Sigmoid 的效果好在哪裡?
Sigmoid 的導數只有在 0 的附近時有較好的激活性,而在正負飽和區域的梯度趨向於 0, 從而產生梯度彌散的現象,而 relu 在大於 0 的部分梯度為常數,所以不會有梯度彌散現象。Relu 的導數計算的更快。Relu 在負半區的導數為 0, 所以神經元激活值為負時,梯度為 0, 此神經元不參與訓練,具有稀疏性。
第三, AlexNet 通過丟棄法(dropout)來控制全連接層的模型複雜度。⽽ LeNet 並沒有使用丟棄法。
第四,AlexNet 引⼊了⼤量的圖像增⼴,如翻轉、裁剪和顏⾊變化,從⽽進⼀步擴⼤數據集來緩解過擬合。
代碼實現
<code>importtimeimporttorchfromtorchimportnn,optimimporttorchvisionclassAlexNet(nn.Module):def__init__(self):super(AlexNet,self).__init__()self.conv=nn.Sequential(nn.Conv2d(1,96,11,4),#in_channels,out_channels,kernel_size,stride,paddingnn.ReLU(),nn.MaxPool2d(3,2),#kernel_size,stride#減小卷積窗口,使用填充為2來使得輸入與輸出的高和寬一致,且增大輸出通道數nn.Conv2d(96,256,5,1,2),nn.ReLU(),nn.MaxPool2d(3,2),#連續3個卷積層,且使用更小的卷積窗口。除了最後的卷積層外,進一步增大了輸出通道數。#前兩個卷積層後不使用池化層來減小輸入的高和寬nn.Conv2d(256,384,3,1,1),nn.ReLU(),nn.Conv2d(384,384,3,1,1),nn.ReLU(),nn.Conv2d(384,256,3,1,1),nn.ReLU(),nn.MaxPool2d(3,2))#這裡全連接層的輸出個數比LeNet中的大數倍。使用丟棄層來緩解過擬合self.fc=nn.Sequential(nn.Linear(256*5*5,4096),nn.ReLU(),nn.Dropout(0.5),nn.Linear(4096,4096),nn.ReLU(),nn.Dropout(0.5),#輸出層。由於這裡使用Fashion-MNIST,所以用類別數為10,而非論文中的1000nn.Linear(4096,10),)defforward(self,img):feature=self.conv(img)output=self.fc(feature.view(img.shape[0],-1))returnoutput/<code>
模型特性
- SGD, 128 batch-size, momentum=0.9, weight decay=0.0005, 學習率 = 0.01
- 所有卷積層都使用 ReLU 作為非線性映射函數,使模型收斂速度更快
- 在多個 GPU 上進行模型的訓練,不但可以提高模型的訓練速度,還能提升數據的使用規模
- 使用 LRN 對局部的特徵進行歸一化,結果作為 ReLU 激活函數的輸入能有效降低錯誤率
- 重疊最大池化(overlapping max pooling),即池化範圍 z 與步長 s 存在關係 z>s 避免平均池化(average pooling)的平均效應
- 使用隨機丟棄技術(dropout)選擇性地忽略訓練中的單個神經元,避免模型的過擬合(也使用數據增強防止過擬合)
貢獻 / 意義
- AlexNet 跟 LeNet 結構類似,但使⽤了更多的卷積層和更⼤的參數空間來擬合⼤規模數據集 ImageNet。它是淺層神經⽹絡和深度神經⽹絡的分界線。
- 雖然看上去 AlexNet 的實現⽐ LeNet 的實現也就多了⼏⾏代碼而已,但這個觀念上的轉變和真正優秀實驗結果的產⽣令學術界付出了很多年。
閱讀更多 機器視覺CV 的文章
關鍵字: 人工智能