Python深度學習pytorch卷積神經網絡LeNet
在本節中,我們將介紹LeNet,它是最早發佈的卷積神經網絡之一。這個模型是由AT&T貝爾實驗室的研究院Yann LeCun在1989年提出的(並以其命名),目的是識別手寫數字。當時,LeNet取得瞭與支持向量機性能相媲美的成果,成為監督學習的主流方法。LeNet被廣泛用於自動取款機中,幫助識別處理支票的數字。
LeNet
總體來看,LeNet(LeNet-5)由兩個部分組成:
- 卷積編碼器: 由兩個卷積層組成
- 全連接層密集快: 由三個全連接層組成
每個卷積塊中的基本單元是一個卷積層、一個sigmoid激活函數和平均池化層。這裡,雖然ReLU和最大池化層更有效,但它們在20世紀90年代還沒有出現。每個卷積層使用 5 × 5 5\times5 5×5卷積核和一個sigmoid激活函數。這些層將輸入映射到多個二維特征輸出,通常同時增加通道的數量。第一卷積層有6個輸出通道,而第二個卷積層有16個輸出通道。每個 2 × 2 2\times2 2×2池操作通過空間下采樣將維數減少4倍。
為瞭將卷積塊中的輸出傳遞給稠密塊,我們必須在小批量中戰平每個樣本。LeNet的稠密快有三個全連接層,分別有120、84和10個輸出。因為我們仍在執行分類,所以輸出層的10維對應於最後輸出結果的數量。
通過下面的LeNet代碼,我們會相信深度學習框架實現此類模型非常簡單。我們隻需要實例化一個Sequential塊並將需要的層連接在一起。
import torch from torch import nn from d2l import torch as d2l class Reshape(torch.nn.Module): def forward(self, x): return x.view(-1, 1, 28, 28) net = torch.nn.Sequential( Reshape(), nn.Conv2d(1, 6, kernel_size=5, padding=2), nn.Sigmoid(), nn.AvgPool2d(kernel_size=2, stride=2), nn.Conv2d(6, 16, kernel_size=5), nn.Sigmoid(), nn.AvgPool2d(kernel_size=2, stride=2), nn.Flatten(), nn.Linear(16 * 5 * 5, 120), nn.Sigmoid(), nn.Linear(120, 84), nn.Sigmoid(), nn.Linear(84, 10) )
我們對原始模型做瞭一點小改動,去掉瞭最後一層的高斯激活。除此之外,這個網絡與最初的LeNet-5一致。下面,我們將一個大小為 28 × 28 28\times28 28×28的單通道(黑白)圖像通過LeNet。通過在每一層打印輸出的形狀,我們可以檢查模型,以確保其操作與我們期望的下圖一致。
X = torch.rand(size=(1, 1, 28, 28), dtype=torch.float32) for layer in net: X = layer(X) print(layer.__class__.__name__, 'output shape: \t', X.shape)
Reshape output shape: torch.Size([1, 1, 28, 28]) Conv2d output shape: torch.Size([1, 6, 28, 28]) Sigmoid output shape: torch.Size([1, 6, 28, 28]) AvgPool2d output shape: torch.Size([1, 6, 14, 14]) Conv2d output shape: torch.Size([1, 16, 10, 10]) Sigmoid output shape: torch.Size([1, 16, 10, 10]) AvgPool2d output shape: torch.Size([1, 16, 5, 5]) Flatten output shape: torch.Size([1, 400]) Linear output shape: torch.Size([1, 120]) Sigmoid output shape: torch.Size([1, 120]) Linear output shape: torch.Size([1, 84]) Sigmoid output shape: torch.Size([1, 84]) Linear output shape: torch.Size([1, 10])
請註意,在整個卷積塊中,與上一層相比,每一層特征的高度和寬度都減小瞭。第一個卷積層使用2個像素的填充,來補償 5 × 5 卷積核導致的特征減少。相反,第二個卷積層沒有填充,因此高度和寬度都減少瞭4個像素。隨著層疊的上升,通道的數量從輸入時的1個,增加到第一個卷積層之後的6個,再到第二個卷積層之後的16個。同時,每個匯聚層的高度和寬度都減半。最後,每個全連接層減少維度,最終輸出一個維數與結果分類數相匹配的輸出。
模型訓練
現在我們已經實現瞭LeNet,讓我們看看LeNet在Fashion-MNIST數據集上的表現。
batch_size = 256 train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size = batch_size)
雖然卷積神經網絡的參數較少,但與深度的多層感知機相比,它們的計算成本仍然很高,因為每個參數都參與更多的乘法。
如果我們有機會使用GPU,可以用它加快訓練。
以上就是Python深度學習pytorch卷積神經網絡LeNet的詳細內容,更多關於pytorch卷積神經網絡LeNet的資料請關註WalkonNet其它相關文章!
推薦閱讀:
- Python編程pytorch深度卷積神經網絡AlexNet詳解
- Python深度學習pytorch神經網絡塊的網絡之VGG
- Python LeNet網絡詳解及pytorch實現
- Pytorch寫數字識別LeNet模型
- PyTorch零基礎入門之構建模型基礎