0x00 PyTorch是什么?
PyTorch是一個基於Python的科學計算工具包,它主要面向兩種場景:
- 用於替代NumPy,可以使用GPU的計算力
- 一種深度學習研究平台,可以提供最大的靈活性和速度
0x01 開始學習
1、Tensors
Tensors(張量)類似於numpy的ndarrays,不過Tensors還可以運行於GPU上以提升計算速度。
from __future__ import print_function
import torch
創建一個5x3且未初始化的矩陣:
x = torch.Tensor(5, 3)
print(x)
輸出結果:
0.0000e+00 0.0000e+00 3.1766e-27
4.5880e-41 3.1950e-27 4.5880e-41
1.9468e-22 4.5880e-41 1.9468e-22
4.5880e-41 2.3214e-22 4.5880e-41
2.2306e-22 4.5880e-41 -2.7458e+32
[torch.FloatTensor of size 5x3]
創建一個隨機初始化的矩陣:
x = torch.rand(5, 3)
print(x)
輸出結果:
0.9559 0.8026 0.4142
0.8142 0.8763 0.6700
0.4673 0.0675 0.3439
0.2200 0.1499 0.6082
0.7853 0.8487 0.8124
[torch.FloatTensor of size 5x3]
獲取矩陣大小:
print(x.size())
輸出結果:
torch.Size([5, 3])
注意:torch.Size
實際上是一個元組,所以它支持元組的所有操作。
2、操作
PyTorch中的操作有很多不同的語法,下面我們以加法為例來學習其操作語法:
(1)加法:語法1
y = torch.rand(5, 3)
print(x + y) # x為上文中定義的x
輸出結果:
1.7700 1.7643 1.3732
1.3085 1.4576 0.9668
0.9354 0.0891 0.4727
0.6503 0.6814 1.2334
1.5436 0.9600 1.0965
[torch.FloatTensor of size 5x3]
(2)加法:語法2
print(torch.add(x, y)) # x為上文中定義的x
輸出結果:
1.7700 1.7643 1.3732
1.3085 1.4576 0.9668
0.9354 0.0891 0.4727
0.6503 0.6814 1.2334
1.5436 0.9600 1.0965
[torch.FloatTensor of size 5x3]
(3)加法:將結果賦值給Tensor對象
result = torch.Tensor(5, 3)
torch.add(x, y, out=result)
print(result)
輸出結果:
1.7700 1.7643 1.3732
1.3085 1.4576 0.9668
0.9354 0.0891 0.4727
0.6503 0.6814 1.2334
1.5436 0.9600 1.0965
[torch.FloatTensor of size 5x3]
(4)加法:原地替換
# adds x to y
y.add_(x)
print(y)
輸出結果:
1.7700 1.7643 1.3732
1.3085 1.4576 0.9668
0.9354 0.0891 0.4727
0.6503 0.6814 1.2334
1.5436 0.9600 1.0965
[torch.FloatTensor of size 5x3]
注意: 任何原地改變張量值的操作后綴都是固定的_
,例如:x.copy_(y)
、x.t_()
,都將原地改變x
的值。
另外,你可以使用標准的numpy索引來操作Tensor對象。
print(x[:, 1])
輸出結果:
0.8026
0.8763
0.0675
0.1499
0.8487
[torch.FloatTensor of size 5]
調整大小:如果你想調整或重塑張量形狀,那么可以使用torch.view
:
x = torch.randn(4, 4)
y = x.view(16)
z = x.view(-1, 8) # the size -1 is inferred from other dimensions
print(x.size(), y.size(), z.size())
輸出結果:
torch.Size([4, 4]) torch.Size([16]) torch.Size([2, 8])
擴展閱讀: 這里介紹了超過100個Tensor操作,包括轉置、索引、切片、數學操作、線性代數、隨機數等。
0x02 NumPy轉換
將torch中的張量轉換為numpy中的數組或者反過來都是輕而易舉的事。
torch張量與numpy數組將共享它們底層的內存位置,改變二者之一都將會改變另一個。
1、將torch張量轉換為numpy數組
定義一個torch張量對象:
a = torch.ones(5)
print(a)
輸出結果:
1
1
1
1
1
[torch.FloatTensor of size 5]
將torch張量對象轉換為numpy中的數組對象:
b = a.numpy()
print(b)
輸出結果:
[ 1. 1. 1. 1. 1.]
下面查看numpy數組值是如何變化的:
a.add_(1)
print(a)
print(b)
輸出結果:
2
2
2
2
2
[torch.FloatTensor of size 5]
[ 2. 2. 2. 2. 2.]
2、將numpy數組轉換為torch張量
下面查看修改numpy數組是如何自動改變torch張量的:
import numpy as np
a = np.ones(5)
b = torch.from_numpy(a)
np.add(a, 1, out=a)
print(a)
print(b)
輸出結果:
[ 2. 2. 2. 2. 2.]
2
2
2
2
2
[torch.DoubleTensor of size 5]
在CPU上的所有的張量,除了CharTensor之外,都支持轉換成NumPy對象,也支持反向轉換。
0x03 CUDA張量
使用.cuda
函數可以將張量移到GPU上進行計算:
# 只有當CUDA可用時才會進行下面計算
if torch.cuda.is_available():
x = x.cuda()
y = y.cuda()
x + y
以上腳本的總運行時間為:0分0.132秒。
本文中所使用的Python代碼: tensor_tutorial.py