1.深度学习平台介绍
一般而言,pytorch适合初学者上手深度学习,本课程中也是使用pytorch作为框架进行学习。
- PyTorch是一个Python的深度学习库。它最初由Facebook人工智能研 究小组开发,而优步的Pyro软件则用于概率编程。
- 最初,PyTorch由Hugh Perkins开发,作为基于Torch框架的LusJIT的 Python包装器。PyTorch在Python中重新设计和实现Torch,同时为 后端代码共享相同的核心C库。
- 除了Facebook之外,Twitter、GMU和Salesforce等机构都采用了 PyTorch。
- 到目前,据统计已有80%的研究采用PyTorch,包括Google
PyTorch基本概念:
2 卷积神经网络
2.1 卷积的基本概念
数字图像是一个二维的离散信号,对数字图像做卷积操作其实就是利用卷积核(卷积模板)在图像上滑动,将图像点上的像素灰度值与对应的卷积核上的数值相乘,然后将所有相乘后的值相加作为卷积核中间像素对应的图像上像素的灰度值,并最终滑动完所有图像的过程。在这样的一个过程中我们可以提取到图像的各个维度上的特征,比如使用Laplace卷积核可以获得图像的锐化后特征,而使用高斯卷积核可以获得图像模糊后的特征。
2.2.1 常用基本概念
- 全连接网络:链接权过多,难算难收敛,同时可能进入局部极小值,也容易产生过拟合问题
- 局部连接网络:顾名思义,只有一部分权值连接。部分输入和权值卷积
- 特征提取:
填充( Padding),也就是在矩阵的边界上填充一些值,以增加矩阵的大小,通常用0或者复制边界像素来进行填充。
步长(Stride):卷积核在原图上每一步移动的距离,如图步长为2
池化(Pooling):使用局部统计特征,如均值或最大值,解决特征过多的问题。
2.2.2 卷积神经网络构成
构成:由多个卷积层和下采样层构成,后面可连接全连接网络
卷积层:k个滤波器
下采样层:采用mean或max
后面:连着全连接网络
2.2 学习算法
3.卷积神经网络(LeNet-5网络)
3.1 网络结构
C1层:
6个Feature map构成
每个神经元对输入进行5*5卷积
每个神经元对应 5*5+1 个参数,共6个feature map, 28*28 个神经元,因此共有 (5*5+1)*6*(28*28)=122,304 连接
S2层:
C3层:
S4层:与S2层工作相同。
C5层:
120个神经元
每个神经元同样对输入进行5*5卷积,与S4全连接
总连接数(5*5*16+1)*120=48120
F6层:
84个神经元
与C5全连接
总连接数(120+1)*84=10164
输出层:
由欧式径向基函数单元构成
每类一个单元
输出RBF单元计算输入向量和参数向量之间的欧式距离
网络结构:
网络的特点:
1.卷积时不进行填充
2.池化层选用平均池化而不是最大池化
3.选用sigmoid或者tanh函数作为非线性环节激活函数
4.层数较浅,不会造成处理大量参数的情况
3.2 误差反向传播
3.2.1 经典BP算法
3.2.2 卷积NN的BP算法
下采样层:
局部误差从卷积层传到下采样层:
3.3 代码实现
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的个数,常常用于控制卷积前后图像的尺寸大小。
总结: