文章目录
- 创建张量
- 指定设备
- 沿轴计算
创建张量
如果说数组是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.80500.37710.14790.34660.45980.98320.92270.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} 000111222333444