pytorch基础知识

pytorch是什么?

pytorch是一个深度学习库,它是基于动态图的,动态图是指在计算图的构建和运行时同时进行的,过程中可以输出中间结果,相对应的是TensorFlow1.x,TF1.x是静态图,即图的构建与运算是分离的,并且在运行时,不能干预,给定输入,只能得到输出,中间过程得不到。

pytorch的生态

pytorch NLPPytorch geometrictorchvsionfast.aiONNX协议

pytorch能够做什么?

  1. GPU加速

  2. 自动求导

  3. 常用网络层

import torch 
from torch import autograd
x=torch.tensor(1.)
a=torch.tensor(1.,requires_grad=Ture)
b=torch.tensor(2.,requires_grad=Ture)
c=torch.tensor(3.,requires_grad=Ture)
y=a**2*x+b*x+c
grad=autograd.grad(y,[a,b,c])

pytorch中所有的都是tensor

tensor维度检查

a.torch.randn(2,3)
a.type()
type(a)
isinstance(a,torch.floatTensor)
#在CPU和GPU上的tensor类型不同
data=data.cuda()
isinstance(data,torch.cuda.DoubleTensor)
#返回tensor的形状有两种方式,
a.shape#属性
a.size()# 方法

0维tensor

0维tensor就是标量,意义表示为损失函数loss

torch.tensor(1.3) #直接把标量放入
len(a.shape)# 0

一维tensor

一维tensor就是向量,含义为线性变换中的偏置( y = W x + b y=Wx+b y=Wx+b中的 b b b),或者线性输入(28*28=784中的784)

torch.tensor([1.1])
torch.tensor([1.11.2]

二维tensor

二维tensor就是矩阵,含义是线性输入的batch,例如[4,784],表示4张照片,每一个的线性输入为784.

a=torch.randn(2,3)
a.shape
a.size(0)# 第0个维度,
a.size(1)
a.shape[1]

三维tensor

三维tensor特别适合表达RNN的输入的批结构,形式为[words,batch(sententces),embedding],

例如[10,20,100]表示有每一个批次有20个句子,每一个句子有10个单词,每一个单层的嵌入后的维度为100.

a=torch.rand(1,2,3)
a[0]# 没写出的部分,表示全部选中
list(a,shape)

四维tensor

四维tensor适合表达图形,格式为[batch,channel,height,width],例如[2,3,28,28],表示每一个批次有2张图片,每一个图片的channel为3(灰度为1,RGB为3),每一张图片的长为28px,宽度为28px

多维tensor先从每一个维度的含义去理解

tensor的形成

  • 从numpy中导入

    a=np.array([1,2,3])
    torch.from_numpy(a)
    
  • 从列表中生成

  • 未初始化的,eg:torch.empty(),torch.FloatTensor()

  • 随机生成(和numpy一样 rand rand_like):rand() [0,1)之间的均匀分布,randn()标准正太分布,randint()

  • 填充生成。

    torch.full([2,3],7)
    
  • arrange(a,b)生成数据范围[a,b)

  • linspace,logspace

  • ones,zeros,eye

    torch.ones(3,3)
    torch.zeros(3,3)
    torch.eye(3,4)
    

    pytorch切片(和python、numpy一样)

    :表示整个维度,-1表示从从右往左的第一个元素,不同维度用逗号隔开,…表示任意维度,和reshape中的-1一样,由其他维度推算出来。

    a=torch.randn(4,3,28,28)
    a[:,:,0:28:2,0:28:2]#隔行采样
    [...,::2,::2]# 当开始元素是第一个,结束元素是最后一个,都可以省略
    
    • select first N
    • select by steps
    • select by specific index
    • select by mask .masked_select()

pytorch维度操作

view/reshape

两个的意思一样,都是在保证元素总数不变的情况下,改变对数据的理解

a=torch.rand(4,1,28,28)#4张照片,每张是灰度图像,长为28px,宽为28px
a.view(4,28*28)# 表示把每一个图片的所有信息合并在一起,用一个784维度的向量来表示
a.view(4*48,28)# only care one
a.view(1*4,28,28) #only care feature map
# 不变的部分是需要我们关注的,不关注的可以直接用-1代替,让pytorch计算去。

squeeze/unsqueeze

squeeze原意表示挤压,此处表示减少维度,unsqueeze原意是展开,此处表示增加维度,两者都是在不改变元素总数的情况下的操作.这点与view一致。

改变的是对数据的理解

a=torch.rand(4,1,28,28)
a.unsqueeze(0).shape# 可以理解为增加一个组
a.unsqueeze(-1).shape #可以理解增加一个方差属性
a.unsqueeze(4).shape
# 不会增加数据,也不会减少数据
# tensor的理解:从每一个维度出发分别去理解。
b=torch.rand(42) # 想和一个多维中某一维去相加。
f=torch.rand(4,32,14,14) 
b=b.unsqueeze(1).unsqueeze(2).unsqueeze(0)
squeeze(idx) #不给参数,表示能挤压的全部挤压。
b=torch.rand(1,32,1,1)
b.squeeze().shape # torch.Size([32])
b.squeeze(0)
b.squeeze(-1)
b.squeeze(1)

expand/repeat

其中expand是广播,当只有一个元素时才有效(有多个时,不知道该用哪一个做拓展),eg:

[1,32,1,1]-->[4,32,14,14],而repeat的参数是每一个维度重复的次数。

a=torch.rand(4,23,14,14)
b=torch.rand([1,32,1,1,1])
b.expand(-1,32,-1,-1)

转置.t()、.transpose(),permute

其中.t()只适用于矩阵(二维tensor)的转置,.transpose()只适用于交换两个维度.而.permute最灵活,其参数为原维度在新维度的顺序

a=torch.rand(4,3,28,28)
a,transpose(1,3).shape# [4,28,28,3]
b.transpose(1,3).transpose(1,2).shape #交换两个维度
b.permute(0,2,3,1)# shape,参数的位置新的维度的次序,参数的值表示原来的次序

你可能感兴趣的:(Python)