文章目錄
- 創建張量
- 指定設備
- 沿軸計算
創建張量
如果說數組是numpy的操作對象,那么張量Tensor
就是pytorch的操作單元,從數據內容來說,與高維數組是如出一轍的,但作為一個類,其構造函數支持通過聲明張量的維度來進行初始化,示例如下
import torch as t
z = t.Tensor(3, 4)
print(z)
'''
tensor([[0., 0., 0., 0.],[0., 0., 0., 0.],[0., 0., 0., 0.]])
'''
在實際應用中,隨機矩陣有著廣泛的需求,torch中的rand
可以生成隨機張量
r = t.rand(3,4)
則r
是一個 3 × 4 3\times4 3×4的隨機矩陣,內容如下
[ 0.6220 0.3771 0.4598 0.0340 0.6928 0.1479 0.9832 0.3954 0.8050 0.3466 0.9227 0.1516 ] \begin{bmatrix} 0.6220& 0.3771& 0.4598& 0.0340\\ 0.6928& 0.1479& 0.9832& 0.3954\\ 0.8050& 0.3466& 0.9227& 0.1516\\ \end{bmatrix} ?0.62200.69280.8050?0.37710.14790.3466?0.45980.98320.9227?0.03400.39540.1516? ?
指定設備
如果安裝了顯卡版本的pytorch,那么由pytorch創建的矩陣可以指明寫在顯卡中
ct = t.rand(5000, 5000, device=t.device('cpu'))
dt = t.rand(5000, 5000, device=t.device('cuda'))
顯卡的并行結構在矩陣計算中展現出極大的威力,下面測試一下 5000 × 5000 5000\times5000 5000×5000的矩陣在計算時的速度差異
from timeit import timeit
timeit(lambda: ct@ct, number=10) # 返回 7.714848299976438
timeit(lambda: dt@dt, number=10) # 返回 1.27076860005036
相當于CPU需要0.7秒計算一次,而Cuda只需0.1秒,這個差距還會隨著矩陣維度的增大而進一步增大。
沿軸計算
在統計中經常用到的求和、求平均值等,都會把一組數據樣本壓縮成一個值,這種操作對于張量來說就是降維操作。
如果把張量表示出來,那么一階張量即為向量,二階張量則為矩陣,三階張量則可排布在一個立方體中,如果在這個立方體中創建一個坐標系,則相當于有三個坐標軸。
而對張量進行降維操作時,比如求平均值,若不指定坐標軸,將對所有數據求平均值
t.mean(dt)
# tensor(0.5000, device='cuda:0')
通過axis
來指定坐標軸,則可在相應的坐標軸上操作
t.mean(dt, axis=1)
# tensor([0.4965, 0.5018, ..., 0.5057, 0.4993], device='cuda:0')
除了這種降維操作之外,很多時候也需要對張量進行升維,比如把一個向量沿著另一個軸進行復制,并排布在矩陣中
v = t.arange(5) # 0, 1, 2, 3, 4
v.repeat(3) #
# tensor([0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4])
v31 = v.repeat(3,1)
v31表示在第一個軸的方向復制1次,在第二個軸的方向復制3次,得到結果為
[ 0 1 2 3 4 0 1 2 3 4 0 1 2 3 4 ] \begin{bmatrix} 0& 1& 2& 3& 4\\0& 1& 2& 3& 4\\0& 1& 2& 3& 4 \end{bmatrix} ?000?111?222?333?444? ?