在提出LeNet后卷積神經網絡在計算機視覺和機器學習領域中報有名氣,但是卷積神經網絡并沒有主導這些領域,因為LeNet在小數據集上取得了很好的效果,在更大,更真實的數據集上訓練卷積神經網絡的性能 和可行性有待研究,20世紀90年代初到2012年間的大部分時間里,神經網絡往往被其他機器學習方法超越,支持向量機。
在計算機視覺中,直接將神經網絡與其他機器學習方法進行表也不公平,卷積神經網絡的輸入事原始像素值經過簡單預處理的像素值組成,但是在使用傳統機器學習方法時,在傳統機器學習方法中,計算機視覺流水線時經過手工精心設計的特征流水線組成的,這些傳統方法,大部分的進展都來自對特征有了更聰明的想法,并且學習到的算法往往歸于事后的解釋。
因此,與訓練端到端系統不同,經典機器學習的流水線看起來更像下面這樣。
(1)獲取一個有趣的數據集,收集這些數據集需要傳感器,
(2)根據光學,幾何學,其他知識以及偶然的發現,手動對待特征數據集進行預處理。
(3) 通過標準的特征提取算法,如SIFT或者其他手動調整的流水線來輸入數據。
(4)將提取的特征送入最喜歡的分類器中,以訓練分類器。
當人們和機器學習研究人員交談時,會發現機器學習研究人員相信機器學習即重要又美麗:
7.1.1 學習表征
一種預測這個領域發展的方法時觀察圖像特征的提取方法,圖像特征都是機械的計算出來的,設計一套新的特征函數。改進結果并撰寫論文。SIFT,SURF,HOG 定向梯度直方圖,都占據了主導地位。
在合理的復雜性前提下,特征應該由多個共同學習的神經網絡層組成,每個層都有課學習的參數,機器視覺中,底層可能檢查邊緣,顏色和紋理,實際上,
7.1.2 AlexNet
2012年AlexNet橫空出世,證明了學習到的特征可以超越手動設計的特征,AlexNet使用8層卷積神經網絡,以很大的優勢贏得了2012年ImageNet圖像識別挑戰賽。
AlexNet和LeNet非常類似。
LeNet
全連接層 10 ->全連接層 84 ->全連接層 120->
2x2歐拿冠軍匯聚層
5x5卷積層 16
2x2 平均匯聚層
5x5卷積層
圖片28x28
AlexNet
全連接層 1000
全連接層 4096
全連接層 4096
3x3最大匯聚層
3x3卷積層
3x3卷積層
3x3最大匯聚層
5x5卷積層
3x3最大匯聚層
11x11 卷積層
圖片 3x244x244
AlexNet 和LeNet5要深得多,AlexNet由8層組成,5個卷積層,2個全選接隱藏層和1個全連接層輸出。
2 AlexNet使用ReLU而不是sigmoid 作為其激活函數
1 模型設計
AlexNet第一層,卷積窗口的形狀是11x11,由于imageNet中大多數圖像的高和寬比MNIST圖像的大10倍以上,因此,需要一個更大的卷積窗口來捕獲目標,第二層中的卷積窗口形狀縮減為5x5,然后是3x3,此外,在第一層,第二層和第五層卷積層之后,加入窗口形狀為3x3,步驟為2的最大匯聚層,而且AlexNet是卷積通道數是LeNet的10倍。
在最后一個卷積層后由兩個全連接層,分別有4096個輸出,這兩個巨大的全連接層有近1GB的模型參數,早期的GPU顯存有限,原始的AlexNet才用了雙數據流設計,使得每個GPU只負責存儲和計算模型的一半參數,幸運的是,現在GPU現存相對充裕,所以很少需要跨GPU分解模型
2 激活函數
AlexNet將sigmoid激活函數改為簡單的ReLU激活函數,一方面,ReLU激活函數的計算更簡單,不需要加sigmoig激活函數復雜的求冪運算,另一方面,使用補同的參數初始化方法時,ReLU激活函數使訓練模型更加容易。當sigmoid激活函數的輸出非常接近于0或者1時,這些區域的梯度幾乎為0,因此反向傳播無法繼續更新一些模型參數。而ReLU激活函數在正區間的梯度總為1,因此,如果模型參數沒有正確初始化,sigmoid函數可以能在正區間得到幾乎為0的梯度,從而使模型無法的得到有效的訓練。
3 容量控制和預處理
AlexNet通過暫退法 控制全連接層的模型復雜度,而LeNet只使用了權重衰減,為了進一步擴增數據,AlexNet在訓練時增加了大量的圖像增強數據,翻轉,載切和變色,這使得模型更健壯,更大的樣本量有效減少了過擬合。
import torch
from torch import nn
from d2l import torch as d2l
net = nn.Sequential (
#這里使用一個11x11的更大窗口來捕獲對象
#同時,步幅為4,以減少輸出的高度和寬度
#另外,輸出通道數遠大于LeNet
nn.Conv2d(1, 96, kernel_size=11, stride=4, padding=1), nn.ReLU(),
nn.MaxPool2d(kernel_size=3, stride=2)
#減小卷積窗口,使用填充為2來使得輸入與輸出的高和寬一致,并且增大輸出通道數
nn.Conv2d(96, 256, kernel_size=5,padding=2), nn.ReLU(),
nn.MaxPool2d(kernel_szie=3, stride=2)
#使用3個鏈接的卷積層和較小的卷積窗口
#除了最后的卷積層,輸出通道數進一步增加
#在前兩個卷積層之后,匯聚層不用于減少輸入的高度和寬度
nn.Conv2d(256, 384, kernel_size=3, padding=1), nn.ReLU(),
nn.Conv2d(384, 384, kernel_size=3, padding=1), nn.ReLU(),
nn.Conv2d(384, 384, kernel_size=3, padding=1), nn.ReLU(),
nn.MaxPool2d(kernel_szie=3, stride=2),
nn.Flatten(),
#這里,全連接層輸出的數量是LeNet的好幾倍,使用暫退層來緩解過擬合
nn.Linear(6400, 4096), nn.ReLU(),
nn.Dropout(p=0.5),
nn.Linear(4096, 4096), nn.ReLU(),
nn.Dropout(p=0.5),
#最后是輸出層,因為這里使用Fashion - MNIST,所以類別數為10,
nn.Linear(4096, 10)
我們構造高度和寬度都為224的單通道數據,來觀察每一層輸出的形狀,圖7-2中AlexNet架構相匹配。
x = torch.randn(1,1,,224,224)
for layer in net:
x=layer(x)
)