PyTorch 官方教程:擼一個神經網路

語言: CN / TW / HK

本文為 PyTorch 官方教程中:如何構建神經網路。基於 PyTorch 專門構建神經網路的子模組 torch.nn 構建一個簡單的神經網路。

完整教程執行 codelab

torch.nn 文件

神經網路由對資料執行操作的層/模組組成。torch.nn 提供了構建神經網路所需的所有模組。

PyTorch 中的每個模組都是 nn.module 的子類。 在下面的部分中,我們將構建一個神經網路來進行10種類別的分類。

建立神經網路

神經網路由對資料執行操作的層/模組組成。torch.nn 提供了構建神經網路所需的所有模組。PyTorch 中的每個模組都是 nn.module 的子類。 在下面的部分中,我們將構建一個神經網路來進行10種類別的分類。

import os import torch from torch import nn from torch.utils.data import DataLoader from torchvision import datasets, transforms

載入訓練裝置

我們希望能夠在硬體加速器,比如 GPU 上訓練我們的模型。可以通過 torch.cuda 來檢測 GPU 是否可用。

device = 'cuda' if torch.cuda.is_available() else 'cpu' #檢測gpu是否可用,不可用使用cpu print('Using {} device'.format(device)) #輸出使用裝置型別

定義類

我們通過 nn.Module 來定義神經網路,並在__init__ 中初始化神經網路。每個 nn.Module 子類在 forward 方法中實現對輸入資料的操作。

``` class NeuralNetwork(nn.Module): def init(self): #定義網路結構 super(NeuralNetwork, self).init() self.flatten = nn.Flatten() self.linear_relu_stack = nn.Sequential( nn.Linear(28*28, 512), nn.ReLU(), nn.Linear(512, 512), nn.ReLU(), nn.Linear(512, 10), nn.ReLU() )

def forward(self, x): #前向傳播
    x = self.flatten(x)
    logits = self.linear_relu_stack(x)
    return logits

```

在使用模型前需要先例項化模型,並將其移動到 GPU 上

model = NeuralNetwork().to(device) #例項化模型 print(model)

為了在模型的輸入和輸出之間建立複雜的非線性對映,需要使用非線性的啟用函式。

它們線上性變換後引入非線性,幫助神經網路學習各種各樣的複雜對映。在這個模型中,我們線上性層之間使用 nn.ReLU,也可以使用其他啟用函式來引入非線性。

X = torch.rand(1, 28, 28, device=device) #生成(1,28,28)的資料 logits = model(X) #向模型輸入資料 pred_probab = nn.Softmax(dim=1)(logits) #呼叫softmax 將預測值對映為(0,1)間的概率 y_pred = pred_probab.argmax(1) #最大概率對應分類 print(f"Predicted class: {y_pred}")

神經網路各層說明

接下來,我們分解網路來具體講述每一層的功能。

為了說明這一點,我們將取小批量的3個尺寸為28x28的影象樣本輸入網路

input_image = torch.rand(3,28,28) #生成(3,28,28)的資料 print(input_image.size())

nn.Flatten 層

Flatten 層用來把多維的輸入一維化,常用在從卷積層到全連線層的過渡。

nn.Flatten 層,可以將每個 28x28 影象轉換 784 ($28\times 28=784$)個畫素值的連續陣列(批量維度保持為3)。

flatten = nn.Flatten() flat_image = flatten(input_image) #(3,28,28)轉換為(3,784) print(flat_image.size())

nn.Linear 層

nn.Linear 層,即線性層,是一個使用權重和偏差對輸入資料作線性變換的模組。

layer1 = nn.Linear(in_features=28*28, out_features=20) #輸入(3,28*28) 輸出(3,20) hidden1 = layer1(flat_image) print(hidden1.size())

nn.ReLU 層

為了在模型的輸入和輸出之間建立複雜的非線性對映,需要使用非線性的啟用函式。它們線上性變換後引入非線性,幫助神經網路學習各種各樣的複雜對映。

在這個模型中,我們線上性層之間使用 nn.ReLU,也可以使用其他啟用函式來引入非線性。

print(f"Before ReLU: {hidden1}\n\n") hidden1 = nn.ReLU()(hidden1) print(f"After ReLU: {hidden1}")

nn.Sequential 層

神經網路的最後一個線性層返回 logits,即值域區間在$[-\infty,\infty]$中的原始值。這些值傳遞給nn.Softmax模組後,logit被縮放為$[0,1]$區間中,表示模型對每個類的預測概率。

dim引數表示每一維度進行運算的位置,運算結果相加為1。

softmax = nn.Softmax(dim=1) pred_probab = softmax(logits)

輸出模型結構

神經網路中的許多層都是引數化的,即具有相關聯的權重和偏差,這些引數在訓練中被迭代優化。

子類 nn.Module 自動跟蹤模型物件內部定義的所有欄位,並使用模型的 parameters() 或 named_parameters() 方法訪問所有引數。

我們可以通過模型迭代每個引數,並輸出其尺寸和值。

``` print("Model structure: ", model, "\n\n")

for name, param in model.named_parameters(): print(f"Layer: {name} | Size: {param.size()} | Values : {param[:2]} \n") ```

最終輸出結果可訪問完整教程