深度学习之【PyTorch入门】——基本数据类型和维度变换
数据类型Pytorch中的数据类型数据类型比较pythonpytorchIntIntTensorfloatFloatTensorInt arrayIntTensor arrayFloat arrayFloatTensor arrayString-位置不同的数据类型(CPU和GPU)数据类型CPU TensorGPU Tensortorch.float32torch.FloatTensortorch
数据类型
Pytorch中的数据类型
数据类型比较
python | pytorch |
---|---|
Int | IntTensor |
float | FloatTensor |
Int array | IntTensor array |
Float array | FloatTensor array |
String | - |
位置不同的数据类型(CPU和GPU)
数据类型 | CPU Tensor | GPU Tensor |
---|---|---|
torch.float32 | torch.FloatTensor | torch.cuda.FloatTensor |
torch.float64 | torch.DoubleTensor | torch.cuda.DoubleTensor |
torch.uint8 | torch.ByteTensor | torch.cuda.ByteTensor |
torch.int32 | torch.IntTensor | torch.cuda.IntTensor |
torch.int64 | torch.LongTensor | torch.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个之后添加一个维度。
同理
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])
更多推荐
所有评论(0)