一.PyTorch实现模型训练
1.数据
如何把数据从硬盘读到内存?
如何组织数据进行训练?图片如何预处理及数据增强?
2.模型
如何构建模型模块?如何组织复杂网络?
如何初始化网络参数?如何定义网络层?
3.损失函数
如何创建损失函数?如何设置损失函数超参数?
如何选择损失函数?
4.优化器
如何管理模型参数?如何管理多个参数组实现不同学习率?
如何调整学习率?
5.迭代训练
如何观察训练效果?如何绘制loss/accuracy曲线?
如何用TensorBoard分析?
6.模型应用
如何进行图像分类?图像分割?目标检测?
对抗生成?循环网络?
二.张量简介与创建
1.tensor概念
张量是一个多维数组,它是标量,向量,矩阵的高维拓展
variable是torch.autograd中的数据类型,主要用于封装tensor,进行自动求导
主要有5个属性:
data:被包装的tensor
grad:data的梯度
grad_fn:创建tensor的function,是自动求导的关键
requires_grad:指示是否需要梯度
is_leaf:指示是否是叶子节点(张量)
pytorch4.0版开始,variable并入tensor
dtype:张量的数据类型,如torch.FloatTensor,torch.cuda.FloatTensor
shape:张量的形状,如(64,3,224,224)
device:张量所在设备,如CPU/GPU,是加速的关键
2.tensor创建:直接创建
①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共享内存,当修改其中一个的数据,另外一个也将会被改动
3.tensor创建:依据数值创建
①torch.zeros()
功能:依size创建全0张量
size:张量的形状,如(3,3),(3,224,224)
out:输出的张量
layout:内存中布局形式,有strided,sparse_coo等
device:所在设备,gpu/cpu
requires_grad:是否需要梯度
②torch.zeros_like()
功能:依input形状创建全0张量
input:创建与input同形状的全0张量
dtype:数据类型
③torch.ones()
④torch.ones_like()
功能:依input形状创建全1张量
dtype:数据类型
layout:内存中布局形式
device:所在设备,gpu/cpu
requires_grad:是否需要梯度
⑤torch.full()
⑥torch.full_like()
功能:依input形状创建全0张量
fill_value:张量的值
⑦torch.arange()
功能:创建等差的1维张量
注意事项:数值区间为[start,end)
start:数列起始值
end:数列结束值
step:数列公差,默认为1
⑧torch.linspace()
功能:创建均分的1维张量
注意事项:数值区间为[start,end]
steps:数列长度
⑨torch.logspace()
功能:创建对数均分的1维张量
注意事项:长度为steps,底为base
⑩torch.eye()
功能:创建单位对角矩阵(2维张量)
注意事项:默认为方阵
n:矩阵行数
m:矩阵列数
4.tensor创建:依据概率创建
①torch.normal()
功能:生成正态分布(高斯分布)
mean:均值
std:标准差
②torch.randn()
③torch.randn_like()
功能:生成标准正态分布
size:张量的形状
④torch.rand()
⑤torch.rand_like()
功能:在区间[0,1)上,生成均匀分布
⑥torch.randint()
⑦torch.randint_like()
功能:区间[low,high)生成整数均匀分布
⑧torch.randperm()
功能:生成从0到n-1的随机排列
n:张量的长度
⑨torch.bernoulli()
功能:以input为概率,生成伯努利分布
input:概率值
三.张量操作
1.张量的操作:拼接,切分,索引和变换
①拼接
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.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扩展维度
2.张量的数学运算
①加减乘除
torch.add()
功能:逐元素计算input+alpha*other
input:第一个张量
alpha:乘项因子
other:第二个张量
②对数,指数,幂函数
③三角函数
四.计算图与动态图机制
1.计算图
计算图是用来描述运算的有向无环图
计算图有两个主要元素:结点和边
结点表示数据,如向量,矩阵,张量
边表示运算,如加减乘除卷积等
2.动态图机制
根据计算图搭建方式,可将计算图分为动态图和静态图
动态图:运算和搭建同时进行
静态图:先搭建图,后运算
五.autograd - 自动求导系统
torch.autograd.backward
功能:自动求取梯度
tensors:用于求导的张量,如loss
retain_graph:保存计算图
create_graph:创建导数计算图,用于高阶求导
grad_tensors:多梯度权重
注意:
梯度不自动清零
依赖于叶子结点的结点,requires_grad默认为true
叶子结点不可执行in-place
六.数据读取机制DataLoader和Dataset
1.DataLoader
torch.utils.data.DataLoader
功能:构建可迭代的数据装载器
dataset:dataset类,决定数据从哪读取及如何读取
batchsize:批大小
num_works:是否多进程读取数据
shuffle:每个epoch是否乱序
drop_last:当样本数不能被batchsize整除时,是否舍弃最后一批数据
epoch:所有训练样本都已输入到模型中,称为一个epoch
iteration:一批样本输入到模型中,称为一个iteration
batchsize:批大小,决定一个epoch有多少个iteration
数据读取:读哪些数据?从哪读数据?怎么读数据?
2.Dataset
torch.utils.data.Dataset
功能:dataset抽象类,所有自定义的dataset需要继承它,并且复写
__getitem__()
gentitem:接收一个索引,返回一个样本
七.模型创建与nn.Module
1.模型创建步骤
①构建网络层:卷积层,池化层,激活函数层等
②拼接网络层
③权值初始化
模型构建两要素:构建子模块,拼接子模块
2.nn.Module
torch.nn
nn.Parameter:张量子类,表示可学习参数,如weight,bias
nn.Module:所有网络层基类,管理网络属性
nn.functional:函数具体实现,如卷积,池化,激活函数等
nn.init:参数初始化方法
八.模型容器Containers和AlexNet
1.nn.Sequential:按顺序包装多个网络层
顺序性,各网络层之间严格按顺序执行,常用于block构建
2.nn.ModuleList:像python的list一样包装多个网络层
迭代性,常用于大量重复网构建,通过for循环实现重复构建
3.nn.ModuleDict:像python的dict一样包装多个网络层,以索引方式调用网络层
索引性,常用于可选择的网络层
4.AlexNet
采用ReLU:替换饱和激活函数,减轻梯度消失
采用LRU(local response normalization):对数据归一化,减轻梯度消失
Dropout:提高全连接层的鲁棒性,增加网络的泛化能力
Data Augmentation TenCrop,色彩修改
九.卷积层
1.1d/2d/3d卷积
卷积运算:卷积核在输入信号(图像)上滑动,相应位置上进行乘加
卷积核:又称滤波器,过滤器,可认为是某种模式,某种特征
卷积过程类似于用一个模板去图像上寻找和它相似的区域,与卷积核模式越相似,激活值越高,从而实现特征提取
AlexNet卷积核可视化,发现卷积核学习到的是边缘,条纹,色彩这一些细节模式
卷积维度:一般情况下,卷积核在几个维度上滑动,就是几维卷积
2.卷积 - nn.Conv2d()
功能:对多个二维信号进行二维卷积
in_channels:输入通道数
out_channels:输出通道数,等价于卷积核个数
kernel_size:卷积核尺寸
stride:步长
padding:填充个数
dilation:空洞卷积大小
groups:分组卷积设置
bias:偏置
3.转置卷积 - nn.ConvTranspose
转置卷积又称为反卷积和部分跨越卷积,用于对图像进行上采样
十.池化,线性,激活函数层
1.池化层 - pooling layer
池化运算:对信号进行“收集”并“总结”,类似水池收集水资源,因而得名池化层
“收集”:多变少
“总结”:最大值/平均值
nn.MaxPool2d
功能:对二维信号(图像)进行最大值池化
kernel_size:池化核尺寸
stride:步长
padding:填充个数
dilation:池化核间隔大小
ceil_mode:尺寸向上取整
return_indices:记录池化像素索引
nn.AvgPool2d
功能:对二维信号(图像)进行平均值池化
nn.MaxUnpool2d
功能:对二维信号(图像)进行最大值池化上采样
2.线性层 - linear layer
线性层又称全连接层,其每个神经元与上一层所有神经元相连,实现对前一层的线性组合,线性变换
nn.Linear
功能:对一维信号(向量)进行线性组合
in_features:输入结点数
out_features:输出结点数
bias:是否需要偏置
3.激活函数层 - activation layer
激活函数对特征进行非线性变换,赋予多层神经网络具有深度的意义
nn.Sigmoid
输出值在(0,1),符合概率
导数范围是[0,0.25],易导致梯度消失
输出为非0均值,破坏数据分布
nn.tanh
输出值在(-1,1),数据符合0均值
导数范围是(0,1),易导致梯度消失
nn.ReLU
输出值均为正数,负半轴导致死神经元
导数是1,缓解梯度消失,但易引发梯度爆炸