- PyTorch 教程
- PyTorch - 首頁
- PyTorch - 簡介
- PyTorch - 安裝
- 神經網路的數學基礎
- PyTorch - 神經網路基礎
- 機器學習的通用工作流程
- 機器學習與深度學習
- 實現第一個神經網路
- 神經網路到功能塊
- PyTorch - 術語
- PyTorch - 載入資料
- PyTorch - 線性迴歸
- PyTorch - 卷積神經網路
- PyTorch - 迴圈神經網路
- PyTorch - 資料集
- PyTorch - 卷積網路簡介
- 從零開始訓練卷積網路
- PyTorch - 卷積網路中的特徵提取
- PyTorch - 卷積網路的視覺化
- 使用卷積網路進行序列處理
- PyTorch - 詞嵌入
- PyTorch - 遞迴神經網路
- PyTorch 有用資源
- PyTorch - 快速指南
- PyTorch - 有用資源
- PyTorch - 討論
PyTorch - 卷積神經網路
深度學習是機器學習的一個分支,被認為是近幾十年來研究人員取得的關鍵一步。深度學習實現的例子包括影像識別和語音識別等應用。
下面列出了兩種重要的深度神經網路型別:
- 卷積神經網路
- 迴圈神經網路。
本章我們將重點介紹第一種型別,即卷積神經網路 (CNN)。
卷積神經網路
卷積神經網路旨在透過多層陣列處理資料。這種型別的神經網路用於影像識別或人臉識別等應用。
CNN 與任何其他普通神經網路的主要區別在於,CNN 將輸入作為二維陣列,直接對影像進行操作,而不是像其他神經網路那樣關注特徵提取。
CNN 的主要方法包括解決識別問題。谷歌和 Facebook 等頂級公司已投資於識別專案的研發專案,以更快地完成活動。
每個卷積神經網路都包含三個基本思想:
- 區域性感受野
- 卷積
- 池化
讓我們詳細瞭解這些術語。
區域性感受野
CNN 利用輸入資料中存在的空間相關性。神經網路的併發層中的每一個都連線一些輸入神經元。這個特定區域稱為區域性感受野。它只關注隱藏神經元。隱藏神經元將處理上述區域內的輸入資料,而不會意識到特定邊界之外的變化。
區域性感受野生成的圖表如下:
卷積
在上圖中,我們觀察到每個連線學習隱藏神經元與從一層到另一層的關聯連線的權重。在這裡,單個神經元會不時地進行移位。這個過程稱為“卷積”。
從輸入層到隱藏特徵圖的連線對映定義為“共享權重”,包含的偏差稱為“共享偏差”。
池化
卷積神經網路使用池化層,這些層位於 CNN 宣告之後。它將使用者的輸入作為來自卷積網路的特徵圖,並準備一個精簡的特徵圖。池化層有助於建立具有先前層神經元的層。
PyTorch 的實現
以下步驟用於使用 PyTorch 建立卷積神經網路。
步驟 1
匯入建立簡單神經網路所需的包。
from torch.autograd import Variable import torch.nn.functional as F
步驟 2
建立一個具有卷積神經網路批量表示的類。我們的輸入 x 的批次形狀的維度為 (3, 32, 32)。
class SimpleCNN(torch.nn.Module):
def __init__(self):
super(SimpleCNN, self).__init__()
#Input channels = 3, output channels = 18
self.conv1 = torch.nn.Conv2d(3, 18, kernel_size = 3, stride = 1, padding = 1)
self.pool = torch.nn.MaxPool2d(kernel_size = 2, stride = 2, padding = 0)
#4608 input features, 64 output features (see sizing flow below)
self.fc1 = torch.nn.Linear(18 * 16 * 16, 64)
#64 input features, 10 output features for our 10 defined classes
self.fc2 = torch.nn.Linear(64, 10)
步驟 3
計算第一次卷積的啟用大小從 (3, 32, 32) 更改為 (18, 32, 32)。
維度大小從 (18, 32, 32) 更改為 (18, 16, 16)。由於神經網路輸入層的維度重塑,大小從 (18, 16, 16) 更改為 (1, 4608)。
回想一下,-1 從其他給定維度推斷出此維度。
def forward(self, x): x = F.relu(self.conv1(x)) x = self.pool(x) x = x.view(-1, 18 * 16 *16) x = F.relu(self.fc1(x)) #Computes the second fully connected layer (activation applied later) #Size changes from (1, 64) to (1, 10) x = self.fc2(x) return(x)