前言
PyTorch 是一個基於Torch框架的開源Python機器學習庫,用於NLP,CV等深度學習應用。它的開發人員是 Facebookd的人工智能小組,它不僅可以利用GPU加速,同時還實現了動態神經網絡,這點和現在流行的主流框架如TensorFlow不同。 PyTorch同時還有兩個高級功能: 張量計算(如Numpy) 和自動求導。
除了Facebook之外,Twitter、GMU和Salesforce等機構也都採用了PyTorch。
TensorFlow和Caffe都是命令式的靜態編程語言,,首先必須構建一個神經網絡,在訓練過程中結構不會發生變化,如果想要改 變網絡的結構,就必須從頭開始。但是對於PyTorch,通過 反向求導技術,可以讓你任意實時改變神經網絡。這一靈活 是PyTorch對比TensorFlow的最大優勢。
另外,PyTorch的代碼對比TensorFlow而言,更加簡潔直觀,底層代碼也更容易看懂,這對於使用 它並且計劃理解底層得人是一件特別棒的事情。
所以,總結一下PyTorch的優點:
- 支持調用GPU進行運算 ,
- 支持動態神經網絡 ,
- 底層代碼易於理解 ,
- 自定義擴展
當然,一枚硬幣有兩面,PyTorch也不例外,對比TensorFlow,其在功能全面性上差強人意,目前,PyTorch還不支持快速傅里葉、沿維翻轉張量和檢查無窮與非數值張量;針對移動 端、嵌入式部署以及高性能服務器端的部署其性能表現有待提升;其次因爲這個框 架較新,使得 他的社區沒有那麼強大,在文檔方面其核心庫大部分都沒有文檔。
目錄
正文
首先是安裝Pytorch,可以參照這篇:
Windows下pytorch安裝
好了,現在可以開始熟悉PyTorch了。
什麼是PyTorch
PyTorch 是一個基於Python的深度學習包,主要爲兩類人提供服務:
- 喜歡Numpy,卻覺得他太慢的人。
- 目前使用的深度學習平臺不夠靈活。
概念基礎
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’,可以獲得本文的可交互代碼