| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 人工智能 -> 学习笔记五:卷积神经网络(CNN) -> 正文阅读 |
|
[人工智能]学习笔记五:卷积神经网络(CNN) |
一、CNN模型原理1.1 图像
1.2 DNN图像分类的问题如果直接将图像根据各像素点的向量作为图片特征输入模型,例如LR、SVM、DNN等模型进行分类,理论上可行,但是面临以下问题:
1.3 卷积原理
卷积原理:
卷积的特点:
1.4 池化原理池化层的作用:缩减图像尺寸;克服图像图像平移、轻微旋转的影响;间接增大后续卷积的感受野;降低运算量和参数量
池化的特点:
池化技巧: 而在不同场景用的池化操作也不一样:
1.5 Flatten
1.6 卷积池化总结CNN使用不同卷积核提取图像中特定的形状特征,配合池化操作进一步缩减图像尺寸,稳定特征。对低级特征进行卷积计算,得到相对高级的特征。所以多层卷积-池化,层层堆叠可以提取复杂特征。
二、卷积池化计算一个常见的CNN例子如下图: 2.1. 初识卷积微积分中卷积的表达式为: S ( t ) = ∫ x ( t ? a ) w ( a ) d a S(t) = \int x(t-a)w(a) da S(t)=∫x(t?a)w(a)da 离散形式是: s ( t ) = ∑ a x ( t ? a ) w ( a ) s(t) = \sum\limits_ax(t-a)w(a) s(t)=a∑?x(t?a)w(a) 这个式子如果用矩阵表示可以为: s ( t ) = ( X ? W ) ( t ) s(t)=(X*W)(t) s(t)=(X?W)(t) 其中星号表示卷积。 如果是二维的卷积,则表示式为: s ( i , j ) = ( X ? W ) ( i , j ) = ∑ m ∑ n x ( i ? m , j ? n ) w ( m , n ) s(i,j)=(X*W)(i,j) = \sum\limits_m \sum\limits_n x(i-m,j-n) w(m,n) s(i,j)=(X?W)(i,j)=m∑?n∑?x(i?m,j?n)w(m,n) 在CNN中,虽然我们也是说卷积,但是我们的卷积公式和严格意义数学中的定义稍有不同,比如对于二维的卷积,定义为: s ( i , j ) = ( X ? W ) ( i , j ) = ∑ m ∑ n x ( i + m , j + n ) w ( m , n ) s(i,j)=(X*W)(i,j) = \sum\limits_m \sum\limits_n x(i+m,j+n) w(m,n) s(i,j)=(X?W)(i,j)=m∑?n∑?x(i+m,j+n)w(m,n) 这个式子虽然从数学上讲不是严格意义上的卷积,但是大牛们都这么叫了,那么我们也跟着这么叫了。后面讲的CNN的卷积都是指的上面的最后一个式子。 其中,我们叫W为我们的卷积核,而X则为我们的输入。如果X是一个二维输入的矩阵,而W也是一个二维的矩阵。但是如果X是多维张量,那么W也是一个多维的张量。 2.2. CNN中的卷积层图像卷积:对输入的图像的不同局部的矩阵和卷积核矩阵各个位置的元素相乘,然后相加得到。 举个例子如下:
2.2.1 二维卷积:举例如下:
假设图像大小为 N ? N N*N N?N矩阵,卷积核的尺寸为 K ? K K*K K?K矩阵,图像边缘像素填充:P,卷积的步伐为S,那么经过一层这样的卷积后出来的图像为:W=(N-K+2P)/S+1 2.2.2 三维卷积输入是多维的情况,在斯坦福大学的cs231n的课程上,有一个动态的例子
每个卷积核卷积的结果是一个3x3的矩阵,卷积的结果是一个3x3x2的张量。把上面的卷积过程用数学公式表达出来就是:
s
(
i
,
j
)
=
(
X
?
W
)
(
i
,
j
)
+
b
=
∑
k
=
1
n
_
i
n
(
X
k
?
W
k
)
(
i
,
j
)
+
b
s(i,j)=(X*W)(i,j) + b = \sum\limits_{k=1}^{n\_in}(X_k*W_k)(i,j) +b
s(i,j)=(X?W)(i,j)+b=k=1∑n_in?(Xk??Wk?)(i,j)+b
2.2.3 卷积计算公式??对图像的每个像素进行编号,用
x
i
,
j
x_{i,j}
xi,j?表示图像的第行第列元素;用
w
m
,
n
w_{m,n}
wm,n?表示卷积核filter第m行第n列权重,用
w
b
w_b
wb?表示filter的偏置项;用
a
i
,
j
a_{i,j}
ai,j?表示特征图Feature Map的第i行第j列元素;用
f
f
f表示激活函数(这个例子选择relu函数作为激活函数)。使用下列公式计算卷积: 2.3 CNN中的池化层
2x2最大池化,步幅为2时,池化操作如下: 2.4 CNN前向传播算法输入:1个图片样本,CNN模型的层数L和所有隐藏层的类型,对于卷积层,要定义卷积核的大小K,卷积核子矩阵的维度F,填充大小P,步幅S。对于池化层,要定义池化区域大小k和池化标准(MAX或Average),对于全连接层,要定义全连接层的激活函数(输出层除外)和各层的神经元个数。 输出:CNN模型的输出 a L a^L aL ??1) 根据输入层的填充大小P,填充原始图片的边缘,得到输入张量 a 1 a^1 a1。 ??2)初始化所有隐藏层的参数 W , b W,b W,b ??3)for l l l=2 to L ? 1 L-1 L?1(层数 l l l): ????a) 如果第
l
l
l层是卷积层,则输出为(*表示卷积,而不是矩阵乘法) ????c) 如果第 l l l层是全连接层,则输出为: a l = σ ( z l ) = σ ( W l a l ? 1 + b l ) a^l= \sigma(z^l) = \sigma(W^la^{l-1} +b^l) al=σ(zl)=σ(Wlal?1+bl) ??4)对于输出层第L层: a L = s o f t m a x ( z L ) = s o f t m a x ( W L a L ? 1 + b L ) a^L= softmax(z^L) = softmax(W^La^{L-1} +b^L) aL=softmax(zL)=softmax(WLaL?1+bL) 2.5 CNN反向传播算法三、深入卷积层3.1 1×1卷积1×1卷积作用是改变通道数,降低运算量和参数量。同时增加一次非线性变化,提升网络拟合能力。
所以可以先用1×1卷积改变通道数,再进行后续卷积操作,这个是Depth wise提出的。 3.2 VGGnet:小尺寸卷积效果好卷积的尺寸决定卷积的视野,越大则提取的特征越宏观。但是大尺寸卷积,参数量和运算量都很大,而多个小尺寸卷积可以达到相同的效果,且参数量更小。还可以多次进行激活操作,提高拟合能力。例如: 3.3 inception宽度卷积核和GoogLeNet实际CNN识别中,会遇到识别物体尺寸不一的情况。不同尺寸的物体需要不同尺寸的卷积核来提取特征。如果增加网络深度来处理,会造成:
为了使卷积层适应不同的物体尺寸,一般会在同一层网络中并列使用多种尺寸的卷积,以定位不同尺寸的物体。此时增加了网络宽度,而不会增加其深度。 2016年google的inception模型首先提出,结构如下:
多个inception堆叠就是GoogLeNet:
这样会有一个问题: 网络太深造成梯度消失,前面的层基本就没有什么信息了(梯度消失学不到)。所以中间层引入两个辅助分类器,并配以辅助损失函数。防止前层网络信息丢失。具体地:
GoogleNet知识点:
GoogleNet: 3.4 Depth wise和Pointwise降低运算量
3.5 SENet、CBAM特征通道加权卷积3.5.1 SENet
3.5.2 CBAM除了通道权重,CBAM还考虑空间权重,即:图像中心区域比周围区域更重要,由此设置不同位置的空间权重。CBAM将空间注意力和通道注意力结合起来。 Channel attention module:
此步骤与SENet不同之处是加了一个并行的最大值池化,提取到的高层特征更全面,更丰富。 Channel attention module: 将上一步得到的结果通过最大值池化和平均池化分成两个大小为H×W×1的张量,然后通过Concat操作将二者堆叠在一起(C为2),再通过卷积操作将通道变为1同时保证H和W不变,经过一个sigmoid得到spatial_out,最后spatial_out乘上一步的输入变回C×H×W,完成空间注意力操作 总结:
3.6 inception几个改进版google对inception进行改造,出现了inception1→inception2→inception3→Xception→inception4→inception ResNetV1→inception →ResNetV2。 3.6.1 Inception2
对卷积核进行了几种改造。但是设计思想都是: 3.6.2 Inception3最大贡献:标签平滑防止过拟合
3.6.3 Xception、inception4
3.6.4 inception ResNetV1&2
3.6.5 Resnet&RenextResnet是微软何凯明搞出来的(93年的人)。主要也是借鉴shortcut思想,因为网络太深必然会碰到梯度消失的问题。然后就是一堆小卷积核,每两层抄一次近道是试验出来的效果。抄近道就必须保持前后的channel数一致。 然后Resnet又借鉴inception把网络都做宽了,就是Renext: ResNeXt是ResNet和Inception的结合体,因此你会觉得与InceptionV4有些相似,但却更简洁,同时还提出了一个新的维度: cardinality (基数),在不加深或加宽网络增加参数复杂度的前提下提高准确率,还减少了超参数的数量。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/27 3:43:53- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |