4. 卷积神经网络CNN
Posted 說詤榢
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了4. 卷积神经网络CNN相关的知识,希望对你有一定的参考价值。
文章目录
4. 卷积神经网络CNN
文章链接
https://gitee.com/fakerlove/deep-learning
以算法区分深度学习应用,算法类别可分成三大类:
- 常用于影像数据进行分析处理的卷积神经网络(简称CNN)
- 文本分析或自然语言处理的递归神经网络(简称RNN)
- 常用于数据生成或非监督式学习应用的生成对抗网络(简称GAN)
资料参考
https://www.zybuluo.com/hanbingtao/note/485480
参考资料2
https://www.cnblogs.com/wj-1314/p/9754072.html
4.1 概念
4.1.1 概念
参考资料
https://blog.csdn.net/qq_25762497/article/details/51052861
卷积神经网络是近年发展起来的,并引起广泛重视的一种高效识别方法,20世纪60年代,Hubel和Wiesel在研究猫脑皮层中用于局部敏感和方向选择的神经元时发现其独特的网络结构可以有效地降低反馈神经网络的复杂性,继而提出了卷积神经网络(Convolutional Neural Networks-简称CNN)。
现在,CNN已经成为众多科学领域的研究热点之一,特别是在模式分类领域,由于该网络避免了对图像的复杂前期预处理,可以直接输入原始图像,因而得到了更为广泛的应用。 K.Fukushima在1980年提出的新识别机是卷积神经网络的第一个实现网络。随后,更多的科研工作者对该网络进行了改进。其中,具有代表性的研究成果是Alexander和Taylor提出的“改进认知机”,该方法综合了各种改进方法的优点并避免了耗时的误差反向传播。
所以哪里不同呢?卷积神经网络默认输入是图像,可以让我们把特定的性质编码入网络结构,使是我们的前馈函数更加有效率,并减少了大量参数。
具有三维体积的神经元(3D volumes of neurons)
卷积神经网络利用输入是图片的特点,把神经元设计成三个维度 : width, height, depth(注意这个depth不是神经网络的深度,而是用来描述神经元的) 。比如输入的图片大小是 32 × 32 × 3 (rgb),那么输入神经元就也具有 32×32×3 的维度。
传统神经网络
卷积神经网络
一个卷积神经网络由很多层组成,它们的输入是三维的,输出也是三维的,有的层有参数,有的层不需要参数。
4.1.2 用途
1、图像分类 (Classification)
顾名思义就是将图像进行类别筛选,通过深度学习方法识别图片属于哪种分类类别,其主要重点在于一张图像只包含一种分类类别,即使该影像内容可能有多个目标,所以单纯图像分类的应用并不普遍。不过由于单一目标识别对深度学习算法来说是正确率最高的,所以实际上很多应用会先通过目标检测方法找到该目标,再缩小撷取影像范围进行图像分类。所以只要是目标检测可应用的范围,通常也会使用图像分类方法。
图像分类也是众多用来测试算法基准的方法之一,常使用由ImageNet举办的大规模视觉识别挑战赛(ILSVRC)中提供的公开图像数据进行算法测试。图像分类属于CNN的基础,其相关算法也是最易于理解,故初学者应该都先以图像分类做为跨入深度学习分析的起步。使用图像分类进行识别,通常输入为一张图像,而输出为一个文字类别。
2、目标检测 (Object Detection)
一张图像内可有一或多个目标物,目标物也可以是属于不同类别。算法主要能达到两种目的:找到目标坐标及识别目标类别。简单来说,就是除了需要知道目标是什么,还需要知道它在哪个位置。
目标检测应用非常普遍,包含文章开头提到的人脸识别相关技术结合应用,或是制造业方面的瑕疵检测,甚至医院用于X光、超音波进行特定身体部位的病况检测等。目标识别的基础可想象为在图像分类上增加标示位置的功能,故学习上也不离图像分类的基础。不过目标检测所标示的坐标通常为矩形或方形,仅知道目标所在位置,并无法针对目标的边缘进行描绘,所以常用见的应用通常会以「知道目标位置即可」作为目标。
最常见的算法为YOLO及R-CNN。其中YOLO因算法特性具有较快的识别速度,目前已来到v3版本。R-CNN针对目标位置搜寻及辨识算法和YOLO稍有不同,虽然速度稍较YOLO慢,但正确率稍高于YOLO。使用目标检测进行识别,通常输入为一张图像,而输出为一个或数个文字类别和一组或多组坐标。
3、语义分割 (Semantic Segmentation)
算法会针对一张图像中的每个像素进行识别,也就是说不同于目标检测,语义分割可以正确区别各目标的边界像素,简单来说,语义分割就是像素级别的图像分类,针对每个像素进行分类。当然这类应用的模型就会需要较强大的GPU和花较多时间进行训练。
常见应用类似目标检测,但会使用在对于图像识别有较高精细度,如需要描绘出目标边界的应用。例如制造业上的瑕疵检测,针对不规则形状的大小瑕疵,都可以正确描绘。医学上常用于分辨病理切片上的病变细胞,或是透过MRI、X光或超音波描绘出病变的区块及类别。算法如U-Net或是Mask R-CNN都是常见的实作方法。使用语义分割进行识别,通常输入为一张图像,而输出也为一张等大小的图像,但图像中会以不同色调描绘不同类别的像素。
4.2 结构介绍
资料参考
https://blog.csdn.net/qq_25762497/article/details/51052861
4.2.1 结构简介
- 卷积层(Convolutional layer),卷积神经网路中每层卷积层由若干卷积单元组成,每个卷积单元的参数都是通过反向传播算法优化得到的。卷积运算的目的是提取输入的不同特征,第一层卷积层可能只能提取一些低级的特征如边缘、线条和角等层级,更多层的网络能从低级特征中迭代提取更复杂的特征。
- 线性整流层(Rectified Linear Units layer, ReLU layer),这一层神经的活性化函数(Activation function)使用线性整流(Rectified Linear Units, ReLU)。
- 池化层(Pooling layer),通常在卷积层之后会得到维度很大的特征,将特征切成几个区域,取其最大值或平均值,得到新的、维度较小的特征。
- 全连接层( Fully-Connected layer), 把所有局部特征结合变成全局特征,用来计算最后每一类的得分。
4.2.2 卷积层
1) 基本概念
问题的出现???
普通神经网络把输入层和隐含层进行“全连接(Full Connected)“的设计。从计算的角度来讲,相对较小的图像从整幅图像中计算特征是可行的。
但是,如果是更大的图像(如$96\\times 96 $的图像),要通过这种全联通网络的这种方法来学习整幅图像上的特征,从计算角度而言,将变得非常耗时。
你需要设计 1 0 4 ( = 10000 ) 10^4(=10000) 104(=10000)个输入单元,假设你要学习 100 个特征,那么就有 1 0 6 10^6 106个参数需要去学习。与$ 28\\times 28 $的小块图像相比较, $96\\times 96 $的图像使用前向输送或者后向传导的计算方式,计算过程也会慢 100 100 100倍。
-
输入特征图
卷积层的输入数据
-
输出特征图
卷积层输出数据
-
感受野
每个隐含单元连接的输入区域大小叫r神经元的感受野(receptive field)。
-
过滤器
由于卷积层的神经元也是三维的,所以也具有深度。卷积层的参数包含一系列过滤器(filter),每个过滤器训练一个深度,有几个过滤器输出单元就具有多少深度。
卷积层解决这类问题的一种简单方法是对隐含单元和输入单元间的连接加以限制:每个隐含单元仅仅只能连接输入单元的一部分。
例如,每个隐含单元仅仅连接输入图像的一小片相邻区域。(对于不同于图像输入的输入形式,也会有一些特别的连接到单隐含层的输入信号“连接区域”选择方式。如音频作为一种信号输入方式,一个隐含单元所需要连接的输入单元的子集,可能仅仅是一段音频输入所对应的某个时间段上的信号。)
具体如下图所示,样例输入单元大小是32×32×3, 输出单元的深度是5, 对于输出单元不同深度的同一位置,与输入图片连接的区域是相同的,但是参数(过滤器)不同。
虽然每个输出单元只是连接输入的一部分,但是值的计算方法是没有变的,都是权重和输入的点积,然后加上偏置,这点与普通神经网络是一样的,如下图所示:
2) 前期准备
一个输出单元的大小有以下三个量控制:depth, stride 和 zero-padding。
- 深度(depth) : 顾名思义,它控制输出单元的深度,也就是filter的个数,连接同一块区域的神经元个数。又名:depth column
- 步幅(stride):它控制在同一深度的相邻两个隐含单元,与他们相连接的输入区域的距离。如果步幅很小(比如 stride = 1)的话,相邻隐含单元的输入区域的重叠部分会很多; 步幅很大则重叠区域变少。
- 补零(zero-padding) : 我们可以通过在输入单元周围补零来改变输入单元整体大小,从而控制输出单元的空间大小。
我们先定义几个符号:
- W W W : 输入单元的大小(宽或高)
- F F F : 感受野(receptive field)
- S S S : 步幅(stride)
- P P P : 补零(zero-padding)的数量
- K K K : 深度,输出单元的深度
则可以用以下公式计算一个维度(宽或高)内一个输出单元里可以有几个隐藏单元:
W − F + 2 P S + 1 \\fracW-F+2PS+1 SW−F+2P+1
如果计算结果不是一个整数,则说明现有参数不能正好适合输入,步幅(stride)设置的不合适,或者需要补零,证明略,下面用一个例子来说明一下。
例子
这是一个一维的例子,左边模型输入单元有5个,即 W = 5 W=5 W=5,
边界各补了一个零,即 P = 1 P=1 P=1,
步幅是1, 即 S = 1 S=1 S=1,感受野是3,
因为每个输出隐藏单元连接3个输入单元,即 F = 3 F=3 F=3,
根据上面公式可以计算出输出隐藏单元的个数是 5 − 3 + 2 1 + 1 = 5 \\frac5-3+21+1=5 15−3+2+1=5:与图示吻合。
右边那个模型是把步幅变为2,其余不变,可以算出输出大小为: 5 − 3 + 2 2 + 1 \\frac5-3+22+1 25−3+2+1,也与图示吻合。
若把步幅改为3,则公式不能整除,说明步幅为3不能恰好吻合输入单元大小。
3) 参数共享
应用参数共享可以大量减少参数数量,参数共享基于一个假设:如果图像中的一点 ( x 1 , y 1 ) (x_1,y_1) (x1,y1)包含的特征很重要,那么它应该和图像中的另一点 ( x 2 , y 2 ) (x_2,y_2) (x2,y2)一样重要。
换种说法,我们把同一深度的平面叫做深度切片(depth slice)((e.g. a volume of size [55x55x96] has 96 depth slices, each of size [55x55])),那么同一个切片应该共享同一组权重和偏置。
我们仍然可以使用梯度下降的方法来学习这些权值,只需要对原始算法做一些小的改动, 这里共享权值的梯度是所有共享参数的梯度的总和。
我们不禁会问为什么要权重共享呢?
一方面,重复单元能够对特征进行识别,而不考虑它在可视域中的位置。
另一方面,权值共享使得我们能更有效的进行特征抽取,因为它极大的减少了需要学习的自由变量的个数。通过控制模型的规模,卷积网络对视觉问题可以具有很好的泛化能力。
4) 卷积运算
如果应用参数共享的话,实际上每一层计算的操作就是输入层和权重的卷积!这也就是卷积神经网络名字的由来。
a) 二维卷积运算
先抛开卷积,这个概念不管。为简便起见,考虑一个大小为5×5的图像,和一个3×3的卷积核。
这里的卷积核共有9个参数,就记为 Θ = [ θ i j ] 3 × 3 Θ=[\\theta_ij]_3\\times 3 Θ=[θij]3×3吧。
这种情况下,卷积核实际上有9个神经元,他们的输出又组成一个3×3的矩阵,称为特征图。
第一个神经元连接到图像的第一个3×3的局部,
第二个神经元则连接到第二个局部(注意,有重叠!就跟你的目光扫视时也是连续扫视一样)。步幅为1,每次运算,矩阵移动一个步幅
具体如下图所示。
计算过程为各个位置的卷积核的元素和输入元素的对应元素相乘,在求和
灰色方块的答案= 33 × 11 + 32 × 12 + 31 × 13 + 23 × 21 + 22 × 22 + 21 × 23 + 13 × 31 + 12 × 32 + 11 × 33 33\\times 11+32\\times 12+31\\times 13+23\\times 21+22\\times 22+21\\times 23+13\\times 31+12\\times 32+11\\times 33 33×11+32×12+31×13+23×21+22×22+21×23+13×31+12×32+11×33
图的第一行是第一个神经元的输出,第二行是第二个神经元的输出。每个神经元的运算依旧是
f
(
x
)
=
a
c
t
(
∑
i
,
j
n
θ
(
n
−
j
)
(
n
−
i
)
x
i
j
+
b
)
f(x)=act(\\sum_i,j^n\\theta_(n-j)(n-i)x_ij+b)
f(x)=act(i,j∑nθ(n−j)(n−i)xij+b)
需要注意的是,平时我们在运算时,习惯使用
θ
i
j
x
i
j
\\theta_ijx_ij
θijxij,这种写法,但事实上,我们这里使用的是
θ
(
n
−
j
)
(
n
−
i
)
x
i
j
\\theta_(n-j)(n-i)x_ij
θ(n−j)(n−i)xij
现在我们回忆一下离散卷积运算。假设有二维离散函数
f
(
x
,
y
)
,
g
(
x
,
y
)
f(x,y),g(x,y)
f(x,y),g(x,y)那么它们的卷积定义为
f
(
m
,
n
)
∗
g
(
m
,
n
)
=
∑
u
∞
∑
v
∞
f
(
u
,
v
)
g
(
m
−
u
,
n
−
v
)
f(m,n)*g(m,n)=\\sum_u^\\infty \\sum_v^\\infty f(u,v)g(m-u,n-v)
f(m,n)∗g(m,n)=u∑∞v∑∞f(u,v)g(m−u,n−v)
现在发现了吧!上面例子中的9个神经元均完成输出后,实际上等价于图像和卷积核的卷积操作!
例子
输入:
4 × 4 4\\times 4 4×4的图片,
过滤器 3 × 3 3\\times 3 3×3,
步幅1
补零0
是如何算出来的???
15是下面算出来的
CNN 卷积神经网络 池化层Pooling 动手学深度学习v2 pytorch
深度学习:《PyTorch入门到项目实战》卷积神经网络:填充(padding)和步幅(stride)