Pytorch——如何创建一个tensor与索引和切片(二)

1、两种常见的随机初始化

(1) rand函数

rander函数就是随机的使用0和1的均值分布来初始化,也就是说它从零和一的空间中随机的均匀的sample出来,这样数据就回均匀的分布在0和1之间。

torch.rand(3,3) #表示随机生成一个3X3的数值在0和1之间的均匀分布的矩阵

a=torch.rand(3,3)
torch.rand_like(a) #将a,shape读取出来再送给rand函数 

(2)randint函数

randint的参数表示它要指定一个极小值,一个最小值和一个最大值

torch.randint(1,10,[3,3])

2、正态分布 randn函数

torch.randn(3,3) #表示均值为零,方差为一的三行三列的矩阵

#自定义均值和方差
torch.normal(mean=torch.full([10],0),std=torch.arange(1,0,-0.1))
#使用起来有点奇怪

3、full tensor全部赋值为一个元素

torch.full([2,3],7)#表示要生成一两行三列的一个tensor,把全部数值赋值为7

torch.full([],7) #生成标量,dim为1

torch.full([1],7) ##生成向量

4、arange/range 递增或递减生成等差数列

troch.arange(0,10) # 生成一个从零开始不包括10的等差数列

troch.arange(0,10,2) #生成一个从零开始不包括10的,阶梯为2的等差数列


troch.range(0,10) #这个不需要看

5、linspace/logspace 生成等分

torch.linspace(0,10,steps=4)
#表示0到10,包含10,steps=4表示要切成四等分


torch.linspace(0,10,steps=10)
#表示0到10,包含10,所以有11个数,steps=10表示要切成10等分

torch.linspace(0,10,steps=11)
#表示0到10,包含10,所以有11个数,steps=10表示要切成11等分

torch.logspace(0,-1,steps=10)
#表示生成0到-1之间的数,10的0次方到10的-1次方。

6、ones/zero/eye  全部是1的,全部是0的,单位矩阵

torch.ones(3,3) 生成三行三列数值全部为1

torch.zero(3,3) 生成三行三列数值全部为0

torch.eye(3,4) 生成三行四列对角是1的单位矩阵

7、randperm 随机打散

生成的是0到10的随即索引是不包括10的

索引

1、具体的索引

a=torch.rand(4,3,28,28)#dim=4的数据,这个数据就是我们用的CNN里面的数据输入
#第一个维度是batch_size,第二个维度是n_channels,第三个和第四个是长和宽
print(a.shape)

print(a.index_select(0,[0,2]))
#第一个参数表示对那个维度上面进行操作,第二个参数表示索引号,取0到2,也就是三个通道

print(a.index_select(1,[1,2]))
#第一个参数表示再第一个维度上进行操作,取1到2,也就是两个通道

print(a.index_select(2,torch,arrage(28)).shape)
#表示对第二个维度进行操作,在行上进行操作,第二个参数表示选取了所有的行

print(a.index_select(2,torch,arrage(8)).shape)
#表示对第二个维度进行操作,在行上进行操作,第二个参数表示选取0到8,也就是8行

2、...

...三个点,表示表示任意多的维度

a=torch.rand(4,3,28,28)#dim=4的数据,这个数据就是我们用的CNN里面的数据输入
#第一个维度是batch_size,第二个维度是n_channels,第三个和第四个是长和宽
print(a.shape) #输出结果torch.Size([4,3,28,28])

print(a[...].shape) #输出结果torch.Size([4,3,28,28])
#a[...]=a[0]

print(a[0,...].shape) #输出结果torch.Size([3,28,28])
#表示取第0个图片的所有通道,所有行和所有列

print(a[:,1,...].shape) #输出结果torch.Size([4,28,28])
#取所有图片的第一个通道的所有行和所有列

print(a[...,:2].shape) #输出结果torch.Size([4,3,28,2])
#第一个参数表示前面任意长度都取,所有batch,所有channal,所有行的前两列,第二个参数表示只取两列

 3、使用mask(掩码)来索引  masked_select()

 x=troch.randn(3,4)
print(x) #随机生成一个三行四列的tensor


mask=x.ge(0.5) #表示大于等于0.5的元素的位置输出为1

torch.masked_select(x,mask)  #表示掩码为1的数据取出来

torch.masked_select(x,mask).shape #mask会把原来的三行四列的张量打平,变成12个数据

4、take函数

src=torch.tensor([[4,3,5],[6,7,8]])
#表示两行三列的数据先打平,变成6个数据
torch.take(src,torch.tensor([0,2,5]))
#表示取第1个、第3个、第6个数据  输出结果tensor([4,5,8])

猜你喜欢

转载自blog.csdn.net/qq_42012782/article/details/124094025