本篇介绍创建tensor的几种方式。
Import from numpy
from_numpy()
- float64 是 double 类型,也就是说从numpy导入的float其实是double类型。
- 从numpy导入的 int 还是 int 类型
1 | In[2]: import numpy as np |
Import from List
- 数据量不是很大,不需要numpy作为载体
torch.tensor([ ])
、torch.FloatTensor([ ])
、torch.Tensor([ ])
关系在后面介绍- tensor 与 Tensor易混淆
- 多使用tensor。
1 | # 一维 |
torch.tensor()
与torch.Tensor()
默认 生成torch.FloatTensor
类型,增强学习中多为torch.DoubleTensor
- 通过
torch.set_default_tensor_type(torch.DoubleTensor)
来更改 torch.tensor()
如果列表中都是int类型,则它会生成torch.LongTensor
1 | In[173]: a = torch.tensor([2.2,3]) |
data uninitialized
生成未初始化的数据
torch.empty(d1,d2,d3)
torch.FloatTensor(d1,d2,d3)
torch.IntTensor(d1,d2,d3)
未初始化的tensor将出现的问题
1 | torch.empty(1) |
- 这些数据有的特别特别小,有的特别特别大
- 这些数据如果没有后续的处理覆盖,将会产生bug,例如:可能在后面产生无穷大的数
1 | torch.isnan(torch.Tensor(2,3)) |
- tensor只是一个容器,后面会将自己的数据放入的。
rand/rand_like, randint
随机初始化
推荐使用随机初始化。
- rand 会随机的在[0, 1] 之间取一个数。
- rand_like( a ) 读取向量 a 的shape在送到rand函数
- randint 先指定区间
[ min, max )
,然后指定shape,shape要放在列表或元组中
1 | In[189]: torch.rand(3,3) |
N(0, 1)
randn()
- 均值为0,方差为1,数据集中在0附近
- 权值w 或 偏置 b 的一个初始化
N(u, std)
normal()
1 | In[201]: torch.randn(3,3) |
arange/range
- 生成等差数列
arange()
,默认以1来递增 - range现在已经不建议使用了
1 | In[207]: torch.arange(0,10) |
linspace/logspace
- 等分
linspace()
[0,10] , steps=4 logspace()
也是等分,不过是以10^x 来得到输出的。
1 | In[210]: torch.linspace(0,10, steps=4) |
ones/zeros/eye
- ones() 生成全部为1的
- zeros() 生成全部为0的
- eye() 生成单位向量
1 | In[215]: torch.ones(3,3) |
randperm
- 随机打散 (numpy中是 random.shuffle)
- randperm()
1 | In[223]: torch.randperm(10) |