1.深度学习平台介绍
1.1 深度学习各框架评价
1.2 PyTorch简介
PyTorch是一个Python的深度学习库。它最初由Facebook人工智能研究小组开发,而优步的Pyro软件则用于概率编程最初,PyTorch由Hugh Perkins开发,作为基于Torch框架的LusJIT的Python包装器。PyTorch在Python中重新设计和实现Torch,同时为后端代码共享相同的核心C库,除了Facebook之外,Twitter、GMU和Salesforce等机构都采用了PyTorch。到目前,据统计已有80%的研究采用PyTorch,包括Google。
1.3 PyTorch的基本使用
1.3.1 基本概念
张量(Tensor):
是一个物理量,对高维(维数 ≥ 2) 的物理量进行“量纲分析” 的一种工具。简单的可以理解为:一维数组称为矢量,二维数组为二阶张量,三维数组为三阶张量…
计算图:
用“结点”(nodes)和“线”(edges)的有向图来描述数学计算的图像。“节点” 一般用来表示施加的数学操作,但也可以表示数据输入的起点/输出的终点,或者是读取/写入持久变量的终点。“线”表示“节点”之间的输入/输出关系。这些数据“线”可以输运“size可动态调整”的多维数据数组,即“张量”。展示一个计算图:
import torch
x = torch.randn(2,2)
y = torch.randn(2,2)
z = torch.randn(2,2)
a = x + y
b = a + z
- 使用 tensor 表示数据
- 使用 Dataset、DataLoader 读取样本数据和标签
- 使用变量 (Variable) 存储神经网络权值等参数
- 使用计算图 (computational graph) 来表示计算任务
- 在代码运行过程中同时执行计算图
2.卷积神经网络基础
2.1 基本概念
卷积神经网络(convolutional neural network,CNN)是一类强大的、为处理图像数据而设计的神经网络。 基于卷积神经网络架构的模型在计算机视觉领域中已经占主导地位,当今几乎所有的图像识别、目标检测或语义分割相关的学术竞赛和商业应用都以这种方法为基础。
常用基本概念:
全连接网络:链接权过多,也很难收敛,同时可能会进入局部极小值,容易产生过拟合问题
局部连接网络:只有一部分权值连接,只有部分输入和权值卷积
特征提取:特征提取采用卷积的模式,提取过程如下图所示。
卷积核(Kernel)
可以把卷积核理解为权重。每一个卷积核都可以当做一个“特征提取算子”,把一个算子在原图上不断滑动,得出的滤波结果就被叫做“特征图”(Feature Map),这些算子被称为“卷积核”(Convolution Kernel)。我们不必人工设计这些算子,而是使用随机初始化,来得到很多卷积核,然后通过反向传播优化这些卷积核,以期望得到更好的识别结果。
填充/填白(Padding)
在进行卷积层的处理之前,有时要向输入数据的周围填入固定的数据(比如0等),使用填充的目的是调整输出的尺寸,使输出维度和输入维度一致;
步长(Stride)
即卷积核每次滑动几个像素。前面我们默认卷积核每次滑动一个像素,其实也可以每次滑动2个像素。其中,每次滑动的像素数称为“步长”,步长为2的卷积核计算过程如下
池化(Pooling)
使用局部统计特征,如均值或最大值,解决特征过多的问题
2.2 卷积神经网络主题构成
卷积层:k个滤波器
下采样层:使用最大池化或者平均池化
全连接层:一般接在网络的最后,将学习到的分布式特征进行总结,以做分类。
2.3 训练过程
1.对神经网络进行初始化,定义好网络结构,设定好激活函数,对卷积层的卷积核W 、偏置b 进行随机初试化,对全连接层的权重矩阵W 和偏置b 进行随机初始化。设置好训练的最大迭代次数,每个训练batch的大小,学习率η。
2.从训练数据中取出一个batch的数据,然后从该batch数据中取出一个数据,包括输入x以及对应的正确标注y。
3.将输入x送入神经网络的输入端
4.根据神经网络的输出和标注值y计算神经网络的损失函数Loss。
5.根据Loss进行反向传播得到每一层的梯度。
6.将求得的导数加到该batch数据求得的导数之和上(初始化为0),跳转到步骤3,直到该batch数据都训练完毕。
6.利用优化器根据得到的梯度对参数进行更新。
7.跳转到步骤2,直到达到指定的迭代次数
2.4 LeNet-5网络
C1层:
- 6个Feature map构成
- 每个神经元对输入进行5*5卷积
- 每个神经元对应 5*5+1 个参数,共6个feature map, 28*28 个神经元,因此共有 (5*5+1)*6*(28*28)=122,304 连接
S2层:下采样层
C3层:进行5*5卷积,得到的特征图为10*10*16
S4层:下采样层
C5层:
- 120个神经元
- 每个神经元同样对输入进行5*5卷积,与S4全连接
- 总连接数(5*5*16+1)*120=48120
F6层:
- 84个神经元
- 与C5全连接
- 总连接数(120+1)*84=10164
输出层:
- 由欧式径向基函数单元构成
- 每类一个单元
- 输出RBF单元计算输入向量和参数向量之间的欧式距离
2.4 代码实现
import torch
from torch import nn
from d2l import torch as d2l
class Reshape(torch.nn.Module):
def forward(self, x):
return x.view(-1, 1, 28, 28)
net = torch.nn.Sequential(
Reshape(),
nn.Conv2d(1, 6, kernel_size=5, padding=2), nn.Sigmoid(),
nn.AvgPool2d(kernel_size=2, stride=2),
nn.Conv2d(6, 16, kernel_size=5), nn.Sigmoid(),
nn.AvgPool2d(kernel_size=2, stride=2),
nn.Flatten(),
nn.Linear(16 * 5 * 5, 120), nn.Sigmoid(),
nn.Linear(120, 84), nn.Sigmoid(),
nn.Linear(84, 10))
nn. Sequential():该函数可以将不同的模块组合成一个新的模块,将各模块按顺序输入即可。
nn.AvgPool2d(kernel_size, stride)或MaxPool2d:平均池化或最大池化层,输入参数分别为池化窗口大小和步长。二参数同时可以为整数,否则为元组类似的还有平均池化nn.AvgPool2d(kernel_size,stride)。
nn. Sigmoid():该函数为上一层的输出添加sigmoid激活函数类似的还有nn.ReLU(), nn.Tanh()等。
nn. Conv2d(in_channels,out_channels,kernel_size):卷积层,其三个参数按顺序代表输入通道数、输出通道数、卷积核大小若卷积核形状为正方形,则卷积核大小可以为int否则,卷积核大小必须为元组(tuple)。如: nn.Conv2d(1, 6, (5, 4))即代表卷积核大小为5× 4。
stride参数:可以规定卷积的步长,与卷积核大小类似,若各方向步长相同则可以为整数,否则应为元组。
padding参数:在图像的周围补充0的个数,常常用于控制卷积前后图像的尺寸大小