一、数据初始化
1.torch.arange()
用来构建一个行向量,参数=元素个数,从0开始的自然数排列,默认float型。一个新定义的张量(tensor)都会存储在主存中,在CPU中计算。
例子:
x = torch.arange(12)
输出:
tensor([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
2.x.shape
获取tensor结构
例子:
x.shape
输出:
torch.Size([12])
3.x.numel()
获取trensor中的元素个数
输出:
12
4.x.reshape()
改变x的形状,但不改变里面的值
例子:
x = x.reshape(3, 4)
输出:
tensor([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11]])
已知tensor原本结构和长宽任一,另一参数设为-1也可。
例如,x.reshape(3, 4), 可以设为 x.reshape(-1, 4) or x.reshape(3, -1).
5.torch.zeros()、torch.ones()
将tensor初始化为0或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.]]])
6.torch.randn()
根据正态分布和标准差随机初始化
例子:
torch.randn(3, 4)
输出:
tensor([[ 0.9207, -0.6144, 1.2993, 0.5726], [-1.5666, -0.0836, 1.8288, 0.8677], [ 0.5672, -1.2084, -1.5252, -1.9457]])
7.torch.tensor()
可利用list给tensor自定义初始化
例子:
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.加减乘除幂次方
例子:
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 # The ** operator is exponentiation Copy to clipboard
输出:
(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.]))
一元指数运算:
torch.exp(x)
输出:
tensor([2.7183e+00, 7.3891e+00, 5.4598e+01, 2.9810e+03])
2.按照给定的行(axis=0)或列(axis=1),连接tensor
例子:
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.]]))
3.逻辑运算
tensor对应位置进行运算,相等为1不等为0
例子:
x == y
输出:
tensor([[False, True, False, True], [False, False, False, False], [False, False, False, False]])
4.tensor元素相加
例子:
x.sum()
输出:
tensor(66.)
三、广播
对于相同形状的tensor运算只需对应位置计算,对不同形状的tensor,需扩展行或列使得tensor结构相同再进行计算。
例子:
a = torch.arange(3).reshape((3, 1)) b = torch.arange(2).reshape((1, 2)) a, b
两个tensor行列都不同
(tensor([[0], [1], [2]]), tensor([[0, 1]]))
做加法:
a + b
输出:
tensor([[0, 1], [1, 2], [2, 3]])
四、索引和切片
索引从0开始,范围大小包括第一个元素但不包括最后一个。也可以用负索引。
例子:
x[-1], x[1:3]
输出:
(tensor([ 8., 9., 10., 11.]), tensor([[ 4., 5., 6., 7.], [ 8., 9., 10., 11.]]))
即-1代表输出最后一个,[1:3]代表输出索引为1-3但不包括3。
还可以根据索引更改元素。
例子:
x[1, 2] = 9 x
输出:
tensor([[ 0., 1., 2., 3.], [ 4., 5., 9., 7.], [ 8., 9., 10., 11.]])
改了第2行第3列的元素。
如果要为tensor中多个元素同时更改数值,用切片方式给对应索引换值。
例子:
x[0:2, :] = 12 x
输出:
tensor([[12., 12., 12., 12.], [12., 12., 12., 12.], [ 8., 9., 10., 11.]])
给第1行和第2行的每列元素换值。
五、节省内存
在进行运算时,会给计算结果分配新的内存,可以通过Python自带的id函数:如果两个实例的ID一致,那么它们所对应的内存地址相同;反之则不同。
before = id(y) y = y + x id(y) == before
输出:
False
如果想指定结果到特定内存,可以使用前面介绍的索引来进行替换操作。
例子:
z = torch.zeros_like(y) print('id(z):', id(z)) z[:] = x + y print('id(z):', id(z))
输出:
id(z): 140144689613552 id(z): 140144689613552
实际上,上例中还是为X + Y开了临时内存来存储计算结果,再复制到Z对应的内存。如果想避免这个临时内存开销,可以直接将运算结果放回x。
例子:
before = id(x) x += y id(x) == before
输出:
True
六、转换为其他的python对象
例子:
a = x.numpy() b = torch.tensor(a) type(a), type(b)
输出:
(numpy.ndarray, torch.Tensor)
将tensor转换为数值,用item()
例子:
a = torch.tensor([3.5]) a, a.item(), float(a), int(a)
输出:
(tensor([3.5000]), 3.5, 3.5, 3)
如有不对,请帮忙指正!!!