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

创建Tensor

numpy是一个非常常见的数据的一个载体,数据可以先从numpy中间先导进tensor来;

1、从numpy引入 import from numpy

a=np.array([2,3.3])#从numpy中创建一个dim=1,长度为2的一个向量;
print(torch.from_numpy(a))#使用torch.from_numpy()的函数将numpy作为参数导进来,数据维持不变
#输出结果为tensor([2.0000,3.3000],dtype=torch.float(64))

a=np.ones([2,3])#使用numpy的ones()函数新建了一个矩阵,三行两列
print(torch.from_numpy(a))#输出结果([[1.,1.,1.],[1.,1.,1.]],dtype=torch.float(64))

2、从list导入 import from list

#如果只用导入一个小数据量的数据,则可以不用numpy作为数据载体,可以直接在数据的参数里面使用类似的方法承载进去
a=torch.tensor([2.,3.2]) #创建一个向量
print(a) #输出结果tensor([2.0000,3.2000])


a=torch.FloatTensor([2.,3.2])
print(a) #输出结果tensor([2.0000,3.2000])

a=torch.tensor([2.,3.2],[1.,22.3 ])
print(a)

FloatTensor和tensor的区别:

FloatTensor,是接受shape作为参数,指定一个维度,生成一个没有初始化的数组类型(接受数据的维度);

tensor,是接受现有的数据;

3、怎么生成数据未初始化的数据

比如说我们要申请一片内从空间,不需要初始化,未初始化的数据不是说没有数据,而是数据一般是非常随机的,读写的时候可能会出现非常非常不规则的数据。

第一,可以直接使用empty()函数:Torch.empty()

第二,使用FloatTensor()函数,推荐使用的,给定一个shape,比如说,我们要生成一个CNN的图片,那就是说图片的第一个维度是80size,第二个维度是如果你用的是mini的数据集,第三个维度是28,第四个维度是28,因此我们使用float参数来生成这样。Torch.FloatTensor([3,1,28,28])

如果是生成int类型的tensor,就是Torch.TntTensor(d1,d2,d3)

未初始化的api使用的时候把它作为一个容器,后面要把数据写进来,不然直接使用,可能会造成一系列的问题。

4、设置默认的数据类型  set default type

torch.tensor([1.2,3]).type() #查看tensor的数据类型

#把默认的数据类型改为double
torch.set_default_tensor_type(torch.DoubleTensor)

一般来说在pytorch中都会使用DoubleTensor的数据类型,因为精度比较高。

索引

1、最简单的索引,直接给定索引

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

print(a[0].shape) #输出结果troch.Size([3,28,28])
#给了一个维度,表示取得是第一张图片,第一张图片包括三个通道,长和宽。

print(a[0,0].shape) #输出结果torch.size([28,28])
#给了两个维度,dim=0和dim=1,表示取第0张图片的第0个通道,所以size就是28x28;

print(a[0,0,2,4]) #输出结果tensor(0.8082)
#表示第0张图片的第0个通道,第二行第四列的像素点打印出来。

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[:2].shape) #输出结果torch.Size([2,3,28,28])
#表示从0张图片开始到第二张图片,不包括第二张图片,也就是0和1两张图片。

print(a[:2,:1,:,:].shape) #输出结果torch.Size([2,1,28,28])
#表示从0张图片开始到第二张图片,不包括第二张图片,也就是0和1两张图片,然后0通道,也就是一个通道,后面是全部都取,也就是28x28.

print(a[:2,1:,:,:].shape) #输出结果torch.Size([2,2,28,28])
#表示从0张图片开始到第二张图片,不包括第二张图片,也就是0和1两张图片,然后从1通道到最后一个通道,也就是1通道和2通道,也就是两个通道,后面是全取,也就是28x28.

print(a[:2,-1:,:,:].shape) #输出结果torch.Size([2,1,28,28])
#表示从0张图片开始到第二张图片,不包括第二张图片,也就是0和1两张图片,然后从-1通道也就是最后一个通道。后面是全取,也就是28x28.

#[0,1,2],正向索引就是0,1,2;反向索引就是-3,-2,-1;

3、间隔采样 select by step

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[:,:,0:28:2,0:28:2].shape) #输出结果torch.Size([4,3,14,14])
#表示对所有的batch和所有的channels,高和宽上做隔行采样,0:28表示取所有的,0:28:2表示隔行

print(a[:,:,::2,::2].shape) #输出结果torch.Size([4,3,14,14])
#表示对所有的batch和所有的channels,高和宽上做隔行采样,:表示取所有的,::2表示隔行

#通用形式: start:end:step

猜你喜欢

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