1. CNN卷积网络-初识

2. CNN卷积网络-前向传播算法

3. CNN卷积网络-反向更新

1. 前言

我们已经了解了CNN的结构,CNN主要结构有输入层,一些卷积层和池化层,后面是DNN全连接层,最后是Softmax激活函数的输出层。这里我们用一个彩色的汽车样本的图像识别再从感官上回顾下CNN的结构。图中的CONV即为卷积层,POOL即为池化层,而FC即为DNN全连接层,包括了我们上面最后的用Softmax激活函数的输出层。

2. 卷积层的前向传播

还是以上面的图片作为例子。

先考虑最简单的,样本都是二维的黑白图片。这样输入层\(X\)就是一个矩阵,矩阵的值等于图片的各个像素位置的值。这时和卷积层相连的卷积核\(W\)就也是矩阵。

如果样本都是有RGB的彩色图片,这样输入\(X\)就是3个矩阵,即分别对应\([R,G,B]\)的矩阵,或者说是一个张量。这时和卷积层相连的卷积核\(W\)就也是张量,对应的最后一维的维度为3.即每个卷积核都是3个子矩阵组成。

同样的方法,对于3D的彩色图片之类的样本,我们的输入\(X\)可以是4维,5维的张量,那么对应的卷积核W也是个高维的张量。

不管维度多高,对于我们的输入,前向传播的过程可以表示为:

\[
a^2= \sigma(z^2) = \sigma(a^1*W^2 +b^2)
\]
其中,上标代表层数,星号代表卷积,而\(b\)代表我们的偏倚, \(\sigma\)为激活函数,这里一般都是\(ReLU\)。

和DNN的前向传播比较一下,其实形式非常的像,只是我们这儿是张量的卷积,而不是矩阵的乘法。同时由于\(W\)是张量,那么同样的位置,\(W\)参数的个数就比DNN多很多了。

为了简化我们的描述,本文后面如果没有特殊说明,我们都默认输入是3维的张量,即用\(RBG\)可以表示的彩色图片。

这里需要我们自己定义的CNN模型参数是:

  1. 一般我们的卷积核不止一个,比如有\(K\)个,那么我们输入层的输出,或者说第二层卷积层的对应的输入就\(K\)个。
  2. 卷积核中每个子矩阵的的大小,一般我们都用子矩阵为方阵的卷积核,比如\([F,F]\)的子矩阵。
  3. 填充padding(以下简称P),我们卷积的时候,为了可以更好的识别边缘,一般都会在输入矩阵在周围加上若干圈的0再进行卷积,加多少圈则\(P\)为多少。
  4. 步幅stride(以下简称S),即在卷积过程中每次移动的像素距离大小。

3. 池化层的前向传播

池化层的处理逻辑是比较简单的,我们的目的就是对输入的矩阵进行缩小概括。比如输入的若干矩阵是\([N,N]\)维的,而我们的池化大小是\([k,k]\)的区域,则输出的矩阵都是\([N_k,N_k]\)维的。

这里需要需要我们定义的CNN模型参数是:

  1. 池化区域的大小\(k\)
  2. 池化的标准,一般是MAX或者Average。

4. 全连接层的前向传播

由于全连接层就是普通的DNN模型结构,因此我们可以直接使用DNN的前向传播算法逻辑,即:

\[
a^l = \sigma(z^l) = \sigma(W^la^{l-1} + b^l)
\]

5. 总结

有了上面的基础,我们现在总结下CNN的前向传播算法。

输入:1个图片样本,CNN模型的层数\(L\)和所有隐藏层的类型,对于卷积层,要定义卷积核的大小\(K\),卷积核子矩阵的维度\(F\),填充大小\(P\),步幅\(S\)。对于池化层,要定义池化区域大小k和池化标准(MAX或Average),对于全连接层,要定义全连接层的激活函数(输出层除外)和各层的神经元个数。

输出:CNN模型的输出\(a_L\)

  1. 根据输入层的填充大小\(P\),填充原始图片的边缘,得到输入张量\(a_1\)。
  2. 初始化所有隐藏层的参数\(W,b\)
  3. \(for\;\;l=2\;\;to\;\;L-1\):
    1. 如果第\(l\)层是卷积层,则输出为\(a^l= ReLU(z^l) = ReLU(a^{l-1}*W^l +b^l)\)
    2. 如果第\(l\)层是池化层,则输出为\(a_l=pool(a_{l-1})\), 这里的pool指按照池化区域大小\(k\)和池化标准将输入张量缩小的过程。
    3. 如果第\(l\)层是全连接层,则输出为\(a^l= \sigma(z^l) = \sigma(W^la^{l-1} +b^l)\)
  4. 对于输出层第\(L\)层:\(a^L= softmax(z^L) = softmax(W^La^{L-1} +b^L)\)

以上就是CNN前向传播算法的过程总结。有了CNN前向传播算法的基础,我们后面再来理解CNN的反向传播算法就简单多了。下一篇我们来讨论CNN的反向传播算法。

最新文章

  1. imx6移植ffmpeg2.3
  2. C# ~ 从 IEnumerable / IEnumerator 到 IEnumerable<T> / IEnumerator<T> 到 yield
  3. 关于phpstorm中安装配置xdeug
  4. 011OK6410开发板介绍
  5. Machine Learning for hackers读书笔记_一句很重要的话
  6. IOS编程之相机和相册
  7. struts2+Hibernate4+spring3+EasyUI环境搭建之四:引入hibernate4以及spring3与hibernate4整合
  8. html良好结构-之豆瓣风格
  9. 其它综合-CentOS7 忘记root密码
  10. 探索 Python 学习
  11. cocos2d-x C++ 获取网络图片缓存并展示
  12. UE4 几个好用的插件和Wiki教程
  13. python基础学习Day10 函数形参的动态参数、*args **kwargs 命名空间 global 与 nonlocal
  14. golang学习笔记 --- goroutine
  15. emacs之自动完成括号
  16. 5_bootstrap之响应式布局|列表|按钮
  17. iOS出现 _OBJC_CLASS_$_ZSHomeServiceDataElementGroupLargeImage", referenced from:以及linker command failed with exit code 1 (use -v to see invocation)的错误分析
  18. Mysql分区表及自动创建分区Partition
  19. HDU 4746 Mophues(莫比乌斯反演)
  20. js中去掉字符串中的某个指定字符

热门文章

  1. lamp环境服务器配置文档
  2. 【java】详解java多线程
  3. MySQLFabric概述
  4. xcode9报错 Safe Area Layout Guide before iOS9.0
  5. C#多线程JOIN方法初探
  6. Scala学习网址
  7. MongoDB学习笔记(5)--document
  8. Angular 2 + 折腾记 :(7) 初步了解表单:模板驱动及数据驱动及脱坑要点
  9. ADO.NET事务
  10. 集群扩容的常规解决:一致性hash算法