湖北網(wǎng)站開發(fā)網(wǎng)站多少錢
在 LeNet 提出后,卷積神經(jīng)網(wǎng)絡(luò)在計算機視覺和機器學(xué)習(xí)領(lǐng)域中很有名氣,但并未起到主導(dǎo)作用。
這是因為 LeNet 在更大、更真實的數(shù)據(jù)集上訓(xùn)練的性能和可行性還有待研究。
事實上,在 20 世紀(jì) 90 年代到 2012 年之間的大部分時間里,神經(jīng)網(wǎng)絡(luò)往往被其他機器學(xué)習(xí)方法超越,如支持向量機。
在計算機視覺中,直接將神經(jīng)網(wǎng)絡(luò)與其他機器學(xué)習(xí)方法比較也許不太公平,因為卷積神經(jīng)網(wǎng)絡(luò)的輸入是由原始像素值或是經(jīng)過簡單預(yù)處理的像素值組成。
而在使用傳統(tǒng)機器學(xué)習(xí)方法時,從業(yè)者永遠(yuǎn)不會將原始像素作為輸入。
在傳統(tǒng)機器學(xué)習(xí)方法中,計算機視覺流水線是由經(jīng)過人的精心設(shè)計的特征流水線組成的。
與訓(xùn)練端到端(從像素到分類結(jié)果)系統(tǒng)相比,經(jīng)典機器學(xué)習(xí)的流水線看起來更像下面這樣:
- 獲取一個有趣的數(shù)據(jù)集(早期收集數(shù)據(jù)需要昂貴的傳感器)。
- 根據(jù)光學(xué)、幾何學(xué)及其他偶然發(fā)現(xiàn),手工對特征數(shù)據(jù)集進行預(yù)處理。
- 通過標(biāo)準(zhǔn)的特征提取算法,如 SIFT(尺度不變特征變換)和 SURF(加速魯棒特征)。
- 將提取的特征送入分類器中,以訓(xùn)練分類器。
對于機器學(xué)習(xí)研究人員來說,用優(yōu)雅的理論去證明各種模型的性質(zhì)是重要且美麗的;而對計算機視覺研究人員來說,推動領(lǐng)域進步的是數(shù)據(jù)特征,而不是學(xué)習(xí)算法。
計算機視覺研究人員相信,從對最終模型精度的影響來說,更大或更干凈的數(shù)據(jù)集、或是稍微改進的特征提取,比任何學(xué)習(xí)算法帶來的進步大得多。
一、學(xué)習(xí)表征
在 2012 年以前,圖像特征都是機械地計算出來的。在當(dāng)時,設(shè)計一套新的特征函數(shù)、改進結(jié)果,并撰寫論文是主流。
另有一些研究人員有不同的想法,他們認(rèn)為特征本身就應(yīng)該被學(xué)習(xí)。
此外,他們還認(rèn)為,在合理的復(fù)雜性前提下,特征應(yīng)該由多個共同學(xué)習(xí)的神經(jīng)網(wǎng)絡(luò)層組成,每個層都有可學(xué)習(xí)的參數(shù)。
在機器視覺中,最底層可能檢測邊緣、顏色和紋理。由 Alex 等人(2012)提出的新的卷積神經(jīng)網(wǎng)絡(luò)變體 AlexNet 的最底層就學(xué)習(xí)到了一些類似于傳統(tǒng)濾波器的特征抽取器。
AlexNet 的更高層建立在這些底層表示的基礎(chǔ)上,表示出更大的特征,如眼睛、鼻子等等。
而更高的層可以檢測整個物體,如人、飛機等等。最終的隱藏神經(jīng)元可以學(xué)習(xí)圖像的綜合表示,從而使得屬于不同類別的數(shù)據(jù)易于區(qū)分。
盡管一直有一群執(zhí)著的研究者不斷鉆研,試圖學(xué)習(xí)視覺數(shù)據(jù)的逐級表征,但很長一段時間都未能有所突破。
深度卷積神經(jīng)網(wǎng)絡(luò)的突破出現(xiàn)在 2012 年,可歸因于兩個因素:數(shù)據(jù)和硬件。
數(shù)據(jù)
包含許多特征的深度模型需要大量的有標(biāo)簽數(shù)據(jù),才能顯著優(yōu)于基于凸優(yōu)化的傳統(tǒng)方法。
然而,限于早期計算機有限的存儲和 90 年代有限的研究預(yù)算,大部分研究只基于小的公開數(shù)據(jù)集。
這一狀況在 2010 年前后興起的大數(shù)據(jù)浪潮中得到改善。2009 年,ImageNet 數(shù)據(jù)集發(fā)布,并發(fā)起 ImageNet 挑戰(zhàn)賽,其推動了計算機視覺和機器學(xué)習(xí)研究的發(fā)展。
硬件
深度學(xué)習(xí)對計算資源的要求很高,訓(xùn)練可能需要數(shù)百個迭代輪數(shù),每次迭代都需要通過代價高昂的許多線性代數(shù)層傳遞數(shù)據(jù)。
然而,用 GPU 訓(xùn)練神經(jīng)網(wǎng)絡(luò)改變了這一格局。圖形處理器(Graphics Processing Unit, GPU)早年用來加速圖形處理,使電腦游戲玩家受益。
GPU 可優(yōu)化高吞吐量的 4$\times$4 矩陣和向量乘法,從而服務(wù)于基本的圖形任務(wù)。幸運的是,這些數(shù)學(xué)運算與卷積層的計算驚人地相似。
相比于 CPU,GPU 的綜合性能更強,內(nèi)核也要簡單得多,因此 GPU 更加節(jié)能。此外,深度學(xué)習(xí)的許多操作需要較高的內(nèi)存帶寬,而 GPU 擁有 10 倍于 CPU 的帶寬。
回到 2012 年的重大突破,Alex 等人意識到卷積神經(jīng)網(wǎng)絡(luò)中的計算瓶頸:卷積和矩陣乘法,都是可以在硬件上并行化的操作。于是,他們使用 GPU 加快了卷積運算,推動了深度學(xué)習(xí)熱潮。
二、AlexNet
2012 年,AlexNet 橫空出世。它首次證明了學(xué)習(xí)到的特征可以超越手工設(shè)計的特征,一舉打破了計算機視覺研究的現(xiàn)狀。
AlexNet 使用了 8 層卷積神經(jīng)網(wǎng)絡(luò),其架構(gòu)和 LeNet 非常相似,如下圖所示。
盡管它們的設(shè)計理念非常相似,但也存在顯著差異:
- AlexNet 相較于 LeNet-5 要深得多,其由 8 層組成:五個卷積層、兩個全連接隱藏層和一個全連接輸出層。
- AlexNet 使用 ReLU 而不是 sigmoid 作為激活函數(shù)。
模型設(shè)計
在 AlexNet 的第一層,卷積窗口的形狀是 11$\times$11,比 LeNet 中大得多。
這是因為 ImageNet 中使用的圖像要比 MNIST 大得多,因此需要一個更大的卷積窗口來捕獲目標(biāo)。
第二層中的卷積窗口縮減為 5$\times 5 ,然后是 3 5,然后是 3 5,然后是3\times 3 ,在第一層、第二層和第五層卷積層后,加入窗口形狀為 3 3,在第一層、第二層和第五層卷積層后,加入窗口形狀為 3 3,在第一層、第二層和第五層卷積層后,加入窗口形狀為3\times$3、步幅為 2 的最大匯聚層。而且,AlexNet 的通道數(shù)是 LeNet 的 10 倍。
AlexNet 將 sigmoid 激活函數(shù)改為更簡單的 ReLU 激活函數(shù)。一方面,ReLU 激活函數(shù)的計算更為簡單;另一方面,當(dāng)使用不同的參數(shù)初始化方法時,ReLU 激活函數(shù)使訓(xùn)練模型更加容易。
容量控制和預(yù)處理
AlexNet 通過暫退法(Dropout)控制全連接層的模型復(fù)雜度,而 LeNet 只使用了權(quán)重衰減。
為了進一步擴充數(shù)據(jù),AlexNet 在訓(xùn)練時增加了大量的圖像增強數(shù)據(jù),如翻轉(zhuǎn)、裁切和變色。這使得模型更加健壯,更大的樣本量有效地減少了過擬合。
net = nn.Sequential( # 定義模型# 這里使用一個11*11的更大窗口來捕捉對象。# 同時,步幅為4,以減少輸出的高度和寬度。# 另外,輸出通道的數(shù)目遠(yuǎn)大于LeNetnn.Conv2d(1, 96, kernel_size=11, stride=4, padding=1), nn.ReLU(),nn.MaxPool2d(kernel_size=3, stride=2),# 減小卷積窗口,使用填充為2來使得輸入與輸出的高和寬一致,且增大輸出通道數(shù)nn.Conv2d(96, 256, kernel_size=5, padding=2), nn.ReLU(),nn.MaxPool2d(kernel_size=3, stride=2),# 使用三個連續(xù)的卷積層和較小的卷積窗口。# 除了最后的卷積層,輸出通道的數(shù)量進一步增加。# 在前兩個卷積層之后,匯聚層不用于減少輸入的高度和寬度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, 256, kernel_size=3, padding=1), nn.ReLU(),nn.MaxPool2d(kernel_size=3, stride=2),nn.Flatten(),# 這里,全連接層的輸出數(shù)量是LeNet中的好幾倍。使用dropout層來減輕過擬合,暫退概率0.5nn.Linear(6400, 4096), nn.ReLU(),nn.Dropout(p=0.5),nn.Linear(4096, 4096), nn.ReLU(),nn.Dropout(p=0.5),# 最后是輸出層。由于這里使用Fashion-MNIST,所以用類別數(shù)為10,而非論文中的1000nn.Linear(4096, 10))
數(shù)據(jù)集準(zhǔn)備
即使在現(xiàn)代 GPU 上,使用 ImageNet 數(shù)據(jù)集訓(xùn)練也需要數(shù)小時或數(shù)天的時間,因此我們繼續(xù)使用 Fashion-MNIST 數(shù)據(jù)集來實現(xiàn) AlexNet 模型。
但由于 Fashion-MNIST 數(shù)據(jù)集中的圖像(28$\times 28 )遠(yuǎn)低于 I m a g e N e t 圖像,為了有效使用 A l e x N e t 架構(gòu),我們把圖像 r e s i z e 變換為 224 28)遠(yuǎn)低于 ImageNet 圖像,為了有效使用 AlexNet 架構(gòu),我們把圖像 resize 變換為 224 28)遠(yuǎn)低于ImageNet圖像,為了有效使用AlexNet架構(gòu),我們把圖像resize變換為224\times$224。
模型訓(xùn)練
定義好模型以及變換數(shù)據(jù)集后,訓(xùn)練的代碼和前面 LeNet 幾乎一樣,不過這里采用的是小學(xué)習(xí)率(0.01)和小batch_size
(128)。
LeNet 模型訓(xùn)練的代碼上次忘了放了,放到這篇文章附件里。
這次輸入的圖像增大很多,導(dǎo)致訓(xùn)練時間久了不少,我的拯救者風(fēng)扇響個不停。第 10 輪訓(xùn)練后的相關(guān)結(jié)果為:
第10輪的訓(xùn)練損失為0.328
第10輪的訓(xùn)練精度為0.879
第10輪的測試集精度為0.885
可以看到精度已經(jīng)很接近 90%,相比 LeNet 有一定提高,這得益于 Dropout、ReLU 的使用和預(yù)處理。
盡管 AlexNet 的代碼僅比 LeNet 多幾行,但這中間跨越的時間卻有 20 來年。目前 AlexNet 已經(jīng)被很多更有效的架構(gòu)超越,但它是從淺層網(wǎng)絡(luò)到深層網(wǎng)絡(luò)的關(guān)鍵一步。
LeNet 與 AlexNet 模型訓(xùn)練的代碼見附件: