数据类型

Pytorch中的数据类型

数据类型比较

pythonpytorch
IntIntTensor
floatFloatTensor
Int arrayIntTensor array
Float arrayFloatTensor array
String-

位置不同的数据类型(CPU和GPU)

数据类型CPU TensorGPU Tensor
torch.float32torch.FloatTensortorch.cuda.FloatTensor
torch.float64torch.DoubleTensortorch.cuda.DoubleTensor
torch.uint8torch.ByteTensortorch.cuda.ByteTensor
torch.int32torch.IntTensortorch.cuda.IntTensor
torch.int64torch.LongTensortorch.cuda.LongTensor

如何检查数据类型

a = torch.randn(2,3)
  • 方法1
a.type()
# 输出 torch.FloatTensor
  • 方法2
type(a)
# 输出 torch.Tensor
  • 方法3
isinstance(a, torch.FloalTensor)
# 输出 True
  • 方法4
a.dtype
# 输出 torch.FloatTensor

将数据搬到GPU上

a = torch.randn(3,3)
a = a.cuda()
print(a.dtype)
# 输出 torch.cuda.DoubleTensor

查看张量大小

a = torch.randn(2,3)
  • 方法1
a.shape
# 输出 (2,3)
  • 方法2
a.size()
# 输出 torch.size([2,3])
  • 方法3
a.numel()
# 输出 6
  • 方法4
a.dim()
# 输出 2

数据类型转换

a = np.array([2,3.3])
  • numpy转torch
torch.from_numpy(a)

# 输出 tensor([2.000,3.3000], dtype=torch.float64)
  • list转torch
torch.tensor([2,3.3])
# 输出 tensor([2.000,3.3000])

注: torch.Tensor跟torch.FloatTensor类似,接受的参数是张量的大小或者list,而torch.tensor接受的参数是list

  • 其他数据类型转torch
tensor = transforms.ToTensor()(array)
  • torch转PIL
tensor = transforms.ToPILImage()
  • torch转numpy
array = tensor.numpy()

*注意:Tensor的形状是[C,H,W],而cv2,plt,PIL形状都是[H,W,C]

创建Tensor

  • torch.tensor()

这个可以生成一个张量,传递的参数是list

  • torch.Tensor()

这个可以生成一个张量,传递的参数可以是list或大小(这个一般按照pytorch默认的数据类型来生成)

  • torch.FloatTensor()

这个可以生成一个浮点类型的张量,其中传递的参数可以是列表,也可以是维度值

  • torch.IntTensor()

这个可以生成一个整型类型的张量,其中传递的参数可以是列表,也可以是维度值

  • torch.rand()

这个函数可以生成数据为浮点类型且维度指定的随机张量,与numpy中的numpy.rand()类似。生成的数范围在 [ 0 , 1 ] [0,1] [0,1]之间,传递的参数是张量大小

  • torch.randn()

这个函数可以生成数据为浮点类型且维度指定的随机张量,与numpy中的numpy.rand()类似。生成的数取值满足均值为0、方差为1的正态分布

  • torch.randint()

这个函数可以生成数据为整型类型且维度指定的随机张量,与numpy中的numpy.rand()类似。生成的数范围在 [ 0 , 1 ] [0,1] [0,1]之间,传递的参数是最小值,最大值,张量大小

  • torch.range()

这个函数可以生成数据为浮点类型且定义范围的张量,传递3个参数,分别为范围的起始值,范围的结束值,每个数据之间的间隔

  • torch.arange()

这个函数可以生成有一定规律的张量,传递3个参数,起始值,结束值,间隔

  • torch.full()

这个函数可以把所有的元素赋值成相同的值,传递两个参数,list(张量大小)和要赋的值

  • torch.normal()

这个函数可以根据张量的均值和方差生成张量

  • torch.zeros()

这个可以生成数据类型为浮点且维度指定的张量,且所有元素都是0,即可以生成一个零张量

  • torch.ones()

这个可以生成数据类型为浮点且维度指定的张量,且所有元素都是1。

  • torch.eye()

这个可以生成一个数据类型为浮点且主对角线为1的张量,即生成一个单位张量

  • torch.linspace()

这个可以生成按一定比例划分连续的一个张量,传递的参数有起始值,结束值,分成几份。(其实就是按照线性划分)

  • torch.logspace()

这个是按照对数空间上进行划分,与上面一个相同

  • torch.randperm()

这个是可以把张量进行打乱,进行一个shuffle的操作。传递的参数是维度,要打乱第几维度

  • torch._like()
    这个传入一个tensor,那么他就会生成一个对应传入的tensor相同大小的一个随机矩阵,这里的
    可以是任意的一个随机创建tensor的API

平时我们传入神经网络的图片一般是四维的

CNN中:

[ b , c , h , w ] [b,c,h,w] [b,c,h,w]

b : b: b:batch,一批多少张图片

c : c: c:channel,图片通道数

h : h: h:height,图片的高

w : w: w:weight,图片的宽

维度变换

Tensor切片

a = torch.randn(4,1,28,28)
  • view和reshape

a.view和a.reshape的作用是一样,都是将张量的大小进行改变

例如:

a = a.view(4,28*28)
print(a.shape)
#输出 torch.size([4,784])

注:一定要保证总的大小是不变的,也就是numel()不变,否则会造成数据的丢失

  • squeeze和unsqeeze

unsqeeze就是一个维度增加的操作

a.unsqueeze(0)表示在在第0个维度之前添加一个维度

a.unsqueeze(4)表示在第4个维度之前添加一个维度

传递的参数就是指在第n个维度之前添加一个维度,这个参数也可以是负数,表示从倒数第n个之后添加一个维度。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NrxWtYP8-1595658434641)(imgs/1.png)]

同理

squeeze是一个维度删除的操作

基本用法相同

squeeze不传给任何参数的时候是会把能删除的都删除了,比如有1的
在这里插入图片描述

理解传入神经网络的张量可以从物理意义上去理解

  • Expand

Expand改变了我们对于张量的理解,但没有增加数据。这个API只会在有需要的时候才会拷贝数据。且只能把某一个为1的维度进行扩展,其他不为1的维度无法扩展。

a = torch.rand(4,32,14,14)
b = torch.rand(1,32,1,1)

>>>b.expand(4,32,14,14).shape
# torch.Size([4, 32, 14, 14])
>>> b.expand(-1,32,-1,-1).shape
# torch.Size([1, 32, 1, 1])
  • Repeat

给原来的张量添加了数据,改变了理解的方式。因为这个是会拷贝数据,主动地拷贝数据。给的参数是指对应的某个维度需要拷贝的次数

b = torch.rand(1,32,1,1)

>>> b.repeat(4,1,4,4).shape
# torch.Size([4, 32, 4, 4])
>>> b.repeat(4,32,4,4).shape
# torch.Size([4, 1024, 4, 4])
  • t

对目标张量进行转置,但只能对2维张量进行转置

  • transpose

对目标张量的维度进行交换

a = torch.FloatTensor(4,3,32,32)

>>> a1 = a.transpose(1,3).contiguous().view(4,3*32*32).view(4,3,32,32).shape
# torch.Size([4, 3, 32, 32])
Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐