本章主要讲述一些入门操作。
来源:动手学习深度学习(pytorch版)
张量表示一个由数值组成的数组,这个数组可能有多个维度。具有一个轴的张量对应数学上的向量。
使用arange创建一个行向量x.从0开始。
tensor([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
输出张量的形状
torch.Size([12])
检查张量的大小
12
改变一个张量的形状,而不改变元素的数量和元素值。其中可以通过-1来调用此自动计算出形状
tensor([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
tensor([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
tensor([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
使用全0、全1、其他常量或者从特定分布中随机采样的数字来初始化矩阵。
1
| torch.zeros((2,3,4)),torch.ones((2,3,4))
|
(tensor([[[0., 0., 0., 0.],
[0., 0., 0., 0.],
[0., 0., 0., 0.]],
[[0., 0., 0., 0.],
[0., 0., 0., 0.],
[0., 0., 0., 0.]]]),
tensor([[[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.]],
[[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.]]]))
特定的概率分布中随机采样,从均值为0、标准差为1的标准高斯分布(正态分布)中随机采样
tensor([[-0.0805, 0.5003, -0.3091, 1.2814],
[-0.3342, 0.4061, 0.1151, -0.1609],
[-1.2401, -0.6279, 1.2042, 0.3797]])
通过提供包含数值的python列表(或嵌套列表),来为所需张量中的每个元素赋予确定值。在这里,外层的列表对应于轴0,内层的列表对应于轴1
1
| torch.tensor([[2,1,4,3],[1,2,3,4],[4,3,2,1]])
|
tensor([[2, 1, 4, 3],
[1, 2, 3, 4],
[4, 3, 2, 1]])
简单的张量运算
1 2 3
| x=torch.tensor([1.0,2,4,8]) y=torch.tensor([2,2,2,2]) x+y,x-y,x*y,x/y,x**y
|
(tensor([ 3., 4., 6., 10.]),
tensor([-1., 0., 2., 6.]),
tensor([ 2., 4., 8., 16.]),
tensor([0.5000, 1.0000, 2.0000, 4.0000]),
tensor([ 1., 4., 16., 64.]))
tensor([2.7183e+00, 7.3891e+00, 5.4598e+01, 2.9810e+03])
多个张量连接,第一个 输出张量的轴0长度(6)是两个输入张量轴0 长度的总和
第二个输出张量的轴1长度(8)是两个输入张量轴1长度的总和
1 2 3
| X=torch.arange(12,dtype=torch.float32).reshape((3,4)) Y=torch.tensor([[2.0,1,4,3],[1,2,3,4],[4,3,2,1]]) torch.cat((X,Y),dim=0),torch.cat((X,Y),dim=1)
|
(tensor([[ 0., 1., 2., 3.],
[ 4., 5., 6., 7.],
[ 8., 9., 10., 11.],
[ 2., 1., 4., 3.],
[ 1., 2., 3., 4.],
[ 4., 3., 2., 1.]]),
tensor([[ 0., 1., 2., 3., 2., 1., 4., 3.],
[ 4., 5., 6., 7., 1., 2., 3., 4.],
[ 8., 9., 10., 11., 4., 3., 2., 1.]]))
第一个通过逻辑运算符构建二元张量
第二个对张量的所有元素求和,会产生一个单元素张量
(tensor([[False, False, False, False],
[False, False, False, False],
[False, False, False, False]]),
tensor(298.),
tensor([[False, False, False, False],
[False, False, False, False],
[False, False, False, False]]),
tensor([[True, True, True, True],
[True, True, True, True],
[True, True, True, True]]))
广播机制,在大多数情况下,我们将沿着数组中长度为1的轴进行广播。
1 2 3 4
| a=torch.arange(3).reshape((3,1)) b=torch.arange(2).reshape((1,2)) c=torch.arange(8).reshape((2,1,4)) a,b,c,a+b,a+c
|
(tensor([[0],
[1],
[2]]),
tensor([[0, 1]]),
tensor([[[0, 1, 2, 3]],
[[4, 5, 6, 7]]]),
tensor([[0, 1],
[1, 2],
[2, 3]]),
tensor([[[0, 1, 2, 3],
[1, 2, 3, 4],
[2, 3, 4, 5]],
[[4, 5, 6, 7],
[5, 6, 7, 8],
[6, 7, 8, 9]]]))
索引和切片,第一个元素的索引是0,最后一个元素的索引是-1;
可以指定范围以包含第一个元素和最后一个元素之前的元素
(tensor([ 8., 9., 10., 11.]),
tensor([[ 4., 5., 6., 7.],
[ 8., 9., 10., 11.]]))
tensor([[ 0., 1., 2., 3.],
[ 4., 5., 9., 7.],
[ 8., 9., 10., 11.]])
tensor([[12., 12., 12., 12.],
[12., 12., 12., 12.],
[ 8., 9., 10., 11.]])
节省内存
1 2 3
| before =id(Y) Y = Y+X id(Y)==before
|
False
1 2 3 4 5
| Z=torch.zeros_like(Y) print('id(Z):',id(Z)) Z[:]=X+Y print('id(Z):',id(Z))
|
id(Z): 140064498968624
id(Z): 140064498968624
1 2 3 4
| before =id(X) X+=Y id(X)==before
|
True
转换为其他python对象
将深度学习框架定义的张量转换为Numpy张量(ndarry)很容易,反之也同样容易。torch张量和numpy数组将共享它们的底层内存
就地操作更改一个张量也会同时更改另一个张量
1 2 3
| A=X.numpy() B = torch.tensor(A) type(A),type(B)
|
(numpy.ndarray, torch.Tensor)
1 2
| a = torch.tensor([3.5]) a,a.item(),float(a),int(a)
|
(tensor([3.5000]), 3.5, 3.5, 3)