目錄
1. 深度學(xué)習(xí)機器學(xué)習(xí)的發(fā)展
1.1?核方法
1.2 幾何學(xué)
1.3 特征工程 opencv
1.4? Hardware
2. AlexNet
3. 代碼
1. 深度學(xué)習(xí)機器學(xué)習(xí)的發(fā)展
1.1?核方法
2001 Learning with Kernels 核方法 (機器學(xué)習(xí))
特征提取、選擇核函數(shù)來計算相似性、凸優(yōu)化問題、漂亮的定理
1.2 幾何學(xué)
2000 Multiple View Geometry in computer vision
抽取特征、描述集合、(非)凸優(yōu)化、漂亮定理、如果假設(shè)滿足了,效果非常好
1.3 特征工程 opencv
特征工程是關(guān)鍵、特征描述子:SIFT、SURF、視覺詞袋(聚類)、最后用
1.4? Hardware
從上到下依次為樣本大小、內(nèi)存大小、CPU速度
計算能力和算法能力在不同階段的發(fā)展能力導(dǎo)致大家在選取上有偏好
1.5 ImageNet
2010 ImageNet 物體分類數(shù)據(jù)集:自然物體的彩色圖片
2. AlexNet
丟棄法、Relu、MaxPooling
從LeNet(左)到AlexNet(右)
AlexNet和LeNet的設(shè)計理念非常相似,但也存在顯著差異。
-
AlexNet比相對較小的LeNet5要深得多。AlexNet由八層組成:五個卷積層、兩個全連接隱藏層和一個全連接輸出層?!拘录恿?層卷積層;更多的輸出通道;隱藏全連接層后新加了丟棄層】
-
AlexNet使用ReLU而不是sigmoid作為其激活函數(shù)。
-
更大的池化窗口、核窗口和步長;更多的輸出通道。
3. 代碼實現(xiàn)
3.1 模型設(shè)計
在AlexNet的第一層,卷積窗口的形狀是11×11。 由于ImageNet中大多數(shù)圖像的寬和高比MNIST圖像的多10倍以上,因此,需要一個更大的卷積窗口來捕獲目標(biāo)。 第二層中的卷積窗口形狀被縮減為5×5,然后是3×3。 此外,在第一層、第二層和第五層卷積層之后,加入窗口形狀為3×3、步幅為2的最大匯聚層。 而且,AlexNet的卷積通道數(shù)目是LeNet的10倍。
在最后一個卷積層后有兩個全連接層,分別有4096個輸出。 這兩個巨大的全連接層擁有將近1GB的模型參數(shù)。 由于早期GPU顯存有限,原版的AlexNet采用了雙數(shù)據(jù)流設(shè)計,使得每個GPU只負責(zé)存儲和計算模型的一半?yún)?shù)。 幸運的是,現(xiàn)在GPU顯存相對充裕,所以現(xiàn)在很少需要跨GPU分解模型(因此,本書的AlexNet模型在這方面與原始論文稍有不同)。
3.2 激活函數(shù)
此外,AlexNet將sigmoid激活函數(shù)改為更簡單的ReLU激活函數(shù)。 一方面,ReLU激活函數(shù)的計算更簡單,它不需要如sigmoid激活函數(shù)那般復(fù)雜的求冪運算。 另一方面,當(dāng)使用不同的參數(shù)初始化方法時,ReLU激活函數(shù)使訓(xùn)練模型更加容易。 當(dāng)sigmoid激活函數(shù)的輸出非常接近于0或1時,這些區(qū)域的梯度幾乎為0,因此反向傳播無法繼續(xù)更新一些模型參數(shù)。 相反,ReLU激活函數(shù)在正區(qū)間的梯度總是1。 因此,如果模型參數(shù)沒有正確初始化,sigmoid函數(shù)可能在正區(qū)間內(nèi)得到幾乎為0的梯度,從而使模型無法得到有效的訓(xùn)練。
3.3 容量控制和預(yù)處理
AlexNet通過暫退法(?4.6節(jié))控制全連接層的模型復(fù)雜度,而LeNet只使用了權(quán)重衰減。 為了進一步擴充數(shù)據(jù),AlexNet在訓(xùn)練時增加了大量的圖像增強數(shù)據(jù),如翻轉(zhuǎn)、裁切和變色。 這使得模型更健壯,更大的樣本量有效地減少了過擬合。
import torch
from torch import nn
from d2l import torch as d2l
net = nn.Sequential(
# 這里使用一個11*11的更大窗口來捕捉對象。
# 同時,步幅為4,以減少輸出的高度和寬度。
# 另外,輸出通道的數(shù)目遠大于LeNet
nn.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層來減輕過擬合
nn.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,而非論文中的1000
nn.Linear(4096, 10))
我們構(gòu)造一個高度和寬度都為224的單通道數(shù)據(jù),來觀察每一層輸出的形狀。 它與?圖7.1.2中的AlexNet架構(gòu)相匹配。
X = torch.randn(1, 1, 224, 224)
for layer in net:
X=layer(X)
print(layer.__class__.__name__,'output shape:\t',X.shape)
Conv2d output shape: torch.Size([1, 96, 54, 54]) ReLU output shape: torch.Size([1, 96, 54, 54]) MaxPool2d output shape: torch.Size([1, 96, 26, 26]) Conv2d output shape: torch.Size([1, 256, 26, 26]) ReLU output shape: torch.Size([1, 256, 26, 26]) MaxPool2d output shape: torch.Size([1, 256, 12, 12]) Conv2d output shape: torch.Size([1, 384, 12, 12]) ReLU output shape: torch.Size([1, 384, 12, 12]) Conv2d output shape: torch.Size([1, 384, 12, 12]) ReLU output shape: torch.Size([1, 384, 12, 12]) Conv2d output shape: torch.Size([1, 256, 12, 12]) ReLU output shape: torch.Size([1, 256, 12, 12]) MaxPool2d output shape: torch.Size([1, 256, 5, 5]) Flatten output shape: torch.Size([1, 6400]) Linear output shape: torch.Size([1, 4096]) ReLU output shape: torch.Size([1, 4096]) Dropout output shape: torch.Size([1, 4096]) Linear output shape: torch.Size([1, 4096]) ReLU output shape: torch.Size([1, 4096]) Dropout output shape: torch.Size([1, 4096]) Linear output shape: torch.Size([1, 10])
3.4 讀取數(shù)據(jù)集
盡管原文中AlexNet是在ImageNet上進行訓(xùn)練的,但本書在這里使用的是Fashion-MNIST數(shù)據(jù)集。因為即使在現(xiàn)代GPU上,訓(xùn)練ImageNet模型,同時使其收斂可能需要數(shù)小時或數(shù)天的時間。 將AlexNet直接應(yīng)用于Fashion-MNIST的一個問題是,F(xiàn)ashion-MNIST圖像的分辨率(28×28像素)低于ImageNet圖像。 為了解決這個問題,我們將它們增加到224×224(通常來講這不是一個明智的做法,但在這里這樣做是為了有效使用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)
3.5 訓(xùn)練AlexNet
lr, num_epochs = 0.01, 10
d2l.train_ch6(net, train_iter, test_iter, num_epochs, lr, d2l.try_gpu())
4. 小結(jié)
-
AlexNet的架構(gòu)與LeNet相似,但使用了更多的卷積層和更多的參數(shù)來擬合大規(guī)模的ImageNet數(shù)據(jù)集。
-
今天,AlexNet已經(jīng)被更有效的架構(gòu)所超越,但它是從淺層網(wǎng)絡(luò)到深層網(wǎng)絡(luò)的關(guān)鍵一步。
-
盡管AlexNet的代碼只比LeNet多出幾行,但學(xué)術(shù)界花了很多年才接受深度學(xué)習(xí)這一概念,并應(yīng)用其出色的實驗結(jié)果。這也是由于缺乏有效的計算工具。文章來源:http://www.zghlxwxcb.cn/news/detail-838735.html
-
Dropout、ReLU和預(yù)處理是提升計算機視覺任務(wù)性能的其他關(guān)鍵步驟。文章來源地址http://www.zghlxwxcb.cn/news/detail-838735.html
到了這里,關(guān)于24 深度卷積神經(jīng)網(wǎng)絡(luò) AlexNet【李沐動手學(xué)深度學(xué)習(xí)v2課程筆記】(備注:含AlexNet和LeNet對比)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!