Pytorch 创建Tensor

1. 从Numpy创建Tensor

import torch
import numpy as np

a = np.array([2, 3.3])
b = torch.from_numpy(a)  # torch.DoubleTensor

注意:该种创建方式a与b共享内存,修改其中一个另外一个也会改变,需要注意。 

2. 从List创建Tensor

a = torch.FloatTensor([2, 3.3])  
b = torch.tensor([2, 3.3]) 

注意:小写的tensor只接受现有的数据;而大写的Tensor相当于就是FloatTensor,既可以接收现有的数据,也可以接受shape来创建指定形状的Tensor。为了避免混淆,建议接收现有数据的时候使用tensor,指定shape的时候使用Tensor。

3. 指定维度创建Tensor

# 生成2行3列的数据
a = torch.empty(2, 3)
b = torch.FloatTensor(2, 3)
c = torch.IntTensor(2, 3)

注意:通过指定维度创建的Tensor,初始化的值是随机的,数据不规则,容易出现问题。

4. 设置Tensor的默认类型

使用torch.tensor传入浮点数元素,或者使用torch.Tensor仅指定维度时,生成的默认是FloatTensor,也可以修改默认设置使其默认是其它类型的。

print(torch.tensor([1, 2.2]).type())
torch.set_default_tensor_type(torch.DoubleTensor)
print(torch.tensor([1, 2.2]).type())

 运行结果:

torch.FloatTensor
torch.DoubleTensor

 5. 随机初始化创建Tensor

(1) rand(shape):生成shape维度的并且随机均匀采样0~1之间的数据

(2)rand_like(Tensor):形如*_like()函数,接收一个Tensor,并根据Tensor的shape生成对应维度的随机均匀采样的数据

(3)randint(min, max, shape):生成最小值为min,最大值为max(应该是不能等于max),维度为shape的随机均匀采样的数据

(4)randn(shape):生成均值为0,方差为1,shape维度的正态分布数据

示例代码:

# 采样自0~1均匀分布
a = torch.rand(3, 3)

# 形如*_like接受一个Tensor,将这个Tensor的shape读取出来之后在送入*所表示的函数
# 下面的rand_like(a)即将a的shape=3,3读出来传给torch.rand()函数
b = torch.rand_like(a)  # 相当于执行了torch.rand(3,3)

# 在区间[1,10)上随机采样,生成shape=2,2的LongTensor
c = torch.randint(1, 10, [2, 2])

# 采样自N(0,1)
d = torch.randn(3, 3)

输出结果:

tensor([[0.0242, 0.4888, 0.8328],
        [0.6072, 0.4250, 0.6537],
        [0.4467, 0.5544, 0.5739]])
tensor([[0.7346, 0.4328, 0.2864],
        [0.6549, 0.7066, 0.8149],
        [0.2559, 0.8357, 0.6266]])
tensor([[1, 2],
        [6, 7]])
tensor([[ 0.5008, -1.0735, -0.6840],
        [ 1.0555, -0.5063,  0.7005],
        [-0.3162, -1.8131, -1.5876]])

 

6. 使用相同元素构建Tensor

# shape=2,3,所使用的相同的元素为7
b = torch.full([2, 3], 7)

输出结果:

tensor([[7., 7., 7.],
        [7., 7., 7.]])

注意:shape的指定方式是list方式。 

指定list = [ ],可以生成一个标量:

v = torch.full([], 10)
print(v)
print(v.dim())

输出结果:

tensor(10.)
0

 

 7. 指定参数的正态分布Tensor

# 指定均值和标准差
a = torch.normal(mean=torch.full([10], 0), std=torch.arange(1, 0, -0.1))

上面参数mean = [0, 0, 0, 0, 0, 0, 0, 0, 0,0],std =  [1, 0.9, ... , 0.1],得到的结果是1x10的Tensor,如果想得到其它shape的正态分布,需要在1x10的基础上reshape 为其它维度。

输出结果:

tensor([ 0.6890, -1.2106, -0.0755, -0.0288, -0.2386,  0.2977,  0.1251, -0.2366,
         0.0097, -0.1684])

 

 8. 有序数列Tensor

a = torch.arange(0, 10) # 不包含10,默认步长为1
print(a)
b = torch.arange(0, 10, 2)
print(b)

输出结果:

tensor([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
tensor([0, 2, 4, 6, 8])

注意torch.range()是包含结尾的,但是已经被弃用了,一律用arange。

 

 9. 生成等分序列Tensor

c = torch.linspace(0, 10, 4)
print(c)

生成0~10之间的包括10,4个等分数列Tensor:

tensor([ 0.0000,  3.3333,  6.6667, 10.0000])

 

10. logspace(n, m, step=s)

从10的n次方取到10的m次方,指数是等差的,也就是元素值是等比的。

e = torch.logspace(0, -1, 5)
print(e)

输出结果:

tensor([1.0000, 0.5623, 0.3162, 0.1778, 0.1000]) 

 

11. 全0的Tensor

a = torch.zeros([3, 4])

输出结果:

tensor([[0., 0., 0., 0.],
        [0., 0., 0., 0.],
        [0., 0., 0., 0.]])

 

12.全1的Tensor

b = torch.ones([3, 4])

输出结果:

tensor([[1., 1., 1., 1.],
        [1., 1., 1., 1.],
        [1., 1., 1., 1.]])

 

13. 对角阵Tensor

c = torch.eye(3, 4)  # 只能是二维的,传入dim=2的shape

输出结果:

tensor([[1., 0., 0., 0.],
        [0., 1., 0., 0.],
        [0., 0., 1., 0.]])

也可以只给一个参数n,得到n阶的对角方阵: 

c = torch.eye(4)  
print(c)

输出结果:

tensor([[1., 0., 0., 0.],
        [0., 1., 0., 0.],
        [0., 0., 1., 0.],
        [0., 0., 0., 1.]])

 

14. randperm

使用randperm可以生成一个从0开始的、已经打乱的连续索引Tensor,用它可以对其它Tensor做shuffle。特别是在有几个需要保持一致顺序的Tensor时,用相同的索引Tensor就能保证shuffle之后的Tensor在那个维度上的顺序一致了。

 

import torch

# 两个Tensor的shape[0]是相同的,都是3
a = torch.rand(3, 1)
b = torch.rand(3, 1)
print(a, b, sep='\n')
print("-" * 20)

# 制造一个[0,3)的索引序列
idx = torch.randperm(3)
print(idx)
print("-" * 20)

# 给a,b做shuffle,保证第一个维度在shuffle后的对应关系不变
a_sf = a[idx]
b_sf = b[idx]
print(a_sf, b_sf, sep='\n')

 输出结果:

tensor([[0.2253],
        [0.6864],
        [0.9565]])
tensor([[0.7317],
        [0.0779],
        [0.3842]])
--------------------
tensor([2, 1, 0])
--------------------
tensor([[0.9565],
        [0.6864],
        [0.2253]])
tensor([[0.3842],
        [0.0779],
        [0.7317]])
--------------------- 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

洪流之源

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值