網(wǎng)上做設(shè)計(jì)網(wǎng)站梅州seo
學(xué)習(xí)參考:
- 動(dòng)手學(xué)深度學(xué)習(xí)2.0
- Deep-Learning-with-TensorFlow-book
- pytorchlightning
①如有冒犯、請(qǐng)聯(lián)系侵刪。
②已寫(xiě)完的筆記文章會(huì)不定時(shí)一直修訂修改(刪、改、增),以達(dá)到集多方教程的精華于一文的目的。
③非常推薦上面(學(xué)習(xí)參考)的前兩個(gè)教程,在網(wǎng)上是開(kāi)源免費(fèi)的,寫(xiě)的很棒,不管是開(kāi)始學(xué)還是復(fù)習(xí)鞏固都很不錯(cuò)的。
深度學(xué)習(xí)回顧,專(zhuān)欄內(nèi)容來(lái)源多個(gè)書(shū)籍筆記、在線筆記、以及自己的感想、想法,佛系更新。爭(zhēng)取內(nèi)容全面而不失重點(diǎn)。完結(jié)時(shí)間到了也會(huì)一直更新下去,已寫(xiě)完的筆記文章會(huì)不定時(shí)一直修訂修改(刪、改、增),以達(dá)到集多方教程的精華于一文的目的。所有文章涉及的教程都會(huì)寫(xiě)在開(kāi)頭、一起學(xué)習(xí)一起進(jìn)步。
學(xué)習(xí)推薦:
- https://blog.csdn.net/hjkdh/article/details/124565443
- 卷積神經(jīng)網(wǎng)絡(luò)的深入理解-基礎(chǔ)篇(卷積,激活,池化,誤差反傳)
1.特征提取的重要性
在LeNet提出后,卷積神經(jīng)網(wǎng)絡(luò)在計(jì)算機(jī)視覺(jué)和機(jī)器學(xué)習(xí)領(lǐng)域中很有名氣。但卷積神經(jīng)網(wǎng)絡(luò)并沒(méi)有主導(dǎo)這些領(lǐng)域。這是因?yàn)殡m然LeNet在小數(shù)據(jù)集上取得了很好的效果,但是在更大、更真實(shí)的數(shù)據(jù)集上訓(xùn)練卷積神經(jīng)網(wǎng)絡(luò)的性能和可行性還有待研究。
在計(jì)算機(jī)視覺(jué)中,直接將神經(jīng)網(wǎng)絡(luò)與其他機(jī)器學(xué)習(xí)方法進(jìn)行比較也許不公平。這是因?yàn)?#xff0c;卷積神經(jīng)網(wǎng)絡(luò)的輸入是由原始像素值或是經(jīng)過(guò)簡(jiǎn)單預(yù)處理(例如居中、縮放)的像素值組成的。但在使用傳統(tǒng)機(jī)器學(xué)習(xí)方法時(shí),從業(yè)者永遠(yuǎn)不會(huì)將原始像素作為輸入。在傳統(tǒng)機(jī)器學(xué)習(xí)方法中,計(jì)算機(jī)視覺(jué)流水線是由經(jīng)過(guò)人的手工精心設(shè)計(jì)的特征流水線組成的。對(duì)于這些傳統(tǒng)方法,大部分的進(jìn)展都來(lái)自于對(duì)特征有了更聰明的想法,并且學(xué)習(xí)到的算法往往歸于事后的解釋。
因此,與訓(xùn)練端到端(從像素到分類(lèi)結(jié)果)系統(tǒng)不同,經(jīng)典機(jī)器學(xué)習(xí)的流水線看起來(lái)更像下面這樣:
- 獲取一個(gè)有趣的數(shù)據(jù)集。在早期,收集這些數(shù)據(jù)集需要昂貴的傳感器(在當(dāng)時(shí)最先進(jìn)的圖像也就100萬(wàn)像素)。
- 根據(jù)光學(xué)、幾何學(xué)、其他知識(shí)以及偶然的發(fā)現(xiàn),手工對(duì)特征數(shù)據(jù)集進(jìn)行預(yù)處理。
- 通過(guò)標(biāo)準(zhǔn)的特征提取算法,如SIFT(尺度不變特征變換)和SURF(加速魯棒特征)或其他手動(dòng)調(diào)整的流水線來(lái)輸入數(shù)據(jù)。
- 將提取的特征送入最喜歡的分類(lèi)器中(例如線性模型或其它核方法),以訓(xùn)練分類(lèi)器。
然而,推動(dòng)領(lǐng)域進(jìn)步的是數(shù)據(jù)特征,而不是學(xué)習(xí)算法。計(jì)算機(jī)視覺(jué)研究人員相信,從對(duì)最終模型精度的影響來(lái)說(shuō),更大或更干凈的數(shù)據(jù)集、或是稍微改進(jìn)的特征提取,比任何學(xué)習(xí)算法帶來(lái)的進(jìn)步要大得多。
2.學(xué)習(xí)表征
(1)另一種預(yù)測(cè)這個(gè)領(lǐng)域發(fā)展的方法————觀察圖像特征的提取方法。在2012年前,圖像特征都是機(jī)械地計(jì)算出來(lái)的。事實(shí)上,設(shè)計(jì)一套新的特征函數(shù)、改進(jìn)結(jié)果,并撰寫(xiě)論文是盛極一時(shí)的潮流。SIFT 、SURF 、HOG(定向梯度直方圖)、bags of visual words和類(lèi)似的特征提取方法占據(jù)了主導(dǎo)地位。
(2)另一組研究人員,包括Yann LeCun、Geoff Hinton、Yoshua Bengio、Andrew Ng、Shun ichi Amari和Juergen Schmidhuber,想法則與眾不同:他們認(rèn)為特征本身應(yīng)該被學(xué)習(xí)。此外,他們還認(rèn)為,在合理地復(fù)雜性前提下,特征應(yīng)該由多個(gè)共同學(xué)習(xí)的神經(jīng)網(wǎng)絡(luò)層組成,每個(gè)層都有可學(xué)習(xí)的參數(shù)。在機(jī)器視覺(jué)中,最底層可能檢測(cè)邊緣、顏色和紋理。事實(shí)上,Alex Krizhevsky、Ilya Sutskever和Geoff Hinton提出了一種新的卷積神經(jīng)網(wǎng)絡(luò)變體AlexNet。在2012年ImageNet挑戰(zhàn)賽中取得了轟動(dòng)一時(shí)的成績(jī)。
有趣的是,在網(wǎng)絡(luò)的最底層,AlexNet模型學(xué)習(xí)到了一些類(lèi)似于傳統(tǒng)濾波器的特征抽取器。
AlexNet的更高層建立在這些底層表示的基礎(chǔ)上,以表示更大的特征,如眼睛、鼻子、草葉等等。而更高的層可以檢測(cè)整個(gè)物體,如人、飛機(jī)、狗或飛盤(pán)。最終的隱藏神經(jīng)元可以學(xué)習(xí)圖像的綜合表示,從而使屬于不同類(lèi)別的數(shù)據(jù)易于區(qū)分。盡管一直有一群執(zhí)著的研究者不斷鉆研,試圖學(xué)習(xí)視覺(jué)數(shù)據(jù)的逐級(jí)表征,然而很長(zhǎng)一段時(shí)間里這些嘗試都未有突破。深度卷積神經(jīng)網(wǎng)絡(luò)的突破出現(xiàn)在2012年。突破可歸因于兩個(gè)關(guān)鍵因素:數(shù)據(jù)和硬件(GPU)。
2.1 缺少的成分:數(shù)據(jù)
包含許多特征的深度模型需要大量的有標(biāo)簽數(shù)據(jù),才能顯著優(yōu)于基于凸優(yōu)化的傳統(tǒng)方法(如線性方法和核方法)。 然而,限于早期計(jì)算機(jī)有限的存儲(chǔ)和90年代有限的研究預(yù)算,大部分研究只基于小的公開(kāi)數(shù)據(jù)集。
例如,不少研究論文基于加州大學(xué)歐文分校(UCI)提供的若干個(gè)公開(kāi)數(shù)據(jù)集,其中許多數(shù)據(jù)集只有幾百至幾千張?jiān)诜亲匀画h(huán)境下以低分辨率拍攝的圖像。這一狀況在2010年前后興起的大數(shù)據(jù)浪潮中得到改善。
2009年,ImageNet數(shù)據(jù)集發(fā)布,并發(fā)起ImageNet挑戰(zhàn)賽:要求研究人員從100萬(wàn)個(gè)樣本中訓(xùn)練模型,以區(qū)分1000個(gè)不同類(lèi)別的對(duì)象。ImageNet數(shù)據(jù)集由斯坦福教授李飛飛小組的研究人員開(kāi)發(fā),利用谷歌圖像搜索(Google Image Search)對(duì)每一類(lèi)圖像進(jìn)行預(yù)篩選,并利用亞馬遜眾包(Amazon Mechanical Turk)來(lái)標(biāo)注每張圖片的相關(guān)類(lèi)別。這種規(guī)模是前所未有的。這項(xiàng)被稱為ImageNet的挑戰(zhàn)賽推動(dòng)了計(jì)算機(jī)視覺(jué)和機(jī)器學(xué)習(xí)研究的發(fā)展,挑戰(zhàn)研究人員確定哪些模型能夠在更大的數(shù)據(jù)規(guī)模下表現(xiàn)最好。
2.2 缺少的成分:硬件
深度學(xué)習(xí)對(duì)計(jì)算資源要求很高,訓(xùn)練可能需要數(shù)百個(gè)迭代輪數(shù),每次迭代都需要通過(guò)代價(jià)高昂的許多線性代數(shù)層傳遞數(shù)據(jù)。這也是為什么在20世紀(jì)90年代至21世紀(jì)初,優(yōu)化凸目標(biāo)的簡(jiǎn)單算法是研究人員的首選。然而,用GPU訓(xùn)練神經(jīng)網(wǎng)絡(luò)改變了這一格局。圖形處理器(Graphics Processing Unit,GPU)早年用來(lái)加速圖形處理,使電腦游戲玩家受益。GPU可優(yōu)化高吞吐量的 4×4 矩陣和向量乘法,從而服務(wù)于基本的圖形任務(wù)。幸運(yùn)的是,這些數(shù)學(xué)運(yùn)算與卷積層的計(jì)算驚人地相似。由此,英偉達(dá)(NVIDIA)和ATI已經(jīng)開(kāi)始為通用計(jì)算操作優(yōu)化gpu,甚至把它們作為通用GPU(general-purpose GPUs,GPGPU)來(lái)銷(xiāo)售。
3.AlexNet模型
論文:《ImageNet Classification with Deep ConvolutionalNeural Networks》
2012年,AlexNet橫空出世。它首次證明了學(xué)習(xí)到的特征可以超越手工設(shè)計(jì)的特征。它一舉打破了計(jì)算機(jī)視覺(jué)研究的現(xiàn)狀。 AlexNet使用了8層卷積神經(jīng)網(wǎng)絡(luò),并以很大的優(yōu)勢(shì)贏得了2012年ImageNet圖像識(shí)別挑戰(zhàn)賽。AlexNet已經(jīng)被更有效的架構(gòu)所超越,但它是從淺層網(wǎng)絡(luò)到深層網(wǎng)絡(luò)的關(guān)鍵一步。
完整的模型結(jié)構(gòu):
AlexNet和LeNet的架構(gòu)非常相似,這里提供的是一個(gè)稍微精簡(jiǎn)版本的AlexNet,去除了當(dāng)年需要兩個(gè)小型GPU同時(shí)運(yùn)算的設(shè)計(jì)特點(diǎn)。
AlexNet和LeNet對(duì)比:
AlexNet和LeNet的設(shè)計(jì)理念非常相似,但也存在顯著差異。
- AlexNet比相對(duì)較小的LeNet5要深得多。AlexNet由八層組成:五個(gè)卷積層、兩個(gè)全連接隱藏層和一個(gè)全連接輸出層。
- AlexNet使用ReLU而不是sigmoid作為其激活函數(shù)。
3.1模型設(shè)計(jì)
在AlexNet的第一層,卷積窗口的形狀是 11×11 。 由于ImageNet中大多數(shù)圖像的寬和高比MNIST圖像的多10倍以上,因此,需要一個(gè)更大的卷積窗口來(lái)捕獲目標(biāo)。 第二層中的卷積窗口形狀被縮減為 5×5
,然后是 3×3 。 此外,在第一層、第二層和第五層卷積層之后,加入窗口形狀為 3×3 、步幅為2的最大匯聚層。 而且,AlexNet的卷積通道數(shù)目是LeNet的10倍。
在最后一個(gè)卷積層后有兩個(gè)全連接層,分別有4096個(gè)輸出。 這兩個(gè)巨大的全連接層擁有將近1GB的模型參數(shù)。 由于早期GPU顯存有限,原版的AlexNet采用了雙數(shù)據(jù)流設(shè)計(jì),使得每個(gè)GPU只負(fù)責(zé)存儲(chǔ)和計(jì)算模型的一半?yún)?shù)。 幸運(yùn)的是,現(xiàn)在GPU顯存相對(duì)充裕,所以現(xiàn)在很少需要跨GPU分解模型。
現(xiàn)在只需要簡(jiǎn)化即可,即取一個(gè)GPU中的結(jié)構(gòu)即可。
3.2激活函數(shù)
AlexNet將sigmoid激活函數(shù)改為更簡(jiǎn)單的ReLU激活函數(shù)。 一方面,ReLU激活函數(shù)的計(jì)算更簡(jiǎn)單,它不需要如sigmoid激活函數(shù)那般復(fù)雜的求冪運(yùn)算。 另一方面,當(dāng)使用不同的參數(shù)初始化方法時(shí),ReLU激活函數(shù)使訓(xùn)練模型更加容易。 當(dāng)sigmoid激活函數(shù)的輸出非常接近于0或1時(shí),這些區(qū)域的梯度幾乎為0,因此反向傳播無(wú)法繼續(xù)更新一些模型參數(shù)。 相反,ReLU激活函數(shù)在正區(qū)間的梯度總是1。 因此,如果模型參數(shù)沒(méi)有正確初始化,sigmoid函數(shù)可能在正區(qū)間內(nèi)得到幾乎為0的梯度,從而使模型無(wú)法得到有效的訓(xùn)練。
3.3容量空值和預(yù)處理
AlexNet通過(guò)暫退法(DropOut)控制全連接層的模型復(fù)雜度,而LeNet只使用了權(quán)重衰減。 為了進(jìn)一步擴(kuò)充數(shù)據(jù),AlexNet在訓(xùn)練時(shí)增加了大量的圖像增強(qiáng)數(shù)據(jù),如翻轉(zhuǎn)、裁切和變色。 這使得模型更健壯,更大的樣本量有效地減少了過(guò)擬合。
Dropout、ReLU和預(yù)處理是提升計(jì)算機(jī)視覺(jué)任務(wù)性能的其他關(guān)鍵步驟。AlexNet已經(jīng)被更有效的架構(gòu)所超越,但它是從淺層網(wǎng)絡(luò)到深層網(wǎng)絡(luò)的關(guān)鍵一步。
3.4 模型結(jié)構(gòu)與定義
模型結(jié)構(gòu):
import tensorflow as tf
from d2l import tensorflow as d2ldef net():return tf.keras.models.Sequential([# 這里使用一個(gè)11*11的更大窗口來(lái)捕捉對(duì)象。# 同時(shí),步幅為4,以減少輸出的高度和寬度。# 另外,輸出通道的數(shù)目遠(yuǎn)大于LeNettf.keras.layers.Conv2D(filters=96, kernel_size=11, strides=4,activation='relu'),tf.keras.layers.MaxPool2D(pool_size=3, strides=2),# 減小卷積窗口,使用填充為2來(lái)使得輸入與輸出的高和寬一致,且增大輸出通道數(shù)tf.keras.layers.Conv2D(filters=256, kernel_size=5, padding='same',activation='relu'),tf.keras.layers.MaxPool2D(pool_size=3, strides=2),# 使用三個(gè)連續(xù)的卷積層和較小的卷積窗口。# 除了最后的卷積層,輸出通道的數(shù)量進(jìn)一步增加。# 在前兩個(gè)卷積層之后,匯聚層不用于減少輸入的高度和寬度tf.keras.layers.Conv2D(filters=384, kernel_size=3, padding='same',activation='relu'),tf.keras.layers.Conv2D(filters=384, kernel_size=3, padding='same',activation='relu'),tf.keras.layers.Conv2D(filters=256, kernel_size=3, padding='same',activation='relu'),tf.keras.layers.MaxPool2D(pool_size=3, strides=2),tf.keras.layers.Flatten(),# 這里,全連接層的輸出數(shù)量是LeNet中的好幾倍。使用dropout層來(lái)減輕過(guò)擬合tf.keras.layers.Dense(4096, activation='relu'),tf.keras.layers.Dropout(0.5),tf.keras.layers.Dense(4096, activation='relu'),tf.keras.layers.Dropout(0.5),# 最后是輸出層。由于這里使用Fashion-MNIST,所以用類(lèi)別數(shù)為10,而非論文中的1000tf.keras.layers.Dense(10)])
構(gòu)造一個(gè)高度和寬度都為224的(單通道數(shù)據(jù),來(lái)觀察每一層輸出的形狀)。 它與AlexNet架構(gòu)相匹配。
X = tf.random.uniform((1, 224, 224, 1))
for layer in net().layers:X = layer(X)print(layer.__class__.__name__, 'output shape:\t', X.shape)
Conv2D output shape: (1, 54, 54, 96)
MaxPooling2D output shape: (1, 26, 26, 96)
Conv2D output shape: (1, 26, 26, 256)
MaxPooling2D output shape: (1, 12, 12, 256)
Conv2D output shape: (1, 12, 12, 384)
Conv2D output shape: (1, 12, 12, 384)
Conv2D output shape: (1, 12, 12, 256)
MaxPooling2D output shape: (1, 5, 5, 256)
Flatten output shape: (1, 6400)
Dense output shape: (1, 4096)
Dropout output shape: (1, 4096)
Dense output shape: (1, 4096)
Dropout output shape: (1, 4096)
Dense output shape: (1, 10)
3.5 Fashion-MNIST數(shù)據(jù)上訓(xùn)練AlexNet
將AlexNet直接應(yīng)用于Fashion-MNIST的一個(gè)問(wèn)題是,Fashion-MNIST圖像的分辨率( 28×28 像素)低于ImageNet圖像。
為了解決這個(gè)問(wèn)題,將它們?cè)黾拥?224×224 (通常來(lái)講這不是一個(gè)明智的做法,但在這里這樣做是為了有效使用AlexNet架構(gòu))。 這里需要使用d2l.load_data_fashion_mnist
函數(shù)中的resize參數(shù)
執(zhí)行此調(diào)整。
batch_size = 128
train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size, resize=224)
這里使用更小的學(xué)習(xí)速率訓(xùn)練,這是因?yàn)榫W(wǎng)絡(luò)更深更廣、圖像分辨率更高,訓(xùn)練卷積神經(jīng)網(wǎng)絡(luò)就更昂貴。
lr, num_epochs = 0.01, 10
d2l.train_ch6(net, train_iter, test_iter, num_epochs, lr, d2l.try_gpu())
3.6一些注意事項(xiàng)
- 在AlexNet中,較大的卷積層和全連接層需要更多的計(jì)算資源,因?yàn)樗鼈兩婕案嗟木仃嚦朔ê图臃ㄟ\(yùn)算。
- 在AlexNet中,主要占用顯存的部分是大型的卷積層和全連接層,這些層通常需要大量的參數(shù)和中間計(jì)算結(jié)果。
- 修改批量大小可以影響訓(xùn)練的速度和模型精度,較大的批量大小通??梢詼p少訓(xùn)練時(shí)間,但也可能導(dǎo)致顯存占用較多。需要權(quán)衡以獲得最佳性能。
- Fashion-MNIST數(shù)據(jù)集相比于傳統(tǒng)的手寫(xiě)數(shù)字?jǐn)?shù)據(jù)集MNIST更加復(fù)雜,但相對(duì)于ImageNet這樣更大更復(fù)雜的數(shù)據(jù)集,Fashion-MNIST規(guī)模較小。AlexNet作為一個(gè)大型深度網(wǎng)絡(luò)對(duì)于這樣一個(gè)小數(shù)據(jù)集可能會(huì)顯得過(guò)于復(fù)雜,容易發(fā)生過(guò)擬合。
- 增加迭代輪數(shù)通常能夠使模型在訓(xùn)練集上學(xué)習(xí)更多的特征,提高泛化能力。與LeNet相比,增加迭代輪數(shù)的模型可能會(huì)更加精細(xì)地學(xué)習(xí)數(shù)據(jù)中的模式,產(chǎn)生更好的性能。
- 將Dropout和ReLU應(yīng)用于LeNet-5可以幫助減輕過(guò)擬合問(wèn)題并加速收斂,提升模型的泛化能力。預(yù)處理方法如數(shù)據(jù)歸一化、數(shù)據(jù)增強(qiáng)等也可以提升模型性能,使其更好地學(xué)習(xí)數(shù)據(jù)中的模式。