AlexNet
Why AlexNet very good?
- 為什么Alexnet能在圖2012 ImageNet LSVRC-2012 像識(shí)別(分類) competition取得這么好的成績(jī)
- Alexnet的網(wǎng)絡(luò)結(jié)構(gòu)以及,參數(shù)數(shù)量的計(jì)算
- 為了避免過擬合使用的技巧: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ì)搞出來如此大的標(biāo)注數(shù)據(jù)集合ImageNet;
GPU,這種高度并行的計(jì)算神器確實(shí)助了洪荒之力,沒有神器在手,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è)圖,但是看起來很不直觀):
下面給出兩個(gè)更好理解的結(jié)構(gòu)圖,5個(gè)卷積層+3個(gè)全連接層:
來源:stackoverflow
https://www.learnopencv.com/understanding-alexnet/
各層的參數(shù)計(jì)算如下,下圖為5個(gè)卷積層的參數(shù):
全連接層如下:
可以看到:卷積層的參數(shù)明顯少于全連接層的參數(shù)。其中,網(wǎng)絡(luò)大概有62.3 million parameters,其中卷積層占比約6%,單占比95%的計(jì)算。
- 為了避免過擬合使用的技巧: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à)小很多。
減輕梯度消失問題,從而可以訓(xùn)練更深的網(wǎng)絡(luò)。
稀疏性 通過對(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ù)有利于避免過擬合。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ū)別),問題來源: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