Pytorch實踐中文教程(1)

前言

PyTorch 是一個基於Torch框架的開源Python機器學習庫,用於NLP,CV等深度學習應用。它的開發人員是 Facebookd的人工智能小組,它不僅可以利用GPU加速,同時還實現了動態神經網絡,這點和現在流行的主流框架如TensorFlow不同。 PyTorch同時還有兩個高級功能: 張量計算(如Numpy) 和自動求導。
除了Facebook之外,Twitter、GMU和Salesforce等機構也都採用了PyTorch。
TensorFlow和Caffe都是命令式的靜態編程語言,,首先必須構建一個神經網絡,在訓練過程中結構不會發生變化,如果想要改 變網絡的結構,就必須從頭開始。但是對於PyTorch,通過 反向求導技術,可以讓你任意實時改變神經網絡。這一靈活 是PyTorch對比TensorFlow的最大優勢。
另外,PyTorch的代碼對比TensorFlow而言,更加簡潔直觀,底層代碼也更容易看懂,這對於使用 它並且計劃理解底層得人是一件特別棒的事情。
所以,總結一下PyTorch的優點:

  1. 支持調用GPU進行運算
  2. 支持動態神經網絡
  3. 底層代碼易於理解
  4. 自定義擴展
    當然,一枚硬幣有兩面,PyTorch也不例外,對比TensorFlow,其在功能全面性上差強人意,目前,PyTorch還不支持快速傅里葉、沿維翻轉張量和檢查無窮與非數值張量;針對移動 端、嵌入式部署以及高性能服務器端的部署其性能表現有待提升;其次因爲這個框 架較新,使得 他的社區沒有那麼強大,在文檔方面其核心庫大部分都沒有文檔。

目錄

正文

首先是安裝Pytorch,可以參照這篇:
Windows下pytorch安裝
好了,現在可以開始熟悉PyTorch了。

什麼是PyTorch

PyTorch 是一個基於Python的深度學習包,主要爲兩類人提供服務:

  1. 喜歡Numpy,卻覺得他太慢的人。
  2. 目前使用的深度學習平臺不夠靈活。

概念基礎

Tensors(張量)

Tensors是一種類似於NumPy的ndayyays的數據結構,具有多維數組的所有優點,同時,基於PyTorch的特殊實現,你可以用GPU來加速你的數組運算。

# 首先導入torch包
from __future__ import print_function
import torch

讓我們小試牛刀一下,構造一個4*4的二維隨機數組。

x=torch.rand(4,4)
print(x)

程序輸出

tensor([[0.6254, 0.1690, 0.4922, 0.0543],
        [0.6057, 0.0293, 0.3909, 0.2498],
        [0.0916, 0.0795, 0.5616, 0.8738],
        [0.3008, 0.3016, 0.8778, 0.7976]])
        ```
 大家可以注意一下,輸出的是Tensor標識的一個數據。
 另外有一個需要特別注意的地方,在初始化一個空數組時,結果可能和我們想象的不一樣。
 ```b
x=torch.empty(4,2)
print(x) 

程序輸出

tensor([[-8.2481e+24,  7.2727e-43],
        [-8.2485e+24,  7.2727e-43],
        [-8.2485e+24,  7.2727e-43],
        [-8.2485e+24,  7.2727e-43]])

可以發現,輸出結果,和我們想象中有點點兒區別,但也沒什麼大礙。
PyTorch不僅可以設置數組的維度,同時還可以設置數組初始化時的數據類型。
接下來我們來構建一個lond型的tensor吧。

x=torch.zeros(4,4,dtype=torch.long)
print(x)

結果

tensor([[0, 0, 0],
        [0, 0, 0],
        [0, 0, 0],
        [0, 0, 0],
        [0, 0, 0]])
 ```b
 可以與設置爲torch.float的做一下對比:
 ```b
 tensor([[0., 0., 0., 0.],
        [0., 0., 0., 0.],
        [0., 0., 0., 0.],
        [0., 0., 0., 0.]])
        ```
和numpy一樣,Pytorch可以設置數組初始化時的數值:
```b
 x=torch.tensor([4.5,2])
print(x)

#結果
tensor([4.5000, 2.0000])

在批量初始化同維數組時,可以利用已經存在的數組的相關信息。

x = x.new_ones(4, 4, dtype=torch.double)     
 # new_*系列方法需要維度
 print(x)
x = torch.randn_like(x, dtype=torch.float)   
 # 重新設置數據類型
 print(x)  
 print(x.size)                                   
 # 結果有相同的維度
 # 結果
 tensor([[1., 1., 1., 1.],
        [1., 1., 1., 1.],
        [1., 1., 1., 1.],
        [1., 1., 1., 1.]], dtype=torch.float64)
tensor([[ 0.9930,  0.8410, -0.5197, -0.3821],
        [ 1.4312, -0.1829,  2.0677, -0.3969],
        [ 0.3915,  0.9932, -0.4115,  0.9079],
        [-0.6334,  0.8982, -0.2081, -0.4650]])
torch.Size([4, 4])

運算

接下來,本文將以減法爲例演示,PyTorch如何實現四則運算。

減法:方式1

y=torch.randn(4,4)
print(x-y)
#輸出
tensor([[ 0.2948,  0.4200, -1.2566, -0.4528],
        [ 1.1510, -1.0804,  2.0055, -1.3292],
        [ 0.2645,  0.3557, -1.2443,  0.8334],
        [-1.0146,  0.6967, -0.9362, -1.2695]])

減法:方式2

# 可以指定輸出的存儲變量
result=torch.empty(4,4)
torch.min(x,y,out=result)
print(result)
# 輸出
tensor([[ 0.6982,  0.4210, -0.5197, -0.3821],
        [ 0.2802, -0.1829,  0.0622, -0.3969],
        [ 0.1270,  0.6375, -0.4115,  0.0745],
        [-0.6334,  0.2014, -0.2081, -0.4650]])

有的時候我們並不想增加我們的內存使用量
可以使用以下方式:

y.add_(x)
print(y
# 輸出
tensor([[ 1.6912,  1.2620,  0.2171, -0.3114],
        [ 1.7115,  0.7146,  2.1299,  0.5354],
        [ 0.5184,  1.6306,  0.4212,  0.9824],
        [-0.2522,  1.0996,  0.5200,  0.3395]])

通過在相應的操作後面加上斜線,結果將會被放到第一個變量上。

維度

在操作Tensor的時候,可以使用和Numpy類似的操作。
比如:

print(x[1:3,1:2])
#輸出
tensor([[-0.1829],
        [ 0.9932]])

如果,你想改變Tensor的維度,則可以使用view方法

x=torch.randn(4,8)
y=x.view(32)
z=x.view(-1,8)
print(x.size(),y.size(),z.size())
# 結果
torch.Size([4, 8]) torch.Size([32]) torch.Size([4, 8])

取值

類似於Numpy,torch也有可以直接獲得變量值的方法:

x = torch.ones(1) print(x) print(x.item())
print(x)
print(x.item())
#結果
tensor([1.])
1.0

未完待續
關注公衆號,輸入‘torch1’,可以獲得本文的可交互代碼
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章