一、为什么需要深度学习?
全连接网络的问题
-
链接权过多,算的慢,难收敛,同时可能进入局部极小值,也容易产生_过拟合_问题
e.g.输入为1000×1000图像 ,隐含层有 1M 个节点,则输入->隐含层间有1×1012数量级的参数- 解决算的慢的问题:减少权值连接,每一个节点只连接到上一层的少数神经元,即局部连接网络。
- 解决难以收敛的问题:权值过多容易产生过拟合问题,如何消除?
联想到人类解决问题的思路->信息分层处理,每一层在上一层提取特征的基础上进行再处理,抽象出更高级别的特征。
- 解决算的慢的问题:减少权值连接,每一个节点只连接到上一层的少数神经元,即局部连接网络。
-
深度学习相比全连接网络的优势主要体现在以下几个方面:
- 更好的特征表示学习: 深度学习模型通过多层次的非线性变换,可以自动地从数据中学习到更高级、更抽象的特征表示。相比之下,全连接网络仅仅通过简单的线性变换,其特征表示能力相对较弱。
- 参数共享和稀疏性: 深度学习模型中的卷积神经网络 (CNN) 和循环神经网络 (RNN) 等结构具有参数共享的特性,这使得模型的参数量大大减少,同时提高了模型的泛化能力和训练效率。相比之下,全连接网络中的参数量随着网络层数的增加呈指数级增长,容易出现过拟合问题。
- 处理高维数据的能力: 深度学习模型特别适合处理高维数据,如图像、文本、语音等。卷积神经网络 (CNN) 可以有效地捕捉图像中的空间局部性特征,而循环神经网络 (RNN) 则适用于处理序列数据。
- 适应性和泛化能力: 深度学习模型的多层次结构使其能够学习到复杂的数据模式和特征,从而提高了模型的泛化能力,使其在未见过的数据上表现更好。相比之下,全连接网络由于单一的层次结构限制,很难学习到高级别的抽象特征,因此泛化能力可能较弱。
- 总之,深度学习相比全连接网络具有更强大的特征表示学习能力、更高的泛化能力、更好的处理高维数据的能力等优势,使其成为了当前各种复杂任务的首选模型。
深度学习平台简介
PyTorch简介
是什么?
- PyTorch是一个 Python 的深度学习库 。它最初由Facebook人工智能研究小组开发而优步的Pyro软件则用于概率编程。
- 最初PyTorch由Hugh Perkins开发作为基于Torch框架的LusJIT的Python 包装器。PyTorch在Python中重新设计和实现Torch同时为后端代码共享相同的核心C库。
- 除了Facebook之外Twitter、GMU和Salesforce等机构都采用了PyTorch。
- 到目前据统计已有80%的研究采用PyTorch包括Google。
- PyTorch和TensorFlow2的对比
- PyTorch和TensorFlow2的对比
学习资源
- PyTorch 深度学习: 60分钟快速入门
- PyTorch官方教程中文版
- 《动手学深度学习》第二版 电子书
- Deep learning with pytorch: PyTorch Documentation
基本概念
- 张量(Tensor)
是一个物理量,对高维(维数 ≥ 2)的物理量进行“量纲分析”的一种工具。
简单的可以理解为:一维数组称为矢量,二维数组为二阶张量,三维数组称为三阶张量… - 计算图
用 “ 结点 ”(nodes)和 “ 线 ”(edges)的有向图来描述数学计算的图像。“ 节点 ” 一般用来表示施加的数学操作,但也可以表示数据输入的起点/输出的终点,或者是读取/写入持久变量的终点。“ 线 ” 表示 “ 节点 ” 之间的输入/输出关系。这些数据 “ 线 ” 可以输运 “ size可动态调整 ” 的多维数据数组,即 “ 张量 ”(tensor)
- 注意
- 使用 tensor 表示数据
- 使用Dataset、DataLoader读取样本数据和标签
- 使用变量(Variable)存储神经网络权值等参数
- 使用计算图(Computational Graph)来表示计算任务
- 在代码运行过程中同时执行计算图
- 简单示例
构建简单的计算图,每个节点将零个或多个tensor作为输入,产生一个tensor作为输出。PyTorch中,所见即为所得,tensor的使用和numpy中的多维数组类似:
import torch
x_const = torch.tensor([1.0, 2.0, 3.0])
y = torch.tensor([3.0, 4.0, 5.0])
output = x_const + y
print(x_const, '\n', y, '\n', output)
输出:
相应计算图:
二、卷积神经网络基础
1.进化史
2.基本概念
特征提取
- 卷积
卷积在深度学习中扮演着非常重要的角色,卷积操作是一种有效提取局部特征的方法,它在图像处理、自然语言处理等领域都有广泛的应用。在深度学习中,卷积操作通常用于构建卷积神经网络(Convolutional Neural Networks,CNNs)。CNNs通过在输入数据上滑动一个或多个卷积核(也称为过滤器或滤波器),在每个位置上执行卷积操作来提取特征。卷积核是一种小的、可学习的权重矩阵,它可以有效地捕捉输入数据中的局部模式。
注:图像卷积时,根据定义,需要首先把卷积核上下左右转置(该操作可以增加模型的灵活性,提高特征提取的效果,并帮助模型更好地适应不同方向上的特征)。此处卷积核(黄色)是对称的,所以忽视。 - 填充(Padding)
在矩阵的边界上填充一些值,以增加矩阵的大小,通常用0或者复制边界像素来进行填充。
- 步长(Stride)
指卷积核在输入数据上滑动的距离。具体来说,步长定义了在每个方向上卷积核移动的间隔大小。在深度学习中,步长通常是一个超参数,需要在建立卷积神经网络(CNN)时进行指定,可以是任意正整数。如图步长为2:
- 多通道卷积
彩色图像一般包括RGB三个通道(channel),输入数据的维度有三个(长,宽,通道数),而滤波器(filter)的通道数需要保证和输入的通道数一致,此时的卷积过程就是多通道的。
图片转载自:https://blog.csdn.net/wzx479/article/details/102757275
下采样/池化 Pooling
思想:使用局部统计特征,如均值或最大值,解决特征过多的问题,缩小了网络的规模。
基本结构
构成部分:多个卷积层 + 下采样层(池化)+ 全连接层(根据需求添加)
3.学习算法
前向传播
误差反向传播
- 经典BP算法
- 卷积NN的BP算法
- 卷积层 + 卷积层
- 卷积层 + 全连接层
- 卷积层 + 卷积层
三、LeNet-5网络
1.网络介绍
Gradient-based learning applied to document recognition
2.网络结构详解
C1层(卷积层)
- 由6个Feature Map构成
- 每个神经元对输入进行5*5卷积
- 每个神经元对应5×5+1个参数,共6个Feature Map,28×28个神经元,共有(5 × 5 + 1) × 6 × (28 × 28) = 122304个连接
S2层(Pooling层)
C3层(卷积层)
S4层
与S2层工作原理相同
C5层
- 120个神经元
- 每个神经元同样对输入进行5×5卷积,与S4全连接
- 总连接数(5 × 5 × 16 + 1) × 120 = 48120
F6层
- 84个神经元
- 与C5全连接
- 总连接数(120 + 1) × 84 = 10164
输出层
- 由欧式径向基函数单元构成
- 每类一个单元
- 输出RBF单元计算输入向量和参数向量之间的欧式距离
网络结构图
规律:随着网络深入,宽、高衰减,通道数增加
网络说明
与现在网络的区别
- 卷积时不进行填充(Padding)
- 池化层选用平均池化,而非最大池化
- 选用Sigmoid或tanh,而非ReLU作为非线性环节激活函数
- 层数较浅,参数数量小(约为6万)
3.网络结构可视化
3D Visualization of a Convolutional Nerual Network
4.LeNet5代码实现
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.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的个数,常常用于控制卷积前后图像的尺寸大小。
四、基本卷积神经网络
1.AlexNet
网络提出
Imagenet classification with deep convolutional neural networks
网络结构
网络说明
- 网络一共有8层可学习层——5层卷积和3层全连接
- 改进(相比于LeNet)
- 池化层均采用最大池化
- 选用ReLU作为非线性环节激活函数
- 网络规模扩大,参数数量接近6000万
- 出现 “多个卷积层 + 单个池化层” 的结构
- 普遍规律
随着网络深入,宽、高衰减,通道数增加
注:左侧数字表示连接数,右侧表示参数
改进
- 输入样本
- 从原始图像(256, 256)中,随机的crop出一些图像(224, 224)。
- 水平翻转图像。
- 给图像增加一些随机的光照。
crop:平移变换;flip:反射变换;color jittering:光照、彩色变换
- 激活函数
采用ReLU替代Tanh、Sigmoid,用于卷积层与全连接层之后
- Dropout暂退
在每个全连接层后面使用一个Dropout层,以概率 p 随机关闭激活函数
- 双GPU策略
AlexNet使用两块GTX580显卡进行训练,两块显卡只需要在特定的层进行通信
详细解释
以第一层conv1为例
- relu1:max(0, x),作为激活函数紧接在卷积层后
- norm1:局部响应归一化LRN
作用不大,在CNN中不常用 - pool1:采用max pooling
pooling核大小为3×3,stride为2,代表2倍的降采样。此处的pool1层是有交叠的池化层,即pooling核在相邻位置有重叠
可视化
- 第一层卷积核可视化
在ILSVRC-2010上,top-1错误率为37.5%,top-5错误率为17.0%,下图是对96个11113的卷积核进行可视化
2.VGG-16
Very deep convolutional networks for large-scale image recognition
…