Pytorch筆記02-torch.nn以及torch.optim
0.本章內容
Pytorch中集成了許多現成的模塊,如包torch.nn中,集成了一些常見的網路層,如卷積等;包torch.optim中集成了許多常用的優化演算法,如SGD,Adam等。本章將就torch.nn以及torch.optim做簡要介紹。
1.torch.nn
直觀理解
- 在keras、TFLearn等高級的深度學習集成庫中,將許多計算進行更加高級的封裝
- torch.nn包內就是類似這種高級封裝,裡面包括了卷積,池化,RNN等計算,以及其他如Loss計算,可以把torch.nn包內的各個類想像成神經網路的一層
- 創建一個torch.nn中的層後,對其輸入Variable,將得到對應輸出的Variable,具體例子見下示例
- 它的作用包括,能夠接受一個輸入,並得到一個輸出(forward操作)。同時,他保存了該層學習的參數,以及其他的一些狀態變數
- 這種方式將網路高度模塊化,使得網路的每個運算都像積木一樣一層又一層疊加。
實現機制
- torch.nn包裡面的大部分類都是繼承了父類torch.nn.Modules,即本質上所有torch.nn中的層(如卷積、池化)都是torch.nn.Modules
- torch.nn.Modules可以簡單認為是網路一層,包括該層的參數,以及一些操作,如forward,調用參數等
- 同樣地,它的作用包括,能夠接受一個輸入,並得到一個輸出(forward操作)。同時,他保存了該層學習的參數,以及其他的一些狀態變數。並實現各類功能的方法,如返回Modules的參數等
- 因此可以把torch.nn以及torch.nn.Modules看做是一個定義好的小網路(包括其參數),給該網路一個輸入,其將得到一個輸出。輸入輸出都是Variable
- 更多Modules具體機制以及如何重寫將在後面章節介紹
torch.nn示例
import torch.nn as nnnimport torchnfrom torch.autograd import Variablenn# nn.Sequential是一個Module的容器,裡面包含多個Module。裡面的Module在forward時將按順序進行操作,如下即Conv->BN->ReLU->Pooln# nn.Conv2d是2維卷積,其第一個參數為輸入通道數,第二個參數為輸出通道數n# 注意Conv2d只接收batch輸入,不接受單個數據輸入,即輸入必須是(N,C,H,W)n# BN層的參數是通道數n# 各層的參數已經自動初始化nnmodel = nn.Sequential(n nn.Conv2d(1, 16, kernel_size=5, padding=2),n nn.BatchNorm2d(16),n nn.ReLU(),n nn.MaxPool2d(2)n )n# 輸出模型nprint 模型: , modelnn# 輸出模型參數nprint 模型參數: , model.parametersnn# 輸出卷積層參數個數nprint 卷積層參數個數: , list(model.parameters())[0].size()n# print list(model.parameters())[0] # 輸出卷積層參數nn# 得到model的某一層nconv = model[0]nnn# model forward得到輸出,model的輸入輸出都是Variablen# 由於forward使用了__call__函數,因此可以直接利用Modules的對象來調用forwardnninput_var = Variable(torch.randn(1, 1, 10, 10))noutput_var = model(input_var) # 這裡使用output_var = model.forward(input_var)也是可行nprint output_var.size()nnn# model backward, output_var是一個Variable,網路在forward過程中已經建立計算圖,因此使用backward可計算該model的所有可學習參數的梯度noutput_var.backward(torch.ones(output_var.size()))nn# 對卷積層進行重新初始化nprint 舊的參數值: , model[0].weight.data[0]nnew_weight = torch.zeros(conv.weight.size())nconv.weight.data = new_weightnprint 新的參數值: , model[0].weight.data[0]nn# torch.nn中也包含Loss計算,先定義好loss_fn後,可以像調用函數一樣在後面進行調用nloss_fn = torch.nn.MSELoss(size_average=False)nprint(loss_fn)nn# 如下調用loss_fn,y_pred與y是輸入的Variable,輸出是計算結果的Variablen# loss = loss_fn(y_pred, y)n
2 torch.optim示例
torch.optim中有許多常用的優化演算法,其實用方法十分簡單,詳見以下示例:
# 創建一個optim,並指定對應的參數nlearning_rate = 1e-4noptimizer = torch.optim.Adam(model.parameters(), lr=learning_rate)nn# 將對應參數梯度置0,注意如果沒有置0,則將會與上一次梯度進行疊加noptimizer.zero_grad()nn# forward 然後 backward 得到梯度ny = model(x)n# 得到對應lossnloss = loss_fn(y_pred, y)n# backward後,計算出loss對制定Variable(requires_grad=True)的梯度nloss.backward()nn# 更新參數noptimizer.step()n
3. 例子
在學習了,torch.nn以及torch.optim,終於可以不用自己手寫網路層以及優化函數了,下面將使用torch.nn及torch.optim來完成前幾個章節建立的簡單神經網路
import torchnfrom torch.autograd import Variablenn# N為batch size; D_in為輸入維度;n# H為隱藏層單元數; D_out為輸出層維度.nN, D_in, H, D_out = 64, 1000, 100, 10nn# 隨機生成輸入數據x,label ynx = Variable(torch.randn(N, D_in))ny = Variable(torch.randn(N, D_out), requires_grad=False)nn# 使用torch.nn建立網路nmodel = torch.nn.Sequential(n torch.nn.Linear(D_in, H),n torch.nn.ReLU(),n torch.nn.Linear(H, D_out),n )nn# 使用torch.nn中MSELoss定義損失函數nloss_fn = torch.nn.MSELoss(size_average=False)nn# 定義優化器nlearning_rate = 1e-4noptimizer = torch.optim.Adam(model.parameters(), lr=learning_rate)nfor t in range(20000):n # Forward 前向傳播n y_pred = model(x).mean()nn # 計算lossn loss = loss_fn(y_pred, y)n print(t, loss.data[0])nn optimizer.zero_grad()nn # 後向傳播 n loss.backward()nn if t % 100 == 0:n print(y_pred.data[0])nn # 更新梯度n optimizer.step()n
推薦閱讀:
※深度學習新手必學:使用 Pytorch 搭建一個 N-Gram 模型
※PyTorch中如何使用tensorboard可視化
※【筆記】Finding Tiny Faces
TAG:PyTorch | 深度学习DeepLearning |