import torch
x = torch.arange(12) # 包含 0-11 12个整数
x.shape
x.numel()
X = x.reshape(3, 4) #修改的目标张量大小必须与修改前总数相对应
X = x.reshape(-1, 4) # 给出宽度,自动计算高度
X = x.reshape(3, -1) # 给出高度,自动计算宽度
构建全部元素是0的矩阵张量:
torch.zeros( 3, 4) # 构建4*3的矩阵
输出:
tensor([[0., 0., 0., 0.],
[0., 0., 0., 0.],
[0., 0., 0., 0.]])
torch.zeros( 2, 3, 4) # 可看做创建2*(4*3)的矩阵
输出:
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.]]])
以此可类推:torch.zeros(3, 2, 3, 4) # 可看做创建3*(2*(4*3))的矩阵,与多维数组类似
构建全是1的矩阵:torch.ones((2, 3, 4))
构建内部元素是随机数的矩阵:torch.randn(3, 4)
***注意:***上述随机数矩阵,中的每个元素都从均值为0、标准差为1的标准高斯分布(正态分布)中随机采样。
输出示例:
tensor([[ 0.4315, -0.8804, -0.1730, -1.2925],
[ 0.3317, -1.1386, -0.6625, 0.3001],
[ 0.0371, -0.4246, 0.0326, 0.1565]])
torch.tensor([[2, 1, 4, 3], [1, 2, 3, 4], [4, 3, 2, 1]])
使用元组与其结果一致
简单运算符的按元素运算
普通运算符
张量(tensor)的运算符运算前提条件为具备相同shape(同高同宽),将两个张量的各个元素进行一一对应的按元素运算
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.]))
逻辑运算
逻辑运算在两个相同shape的张量间同样适用,按元素运算,符合置True否则置False
X == Y
tensor([[False, True, False, True],
[False, False, False, False],
[False, False, False, False]])
对张量元素进行求和
对张量中的所有元素进行求和,会产生一个单元素张量,此处要注意,最后的结果是一个单元素张量而不是一个值
X.sum()
结果:tensor(66.)
张量的连接
两个相同形状的张量可以横向连接也可以纵向连接
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)
使用cat函数进行连接
纵向连接
torch.cat((X, Y), dim=0)
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.]])
横向连接
torch.cat((X, Y), dim=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.]])
张量可将长度为1的轴(行或是列)进行扩展,也就是广播,前提必须为长度为1,其实也就是向量格式,这个向量可以是只有一列(宽度为1),比如shape为(3,1)或(5,1)等,又或是只有一行(高度为1),比如(1,3)或(1,5),如果两个不一样shape的张量可以通过广播变成相同shape,那么就可以进行运算符运算
t2 = torch.arange(4).reshape(1,4) + torch.arange(6).reshape(6,1) #可广播,可运行
t2 = torch.arange(4).reshape(1,4) + torch.arange(6).reshape(1,6) #可广播,但无法通过广播变成相同shape,不可运行
t2 = torch.arange(4).reshape(1,4) + torch.arange(8).reshape(2,4) #可广播,可运行
t2 = torch.arange(12).reshape(3,4) + torch.arange(8).reshape(2,4) #报错,不可广播,shape不同
就像在任何其他Python数组中一样,张量中的元素可以通过索引访问。 与任何Python数组一样:第一个元素的索引是0,最后一个元素索引是-1; 可以指定范围以包含第一个元素和最后一个之前的元素。可将张量看做多维的列表。
X[-1], X[1:3]
(tensor([ 8., 9., 10., 11.]),
tensor([[ 4., 5., 6., 7.],
[ 8., 9., 10., 11.]]))
X[1, 2] = 9 #向元素写入值
X[1, 2] = 9
tensor([[ 0., 1., 2., 3.],
[ 4., 5., 9., 7.],
[ 8., 9., 10., 11.]])
#用法与多维列表相同
如果我们想为多个元素赋值相同的值,我们只需要索引所有元素,然后为它们赋值。 例如,[0:2, :]访问第1行和第2行,其中“:”代表沿轴1(列)的所有元素。 虽然我们讨论的是矩阵的索引,但这也适用于向量和超过2个维度的张量。
X[0:2, :] = 12
X:
tensor([[12., 12., 12., 12.],
[12., 12., 12., 12.],
[ 8., 9., 10., 11.]])
内容来自:李沐老师的动手学深度学习(个人学习笔记,如有侵权请联系删除)