寫在開始:

這篇文章是我在學習Pytorch時的一個總結,文章中的程式碼執行環境在上一篇文章中已經配置完成,示例程式碼建議在Jupyter notebook上執行。因為筆者pytorch學習時間較短,文章中難免有疏漏之處,還請各位大佬多多指教~

本文結構如下:

一。Pytorch簡介

二。Pytorch的基本資料結構

三。Pytorch中常見的層結構

四。Pytorch中常見的包

2018。06。08更新說明:因為在今年四月底的時候pytorch已經升級至0。4。0版本,之前的版本是在pytorch0。3。0的基礎上面寫的,本次更新內容將會補充兩個版本之間的差異。

一。Pytorch簡介

PyTorch

是一個 Python 優先的深度學習框架,也是使用 GPU 和 CPU 最佳化的深度學習

張量

庫,能夠在強大的 GPU 加速基礎上實現張量和動態神經網路。其前身是

Torch

,主要語言介面為

Lua

。PyTorch 和 TensorFlow、MXNet、Caffe2 一樣,是非常底層的框架;也正如 TensorFlow 是谷歌官方框架,MXNet 是亞馬遜官方框架,背後支援 PyTorch 的則是

Facebook

同時,PyTorch 還是一個 Python 軟體包,其提供了兩種高層面的功能:

1。 使用強大的 GPU 加速的

Tensor

計算(類似 numpy)

2。 構建於基於 tape 的

autograd

系統的深度神經網路。

Why we use Pytorch

1。 作為

numpy

的替代,以便使用運算效能更加強大的 GPU;

2。 Pytorch可以作為一個能提供最大的靈活性和速度的深度學習研究平臺。

二。Pytorch的基本資料結構

1。Tensor

在Pytorch中,

Tensor

是最基本的操作物件。Tensor是

張量

的英文,表示多維的矩陣,比如一維就是向量,二維就是一般的矩陣等等,pytorch裡面處理的基本單位就是一個一個的tensor。

建立張量:

建立一個張量,我們需要匯入包torch

建立一個張量的方法有很多,以下為一些示例程式碼:

import torch

a = torch。FloatTensor([[1, 2, 3], [4, 5, 6]])

b = torch。randn(3,3)

c = torch。IntTensor(2, 4)。zero_()

張量的基本操作

Torch的操作比較簡單,與Numpy類似,下面的程式碼為我們展示了Torch的一些基本操作。

在下面的程式碼中分別對張量進行了求和,求絕對值,求最大值的操作。

import torch

a = torch。randn(2,2)

b = torch。randn(2,2)

c = a+b

d = torch。add(a,b)

e = torch。abs_(a)

f = torch。max(a,dim=1)

Pytorch的基本操作遠不止於此,如果需要了解更多操作,請移步:

torch - PyTorch master documentation(Pytorch 官方文件)

http://

pytorch-cn。readthedocs。io

/zh/latest/

(Pytorch 中文文件)

Numpy橋:

Numpy橋,可以實現numpy和Tensor的相互轉換。

import torch

import numpy as np

a = torch。randn(3,3)

b = a。numpy()

c=np。ones(5)

d=torch。from_numpy(c)

2。Variable(可以棄用)

Variable

可以理解為

Tensor

的一種封裝,與Tensor相比,Variable更加強大,因為Variable提供了

自動求導

功能,也就是可以自動給你你要的引數的梯度。在圖一種我們可以發現Tensor實質上就是Variable的data屬性。

深度學習入門之Pytorch

圖1 Variable的結構

本質上Variable和Tensor沒有區別,不過Variabel會放入一個

計算圖(Graph)

,然後進行

前向傳播(Forward)

反向傳播(Backward)

以及

自動求導(Autograd)

一個Variable裡面包含著三個屬性,

data

grad

creator

,其中:

data表示取出這個Variabel裡面的資料。

grad表示方向傳播的梯度。

creator表示得到這個Variabel的操作,比如乘法或者加法等等。

值得留意的是,反向計算梯度只對葉子節點有效。

import torch

from torch。autograd import Variable

a_t = torch。randn(3,3)

a_v = Variable(a_t,requires_grad = True)

b_t = torch。randn(3,3)

b_v = Variable(b_t,requires_grad = True)

c_v = a*a+b*2

d_v = Variable(torch。ones(3,3),requires_grad=True)

e_v=c_v+d_v

e_v。backward(torch。Tensor(([1,1,1],[1,1,1],[1,1,1])))

print(a_v。grad。data)

print(b_v。grad。data)

print(c_v。grad。data)

print(d_v。grad。data)

由於pytorch 0。4。0已經將Tensor與Variable合併,因此不用再用Variable去封裝Tensor。因此上面的程式碼在0。4。0中應為:

import torch

a_t = torch。randn(3,3)

a_t。requires_grad = True

b_t = torch。randn(3,3)

c_v = a*a+b*2

e_v=c_v+d_v

e_v。backward(torch。Tensor(([1,1,1],[1,1,1],[1,1,1])))

print(a_v。grad)

print(b_v。grad)

print(c_v。grad)

print(d_v。grad)

在0。3。0中,Tensor在初始化時requires_

grad屬性預設值為True,

而在0。4。0中requires_grad的預設值為False。

三。Pytorch中常見的層結構

pytorch

裡面的

模型

建立,模型的建立主要依賴於

torch.nn

,torch。nn包含這個所有神經網路的層的結構。

常見的神經網路有:卷積層,池化層,全連線層。

1。卷積層(Convolution Layer)

在torch。nn的相關文件中,我們可以查到各種各樣的卷積層型別。在影象處理領域常見的是二維卷積層,其定義如下:

class torch。nn。Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True)

相關引數的說明:

in_channels(int) – 輸入訊號的通道

out_channels(int) – 卷積產生的通道

kerner_size(int or tuple) - 卷積核的尺寸

stride(int or tuple, optional) - 卷積步長

padding(int or tuple, optional) - 輸入的每一條邊補充0的層數

dilation(int or tuple, optional) – 卷積核元素之間的間距

groups(int, optional) – 從輸入通道到輸出通道的阻塞連線數

bias(bool, optional) - 如果bias=True,新增偏置

2。池化層(Pooling Layer)

在影象處理領域運用得比較多的是二維池化操作,其定義如下:

class torch。nn。MaxPool2d(kernel_size, stride=None, padding=0, dilation=1, return_indices=False, ceil_mode=False)

相關引數的說明:

kernel_size(int or tuple) - max pooling的視窗大小

stride(int or tuple, optional) - max pooling的視窗移動的步長。預設值是kernel_size

padding(int or tuple, optional) - 輸入的每一條邊補充0的層數

dilation(int or tuple, optional) – 一個控制視窗中元素步幅的引數

return_indices - 如果等於True,會返回輸出最大值的序號,對於上取樣操作會有幫助

ceil_mode - 如果等於True,計算輸出訊號大小的時候,會使用向上取整,代替預設的向下取整的操作。

3。全連線層(Linear Layer)

全連線層定義如下:

class torch。nn。Linear(in_features, out_features, bias=True)

相關引數說明:

in_features - 每個輸入樣本的大小

out_features - 每個輸出樣本的大小

bias - 若設定為False,這層不會學習偏置。預設值:True

四。Pytorch中需要經常匯入的包

import torch 匯入torch包

#from torch。autograd import Variable 匯入 Variable(0。4。0中可不用)

import torch。nn as nn 構建神經網路時使用

import torch。nn。functional as F 新增

啟用函式

時使用

import torch。optim as optim 定義最佳化

方式

時使用

到現在我們只用了

import torch

from torch。autograd import Variable #0。4。0中可不用

剩下三個包是在訓練神經網路中經常會使用的,我們下一篇見~