Tensor与Autograd详解
参考自《深度学习框架PyTorch入门与实践》
Tensor
创建Tensor
创建Tensor的方法有很多:
函数 | 功能 |
---|---|
Tensor(*size) | 基础构造函数 |
ones(*size) | 全为 1 Tensor |
zeros(*size) | 全为 0 Tensor |
eyes(*size) | 对角线为1,其他为0 |
arange(s,e,step) | 从s到e,步长为step |
linspace(s,e,step) | 从s到e,均分为step份 |
rand/randn(*sizes) | 均匀/标准分布 |
normal(mean,std)/uniform(from,to) | 正态分布/均匀分布 |
randperm(m) | 随机排列 |
用Tensor()函数创建tensor时,可以有很多方法:
1 | x=t.Tensor([[1,2,3],[4,5,6]])#用一个list来创建 |
1 | print(x.size()) |
tensor.shape和tensor.size()是一样的:
一些其他的创建方法;
1 | x=t.ones(2,3) |
改变形状的操作
用 view(),squeeze(),unsqueeze(),resize_()等方法可以改变tensor的形状
view()
view()用于直接改变形状,但不能改变tensor的大小。用法:
1 | b=t.arange(0,6) |
unsqueeze()
unsqueeze()用于增加tensor的维度。用法:
1 | print(b) |
squeeze()
squeeze()用于压缩大小为一的维度。用法:
1 | x=t.Tensor(2,3,1) |
resize_
resize_也可以用来修改形状。不同的是,如果新尺寸超过了原来的尺寸,会自动分配新的内存空间。用法:
1 | x=t.rand(2,3) |
索引操作
Tensor可以按下标索引:
1 | a=t.randn(3,4) |
1 | print(a) |
选择函数
选择函数用于从Tensor中选出一部分。
index_select()
index_select()用于选出tensor特定维度特定下表的部分。用法:
1 | import torch |
mask_select()
a.mask_select(b)=a[b],没啥好用的
nonzero()
用于获得非0元素的下标,用法:
1 | a=t.Tensor([2,3,0,0,1]) |
gather()和scatter()
太复杂了,等用到的时候再搞。
高级索引
x[[],[]……[]] 其中第1个列表表示第0个维度要选的东西,第2个列表表示第1个维度要选的东西,以此类推。
1 | x=t.arange(0,27).view(3,3,3) |
Tensor类型
tensor的元素默认类型是FloatTensor,可以通过t.set_default_tensor_type()修改默认类型。
常见类型有:
数据类型 | CPU tensor | GPU tensor |
---|---|---|
32bit浮点 | torch.FloatTensor | torch.cuda.FloatTensor |
64bit浮点 | torch.DoubleTensor | torch.cuda.DoubleTensor |
16bit浮点 | 16bit浮点只能在GPU里用 | torch.cuda.HaltTensor |
8bit无符号整型 | torch.ByteTensor | torch.cuda.ByteTensor |
8bit有符号整型 | torch.CharTensor | torch.cuda.CharTensor |
16bit有符号整型 | torch.ShortTensor | torch.cuda.ShortTensor |
32bit有符号整型 | torch.IntTensor | torch.cuda.IntTensor |
64bit有符号整型 | torch.LongTensor | torch.cuda.LongTensor |
还可以用type()函数指定类型:
1 | t.set_default_tensor_type("torch.FloatTensor") |
逐元素操作
这些函数会对tensor的每一个元素进行操作,如下表所示:
函数 | 功能 |
---|---|
abs/sqrt/div/exp/fmod/log/pow | |