卷积神经网络入门
创始人
2024-03-29 07:51:43
0

前言

本文是之前和同事一些分享的笔记,还在整理中,先贴一个版本,后续不断更正完善。

基本内容

ILSVRC:ImageNet Large Scale Visual Recognition Challenge 国际图像分类领域竞赛
LeNet(深度:5,又名LeNet-5)

LeNet的网络结构,麻雀虽小,但五脏俱全,卷积层、pooling层、全连接层,这些都是现代CNN网络的基本组件
输入尺寸:3232
卷积层:3个
降采样层:2个
全连接层:1个
输出:10个类别(数字0-9的概率)
Input (32
32)
输入图像Size为3232。这要比mnist数据库中最大的字母(2828)还大。这样做的目的是希望潜在的明显特征,如笔画断续、角点能够出现在最高层特征监测子感受野的中心。
C1, C3, C5 (卷积层)
卷积核在二维平面上平移,并且卷积核的每个元素与被卷积图像对应位置相乘,再求和。通过卷积核的不断移动,我们就有了一个新的图像,这个图像完全由卷积核在各个位置时的乘积求和的结果组成。
二维卷积在图像中的效果就是: 对图像的每个像素的邻域(邻域大小就是核的大小)加权求和得到该像素点的输出值。具体做法如下:

卷积运算一个重要的特点就是: 通过卷积运算,可以使原信号特征增强,并且降低噪音。
不同卷积核得到的不同的feature map

以C1层进行说明:C1层是一个卷积层,有6个卷积核(提取6种局部特征),核大小为55,能够输出6个特征图Feature Map,大小为2828。C1有156个可训练参数(每个滤波器55=25个unit参数和一个bias参数,一共6个滤波器,共(55+1)6=156个参数),共156 (2828)=122,304个连接。
S2, S4 (pooling层)
S2, S4是下采样层(池化层),是为了降低网络训练参数及模型的过拟合程度。池化/采样的方式通常有以下两种:
Max-Pooling: 选择Pooling窗口中的最大值作为采样值;
Mean-Pooling: 将Pooling窗口中的所有值相加取平均,以平均值作为采样值;
S2层是6个14
14的feature map,map中的每一个单元于上一层的 2*2 领域相连接,所以,S2层的输出为原来的1/4。
F6 (全连接层)
F6是全连接层,共有84个神经元,这84个神经元与C5层进行全连接,所以需要训练的参数是:(120+1)*84=10164. 如同经典神经网络,F6层计算输入向量和权重向量之间的点积,再加上一个偏置。
Output (输出层)
输出层有84个输入,给定一个输式,损失函数应能与模式的期望分类足够接近。

AlexNet, 8层 (ILSVRC 2012,top5 error rate15.3%,第二名为26.2%,深度:8)

Alexnet总共包括8层,其中前5层convolutional,后面3层是full-connected,每一层的构成:
第一层卷积层 输入图像为2242243的图像,使用了96个kernels(96,11,11,3),以4个pixel为一个单位来右移或者下移,能够产生5555个卷积后的矩形框值,然后进行Local Response Normalized(LRN)。Alexnet里面采样了两个GPU,所以从图上面看第一层卷积层厚度有两部分,池化pool_size=(3,3),滑动步长为2个pixels,得到96个2727个feature。
第二层卷积层使用256个(同样,分布在两个GPU上,每个128kernels(5548)),能够产生2727个卷积后的矩阵框,做Local Response Normalized处理,然后pooled,池化以33矩形框,2个pixel为步长,得到256个1313个features。
第三层使用384个kernels(3
3384,pad_size=(1,1),得到3841515,kernel_size为(3,3),以1个pixel为步长,得到3841313)
第四层使用384个kernels(pad_size(1,1),得到384
1515,核大小为(3,3)步长为1个pixel,得到3841313)
第五层使用256个kernels(pad_size(1,1),得到384
1515,kernel_size(3,3),得到2561313,pool_size(3,3)步长2个pixels,得到2566*6)
全连接层: 前两层分别有4096个神经元,最后输出softmax为1000个(ImageNet)

VGG (ILSVRC 2014第二名,深度:11到19)

①可以看到共有5个池化层,所以可以把卷积部分视为5个部分,和AlexNet一样,只不过每一个部分他用了不止一层卷积层。
②所有卷积层都是同样大小的filter!尺寸3x3,卷积步长Stirde = 1,填充Padding = 1!
filter相同的原因:
A、3x3是最小的能够捕获左、右、上、下和中心概念的尺寸;
B、两个3x3的卷积层连在一起可视为5x5的filter,三个连在一起可视为一个7x7的
C、多个3x3的卷积层比一个大尺寸的filter卷积层有更多的非线性,使得判决函数更加具有判断性。
D、多个3x3的卷积层笔一个大尺寸的filter具有更少的参数。

③卷积层变多了。结构E有16层卷积层,加上全连接层共19层。
GoogLeNet, 22层 (ILSVRC 2014,第一名,深度:22)

ResNet(微软,ILSVRC 2015,深度:152)
ResNet引入了残差网络结构(residual network),通过残差网络,可以把网络层弄的很深,目前最多已达到了1000多层,最终的网络分类的效果也是非常好。

ZFNet(ILSVRC 2013)
通过使用可视化技术揭示了神经网络各层到底在干什么,起到了什么作用。
意义:
1、使用一个多层的反卷积网络来可视化训练过程中特征的演化及发现潜在的问题;
2、同时根据遮挡图像局部对分类结果的影响来探讨对分类任务而言到底那部分输入信息更重要。
结论:
A、发现学习到的特征远不是无法解释的,而是特征间存在层次性,层数越深,特征不变性越强,类别的判别能力越强;
B、遮挡实验表明分类时模型和局部块的特征高度相关;
C、模型的深度很关键;
D、预训练模型可以在其他数据集上fine-tuning得到很好的结果。
反卷积可视化,过程包括反池化操作、relu和反卷积过程。
反池化:
严格意义上的反池化是无法实现的。近似的实现方式,在训练过程中记录每一个池化操作的一个z*z的区域内输入的最大值的位置,这样在反池化的时候,就将最大值返回到其应该在的位置,其他位置的值补0。
relu:
卷积神经网络使用relu非线性函数来保证输出的feature map总是为正数。在反卷积的时候,也需要保证每一层的feature map都是正值,所以这里还是使用relu作为非线性激活函数。
反卷积过程:
卷积:

反卷积:

FCN

ST-Net
能自适应地将数据进行空间变换和对齐(包括平移、缩放、旋转以及其它几何变换等)
CNN+RNN

LSTM
Long Short Term 网络,是一种 RNN 特殊的类型,可以学习长期依赖信息

Inception V1到V4
背景:
卷积神经网络层次过深,会导致:
1.参数太多,容易过拟合,若训练数据集有限;
2.网络越大计算复杂度越大,难以应用;
3.网络越深,梯度越往后穿越容易消失(梯度弥散),难以优化模型
  解决上述问题的方法希望在增加网络深度和宽度的同时减少参数,Inception就是在这样的情况下应运而生

R-CNN
RCNN算法分为4个步骤
一张图像生成1K~2K个候选区域
对每个候选区域,使用深度网络提取特征
特征送入每一类的SVM 分类器,判别是否属于该类
使用回归器精细修正候选框位置

NIN
1、1×1卷积的使用
在较大程度上减少了参数个数,却能够得到一个较好的结果:
假设上一层的输出为100x100x128,经过具有256个输出的5x5卷积层之后(stride=1,pad=2),输出数据为100x100x256。其中,卷积层的参数为128x5x5x256。假如上一层输出先经过具有32个输出的1x1卷积层,再经过具有256个输出的5x5卷积层,那么最终的输出数据仍为为100x100x256,但卷积参数量已经减少为128x1x1x32 + 32x5x5x256,大约减少了4倍。
2、CNN网络中不使用FC层
全连接层参数多且易过拟合。移除全连接层,使用Average Pooling层。
ResNet

为什么不用BP神经网络去做呢?
参数数量太多 考虑一个输入10001000像素的图片(一百万像素,现在已经不能算大图了),输入层有10001000=100万节点。假设第一个隐藏层有100个节点(这个数量并不多),那么仅这一层就有(1000*1000+1)*100=1亿参数,这实在是太多了!我们看到图像只扩大一点,参数数量就会多很多,因此它的扩展性很差。
应对之道:局部连接,权值共享
没有利用像素之间的位置信息 对于图像识别任务来说,每个像素和其周围像素的联系是比较紧密的,和离得很远的像素的联系可能就很小了。如果一个神经元和上一层所有神经元相连,那么就相当于对于一个像素来说,把图像的所有像素都等同看待,这不符合前面的假设。当我们完成每个连接权重的学习之后,最终可能会发现,有大量的权重,它们的值都是很小的(也就是这些连接其实无关紧要)。努力学习大量并不重要的权重,这样的学习必将是非常低效的。
应对之道:卷积核,无需手动选取特征
网络层数限制 我们知道网络层数越多其表达能力越强,但是通过梯度下降方法训练深度全连接神经网络很困难,因为全连接神经网络的梯度很难传递超过3层。因此,我们不可能得到一个很深的全连接神经网络,也就限制了它的能力。
应对之道:池化,减少每层的样本数(相当于图像压缩),进一步减少参数数量,同时还可以提升模型的鲁棒性
CNN采用的激励函数为什么一般为ReLU(The Rectified Linear Unit/修正线性单元)
它的特点是收敛快,求梯度简单,但较脆弱,图像如下:

激励层的实践经验:   ① 尽量不要使用sigmoid,一是速度问题,二是sigmoid 的梯度消失问题   ② 首先试RELU,因为快,但要小心点   ③ 如果2失效,请用Leaky ReLU或者Maxout   ④ 某些情况下tanh倒是有不错的结果,但是很少人使用
ReLU vs Leaky ReLU

Maxout类似,为活性化函数
CNN的解释性
可视化方向
1、如ZFNet
2、谷歌大脑发布神经网络的「核磁共振」,并公开相关代码

相关内容

热门资讯

网络技术展开型介绍(超详细) ♥️作者:小刘在这里 ♥️每天分享云计算网络运维课堂笔记,疫情之下&#x...
Git__本地分支与远程分支的... 文章目录前言1. 用git checkout命令关联2.用 git push命令关联3.用 git ...
LocalDateTime 的... 与 Date 相比 LocalDateTime 线程安全,因为所有字段都用了 fina...
C++ Primer笔记——l... 目录 一.lambda介绍 (一).总体介绍 (二...
Mac上安装和测试Kafka 1. 安装 默认会把zookeeper一起安装好 brew install kafka 安装日志&#...
@计算矩阵的特征值与特征向量 @计算矩阵的特征值与特征向量 文章目录 我们经常遇到一个问题就是如何计算一个矩阵的特征值和特征向...
Shell脚本编写 1 入门 1.1 脚本格式 脚本以#!/bin/bash开头(指定bash解析器&#x...
C/C++KTV点歌系统 C/C++KTV点歌系统 KTV点歌系统(版本1) 1 ...
重学c/c++之预处理 预定义符号 这些定义符号都是语言内置的 printf("%s\n",__FILE__);//绝对路...
C/C++数据结构课程设计[长... C/C++数据结构课程设计[长春理工大学计算机科学技术学院2022秋季学期] 长春理...