AlexNet
Why AlexNet very good?
- 為什么Alexnet能在圖2012 ImageNet LSVRC-2012 像識(shí)別(分類) competition取得這么好的成績(jī)
- Alexnet的網(wǎng)絡(luò)結(jié)構(gòu)以及偷办,參數(shù)數(shù)量的計(jì)算
- 為了避免過(guò)擬合使用的技巧:Data Augmentation(數(shù)據(jù)增強(qiáng))凑耻,正則化Relu以及dropout,局部響應(yīng)歸一化LRN居灯。
- 對(duì)比了多個(gè)小的卷積核和大的卷積核的區(qū)別(前面BAT面試題)穗熬。
- Alexnet取得成功的原因珍剑,主要三條:
大量數(shù)據(jù),Deep Learning領(lǐng)域應(yīng)該感謝李飛飛團(tuán)隊(duì)搞出來(lái)如此大的標(biāo)注數(shù)據(jù)集合ImageNet死陆;
GPU招拙,這種高度并行的計(jì)算神器確實(shí)助了洪荒之力,沒(méi)有神器在手措译,Alex估計(jì)不敢搞太復(fù)雜的模型别凤;
算法的改進(jìn),包括網(wǎng)絡(luò)變深领虹、數(shù)據(jù)增強(qiáng)规哪、ReLU、Dropout等塌衰。
- Alexnet網(wǎng)絡(luò)結(jié)構(gòu)以及參數(shù)數(shù)量的計(jì)算
Alexnet網(wǎng)絡(luò)的大體結(jié)構(gòu)如下(論文以及一般的blog都是如下這個(gè)圖诉稍,但是看起來(lái)很不直觀):
下面給出兩個(gè)更好理解的結(jié)構(gòu)圖,5個(gè)卷積層+3個(gè)全連接層:
來(lái)源:stackoverflow
https://www.learnopencv.com/understanding-alexnet/
各層的參數(shù)計(jì)算如下最疆,下圖為5個(gè)卷積層的參數(shù):
全連接層如下:
可以看到:卷積層的參數(shù)明顯少于全連接層的參數(shù)杯巨。其中,網(wǎng)絡(luò)大概有62.3 million parameters努酸,其中卷積層占比約6%服爷,單占比95%的計(jì)算。
- 為了避免過(guò)擬合使用的技巧:Data Augmentation(數(shù)據(jù)增強(qiáng))获诈,正則化Relu以及dropout
- 1 Data Augmentation(數(shù)據(jù)增強(qiáng))
數(shù)據(jù)增強(qiáng)簡(jiǎn)單的辦法如仍源,圖片翻轉(zhuǎn)Mirroring,隨機(jī)裁剪Random Crops舔涎。
- 2 使用ReLU非線性激活函數(shù)
使用ReLU非線性激活函數(shù)而不選擇sigmoid或tanh函數(shù)笼踩,ReLU優(yōu)勢(shì)在于:
速度快 和sigmoid函數(shù)需要計(jì)算指數(shù)和倒數(shù)相比,relu函數(shù)其實(shí)就是一個(gè)max(0,x)亡嫌,計(jì)算代價(jià)小很多嚎于。
減輕梯度消失問(wèn)題桶至,從而可以訓(xùn)練更深的網(wǎng)絡(luò)。
稀疏性 通過(guò)對(duì)大腦的研究發(fā)現(xiàn)匾旭,大腦在工作的時(shí)候只有大約5%的神經(jīng)元是激活的,而采用sigmoid激活函數(shù)的人工神經(jīng)網(wǎng)絡(luò)圃郊,其激活率大約是50%价涝。有論文聲稱人工神經(jīng)網(wǎng)絡(luò)在15%-30%的激活率時(shí)是比較理想的。因?yàn)閞elu函數(shù)在輸入小于0時(shí)是完全不激活的持舆,因此可以獲得一個(gè)更低的激活率.
- 3 使用Dropout(只在最后幾個(gè)全連接層做)
為什么Dropout有效色瘩?
Dropout背后理念和集成模型很相似。在Drpout層逸寓,不同的神經(jīng)元組合被關(guān)閉居兆,這代表了一種不同的結(jié)構(gòu),所有這些不同的結(jié)構(gòu)使用一個(gè)的子數(shù)據(jù)集并行地帶權(quán)重訓(xùn)練竹伸,而權(quán)重總和為1泥栖。如果Dropout層有 n 個(gè)神經(jīng)元,那么會(huì)形成 2^{n} 個(gè)不同的子結(jié)構(gòu)勋篓。在預(yù)測(cè)時(shí)吧享,相當(dāng)于集成這些模型并取均值。這種結(jié)構(gòu)化的模型正則化技術(shù)有利于避免過(guò)擬合譬嚣。Dropout有效的另外一個(gè)視點(diǎn)是:由于神經(jīng)元是隨機(jī)選擇的钢颂,所以可以減少神經(jīng)元之間的相互依賴,從而確保提取出相互獨(dú)立的重要特征拜银。
- 4 局部響應(yīng)歸一化LRN(Local Response Normalization)
提出了LRN層殊鞭,對(duì)局部神經(jīng)元的活動(dòng)創(chuàng)建競(jìng)爭(zhēng)機(jī)制,使得其中響應(yīng)比較大的值變得相對(duì)更大尼桶,并抑制其他反饋較小的神經(jīng)元操灿,增強(qiáng)了模型的泛化能力。
補(bǔ)充
2個(gè)33的卷積層和一個(gè)55卷積層的區(qū)別泵督?(某BAT的一個(gè)面試題牲尺,也可以理解為多個(gè)小的卷積層和一個(gè)大的卷積層的區(qū)別),問(wèn)題來(lái)源:stackoverflow幌蚊,VGG中給出了答案谤碳,如下:
多個(gè)卷積層可以增加網(wǎng)絡(luò)的深度,從而學(xué)習(xí)更復(fù)雜的特征
2個(gè)33的卷積層的參數(shù)少于一個(gè)55卷積層的參數(shù)
code:
class AlexNet(nn.Module):
def __init__(self, num_classes=1000):
super().__init__()
self.features = nn.Sequential(
nn.Conv2d(3, 64, kernel_size=11, stride=4, padding=2),
nn.ReLU(inplace=True),
nn.MaxPool2d(kernel_size=3, stride=2),
nn.Conv2d(64, 192, kernel_size=5, padding=2),
nn.ReLU(inplace=True),
nn.MaxPool2d(kernel_size=3, stride=2),
nn.Conv2d(192, 384, kernel_size=3, padding=1),
nn.ReLU(inplace=True),
nn.Conv2d(384, 256, kernel_size=3, padding=1),
nn.ReLU(inplace=True),
nn.Conv2d(256, 256, kernel_size=3, padding=1),
nn.ReLU(inplace=True),
nn.MaxPool2d(kernel_size=3, stride=2),
)
self.avgpool = nn.AdaptiveAvgPool2d((6, 6))
self.classifier = nn.Sequential(
nn.Dropout(),
nn.Linear(256 * 6 * 6, 4096),
nn.ReLU(inplace=True),
nn.Dropout(),
nn.Linear(4096, 4096),
nn.ReLU(inplace=True),
nn.Linear(4096, num_classes),
)
def forward(self, x):
x = self.features(x)
x = self.avgpool(x)
x = torch.flatten(x, 1)
x = self.classifier(x)
return x
文章引用于 FishBear_move_on
編輯 Lornatang
校準(zhǔn) Lornatang