Pytorch的定义
PyTorch是一个开源的Python机器学习库,基于Torch,用于自然语言处理等应用程序。它是一个基于Python的可续计算包,提供两个高级功能:
- 具有强大的GPU加速的张量计算(如NumPy)
- 包含自动求导系统的的深度神经网络。
Tensor和Variable
- data:被包装的Tensor
- grad:data的梯度
- grad_fn:创建Tensor的Function,是自动求导的关键
- requires_grad:指示是否需要梯度
- is_leaf:指示是否是叶子结点(张量)
- dtype:张量的数据类型,如torch.FloatTensor,torch.cuda.FloatTensor
- shape:张量的形状,如(64,3,224,224)
- device:张量所在设备,GPU/CPU,是加速的关键
张量的创建
一、直接创建
torch.tensor()
功能:从data创建tensor
- data:数据,可以是list,numpy
- dtype:数据类型,默认与data一致
- device:所在设备,cuda/cpu
- requires_grad:是否需要梯度
- pin_memory:是否存于锁页内存
torch.from_numpy(ndarray)
功能:从numpy创建tensor
注意事项:从torch.from_numpy创建的tensor于原ndarray共享内存,当修改其中一个的数据,另外一个也将会被改动。
二、依据数值创建
torch.zeros()
功能:依size创建全0张量
- size:张量的形状,如(3,3)、(3,224,224)
- out:输出的张量
- layout:内存中布局形式,有strided,sparse_coo等
- device:所在设备
- requires_grad:是否需要梯度
torch.zeros_like()
功能:依input形状创建全0张量
- input:创建与input同形状的全0张量
- dtype:数据类型
- layout:内存中布局形式
torch.ones()
torch.ones_like()
功能:依input创建全1张量
- size:张量的形状,如(3,3)、(3,224,224)
- dtype:数据类型
- layout:内存中布局形式
- device:所在设备
- requires_grad:是否需要梯度
torch.full()
torch.full_like()
功能:依input形状创建全0张量
- size:张量的形状,如(3,3)
- fill_value:张量的值
torch.arange()
功能:创建等差的1维张量
注意:数值区间为[start, end]
- start:数列起始值
- end:数列结束值
- step:公差,默认为1
torch.linspace()
功能:创建均分的1维张量
注意:数值区间为[start, end]
- start:数列起始值
- end:数列结束值
- step:数列长度
torch.eye()
功能:创建单位对角矩阵(2维张量)
注意:默认为方阵
- n:矩阵行数
- m:矩阵列数
三、依概率分布创建张量
torch.normal()
功能:生成正态分布(高斯分布)
注意:数值区间为[start, end]
- mean:均值
- std:标准差
- 四种模式:mean和std是张量标量的排列组合
torch.randn()
torch.randn_like()
功能:生成标准正态分布
- size:张量的形状
torch.rand_like()
功能:在区间[0, 1)上,生成均匀分布
torch.randperm()
功能:生成从0到n-1的随机排列(经常用来生成索引)
- n:张量的长度
torch.bernoulli()
功能:以input为概率,生成伯努利分布(0-1分布,两点分布)
- input:概率值
张量的操作
一、张量拼接与切分
torch.cat()
功能:将张量按维度dim进行拼接
- tensors:张量序列
- dim:要拼接的维度
torch.stack()
功能:在新创建的维度dim上进行拼接
- tensors:张量序列
- dim:要拼接的维度
torch.chunk()
功能:将张量按维度dim进行平均切分
返回值:张量列表
注意:若不能整除,最后一份张量小于其他张量
- input:要切分的张量
- chunks:要切分的份数
- dim:要切分的维度
torch.split()
功能:将张量按维度dim进行切分
返回值;张量列表
- tensor:要切分的张量
- split_size_or_sections:为int时,表示每一份的长度;为list时,按list元素切分
- dim:要切分的维度
二、张量索引
torch.index_select()
功能:在维度dim上,按index索引数据
返回值;依index索引数据拼接的张量
- input:要索引的张量
- dim:要索引的维度
- index:要索引数据的序号
torch.masked_select()
功能:按mask中的True进行索引(通常用来筛选数据)
返回值;一维张量
- input:要索引的张量
- mask:与input同形状的布尔类型张量
torch.index_select()
功能:在维度dim上,按index索引数据
返回值;依index索引数据拼接的张量
- input:要索引的张量
- dim:要索引的维度
- index:要索引数据的序号
torch.index_select()
功能:在维度dim上,按index索引数据
返回值;依index索引数据拼接的张量
- input:要索引的张量
- dim:要索引的维度
- index:要索引数据的序号
三、张量变换
torch.reshape()
功能:变换张量形状
注意:当张量在内存中是连续时,新张量与input共享数据内存
- input:要变换的张量
- shape:新张量的形状
torch.transpose()
功能:变换张量的两个维度
注意:交换张量的两个维度
- input:要变换的张量
- dim0:要交换的维度
- dim1:要交换的维度
torch.t()
功能:2维张量转置,对矩阵而言,等价于torch.transpose(input, 0, 1)
torch.squeeze()
功能:压缩长度为1的维度(轴)
- dim:若为None,移除所有长度为1的轴;若指定维度,并且当且仅当该轴长度为1时,可以被移除;
torch.unsqueeze()
功能:依据dim扩展维度
- dim:扩展的维度
四、张量数学运算
加减乘除、对数、指数、幂函数、三角函数
torch.add()
功能:逐元素计算input+alpha*other
- input:第一个张量
- alpha:乘项因子
- other:第二个张量
五、线性回归
线性回归是分析一个变量与另外一(多)个变量之间关系的方法。
因变量:y,自变量:x,关系:线性,y = wx + b,分析:求解w,b
求解步骤:
- 确定模型
- 选择损失函数
- 求解梯度并更新w,b
六、计算图
- 计算图是用来描述运算的有向无环图。
- 计算图有两个主要元素:结点和边。
- 结点表示数据,如向量,矩阵,张量。
- 边表示运算,如加减乘除卷积等。
- retain_grad()可以保留非叶子结点的梯度。
- grad_fn:记录创建该张量时所用的方法(函数)。
七、动态图
根据计算图搭建方式,可将计算图分为动态图和静态图
- 动态图是运算与搭建同时进行(灵活,易调节)。
- 静态图是先搭建图后运算(高效,不灵活)。
八、自动求导系统(autograd)
torch.autograd.background
-
tensors:用于求导的张量,如loss。
-
tetain_graph:保存计算图(因为pytorch会自动释放计算图)。
-
create_graph:创建导数计算图,用于高阶求导。
-
grad_tensors:多梯度权重
torch.autograd.grad
功能:求取梯度
-
outputs:用于求导的张量,如loss。
-
inputs:需要梯度的张量
-
tetain_graph:保存计算图(因为pytorch会自动释放计算图)。
-
create_graph:创建导数计算图,用于高阶求导(设为true)。
-
grad_tensors:多梯度权重
autograd小贴士:
- 梯度不自动清零。(zero_())
- 依赖于叶子结点的结点,requires_grad默认为True
- 叶子结点不可执行in-place(in-place操作就是在原始内存当中改变这个数据,而不用开辟新的地址块)。
九、逻辑回归
逻辑回归是线性的二分类模型,Sigmoid函数,Logistic函数
线性回归是分析自变量x与因变量y(标量)之间关系的方法,逻辑回归是分析自变量x与因变量y(概率)之间关系的方法。
十、迭代训练(步骤)
- 数据
- 模型
- 损失函数
- 优化器