Pytorch 深度卷积神经网络 AlexNet
Pytorch 深度卷積神經網絡 AlexNet
0. 環境介紹
環境使用 Kaggle 里免費建立的 Notebook
教程使用李沐老師的 動手學深度學習 網站和 視頻講解
小技巧:當遇到函數看不懂的時候可以按 Shift+Tab 查看函數詳解。
1. AlexNet
1.1 簡介
在 2012 2012 2012 年之前,圖像特征都是機械地算出來的。如 SIFT、SURF、HOG(定向梯度直方圖)等特征提取方法占據主導地位。然后使用視覺詞袋(聚類),最后用 SVM 進行分類。
另一個方面,一些研究人員認為特征本身應該被學習。在合理地復雜性前提下,特征應該由多個共同學習的神經網絡層組成,每個層都有可學習的參數。在機器視覺中,最底層可能檢測邊緣、顏色和紋理。
由此,AlexNet 被提出,在2012年ImageNet挑戰賽中取得了轟動一時的成績。
AlexNet 論文地址:http://papers.nips.cc/paper/4824-imagenet-classification-with-deep-convolutional-neural-networks.pdf
相對于 LeNet 主要改進:
- Dropout 丟棄法
- ReLU 激活函數
- MaxPooling 最大池化
AlexNet 引起了 CV 方法論的改變:
1.2 AlexNet 結構
與 LeNet 對比(左為 LeNet,右為 AlexNet):
AlexNet 使用了更大的池化窗口,并且使用最大池化層,更大的卷積核窗口和步長,因為圖片更大了(LeNet 輸入為 28 × 28 28 \times 28 28×28,AlexNet 輸入為 3 × 224 × 224 3\times 224 \times 224 3×224×224)。
新加了 3 3 3 層卷積層,并且使用更多的輸出通道。
全連接層最后輸出是 1000 1000 1000 。
激活函數從 sigmoid 換成 ReLU(減緩梯度消失)。
隱藏全連接層后加入了 Dropout。
使用了數據增強(旋轉,截取等操作),增強魯棒性。(很重要!)
AlexNet 參數數量是 LetNet 的 10 10 10 倍,計算復雜度是 260 260 260 倍。
2. 代碼實現
在 kaggle 上記得調成使用 GPU,CPU 太慢了。
2.1 網絡結構
為節省訓練時間,對 AlexNet 進行一些修改,使用 Fashion-MNIST 數據集,所以先設置通道為 1,等會需要對數據集的形狀 28 × 28 28 \times 28 28×28 resize 為 224 × 224 224 \times 224 224×224:
!pip install -U d2l import torch from torch import nn from d2l import torch as d2lnet = nn.Sequential(# 這里,我們使用一個11*11的更大窗口來捕捉對象。# 同時,步幅為4,以減少輸出的高度和寬度。# 另外,輸出通道的數目遠大于LeNetnn.Conv2d(1, 96, kernel_size=11, stride=4, padding=1), nn.ReLU(),nn.MaxPool2d(kernel_size=3, stride=2),# 減小卷積窗口,使用填充為2來使得輸入與輸出的高和寬一致,且增大輸出通道數nn.Conv2d(96, 256, kernel_size=5, padding=2), nn.ReLU(),nn.MaxPool2d(kernel_size=3, stride=2),# 使用三個連續的卷積層和較小的卷積窗口。# 除了最后的卷積層,輸出通道的數量進一步增加。# 在前兩個卷積層之后,匯聚層不用于減少輸入的高度和寬度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(),# 這里,全連接層的輸出數量是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,所以用類別數為10,而非論文中的1000nn.Linear(4096, 10)) X = torch.randn(1, 1, 224, 224) for layer in net:X=layer(X)print(layer.__class__.__name__,'output shape:\t',X.shape)2.2 加載 Fashion-MNIST 數據集并 resize
這是為了節省時間,實際上 AlexNet 論文中是在 ImageNet 上進行訓練的,將 Fashion-MNIST 數據集的形狀 28 × 28 28 \times 28 28×28 resize 為 224 × 224 224 \times 224 224×224:
batch_size = 128 train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size, resize=224)2.3 訓練
lr, num_epochs = 0.01, 10 d2l.train_ch6(net, train_iter, test_iter, num_epochs, lr, d2l.try_gpu())
精度相對于 LeNet 有提高。
總結
以上是生活随笔為你收集整理的Pytorch 深度卷积神经网络 AlexNet的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: symbian epoc 模拟器与真机的
- 下一篇: Java---“世界上最好的语言”之入门