转载自:

卷积神经网络初探 | 数据科学家联盟
http://dataunion.org/20942.html

前言

目前为止我已经完整地学完了三个机器学习教程:包括“Stanford CS229”,”Machine Learning on Coursrea” 和 “Stanford UFLDL”,卷积神经网络是其中最抽象的概念。

维基百科对卷积的数学定义为:

由于卷积常用与信号处理,很多人基于“输入->系统->响应”这一模型来解释卷积的物理意义,这里转载一个非常通俗的版本:

比 如说你的老板命令你干活,你却到楼下打台球去了,后来被老板发现,他非常气愤,扇了你一巴掌(注意,这就是输入信号,脉冲),于是你的脸上会渐渐地鼓起来 一个包,你的脸就是一个系统,而鼓起来的包就是你的脸对巴掌的响应,好,这样就和信号系统建立起来意义对应的联系。下面还需要一些假设来保证论证的严谨: 假定你的脸是线性时不变系统,也就是说,无论什么时候老板打你一巴掌,打在你脸的同一位置,你的脸上总是会在相同的时间间隔内鼓起来一个相同高度的包,并 且假定以鼓起来的包的大小作为系统输出。好了,下面可以进入核心内容——卷积了!

如果你每天都到地下去打台球,那么老板每天 都要扇你一巴掌,不过当老板打你一巴掌后,你5分钟就消肿了,所以时间长了,你甚至就适应这种生活了……如果有一天,老板忍无可忍,以0.5秒的间隔开始 不间断的扇你的过程,这样问题就来了,第一次扇你鼓起来的包还没消肿,第二个巴掌就来了,你脸上的包就可能鼓起来两倍高,老板不断扇你,脉冲不断作用在你 脸上,效果不断叠加了,这样这些效果就可以求和了,结果就是你脸上的包的高度随时间变化的一个函数了(注意理解);如果老板再狠一点,频率越来越高,以至 于你都辨别不清时间间隔了,那么,求和就变成积分了。可以这样理解,在这个过程中的某一固定的时刻,你的脸上的包的鼓起程度和什么有关呢?和之前每次打你 都有关!但是各次的贡献是不一样的,越早打的巴掌,贡献越小,所以这就是说,某一时刻的输出是之前很多次输入乘以各自的衰减系数之后的叠加而形成某一点的 输出,然后再把不同时刻的输出点放在一起,形成一个函数,这就是卷积,卷积之后的函数就是你脸上的包的大小随时间变化的函数。本来你的包几分钟就可以消 肿,可是如果连续打,几个小时也消不了肿了,这难道不是一种平滑过程么?反映到剑桥大学的公式上,f(a)就是第a个巴掌,g(x-a)就是第a个巴掌在 x时刻的作用程度,乘起来再叠加就ok了,大家说是不是这个道理呢?我想这个例子已经非常形象了,你对卷积有了更加具体深刻的了解了吗?

这是一些尝试解释卷积的文章:

http://www.guokr.com/post/342476/

http://blog.csdn.net/yeeman/article/details/6325693

https://zh.wikipedia.org/wiki/%E5%8D%B7%E7%A7%AF

而在图像处理中通常使用离散形式的卷积,在下一节中介绍。

卷积特征提取(convolution)

卷积特征提取的过程

假设有一个稀疏自编码器 SAE,训练使用的是 3×3 的小图。将 SAE 用作深度网络的隐藏层时,它依然只接受 3×3 的数据作为输入,且假设这个隐藏层有 k 个单元(每个单元也被称为一个卷积核 – Convolution Kernel,由对应的权值向量 W 和 b 来体现)。

每个隐藏单元的输入是用自己的权值向量 W 与 3×3 的小图做内积,再与截距项相加得到的:

假如深度网络的输入是 5×5 的大图,SAE 要从中提取特征,必须将 5×5 的大图分解成若干 3×3 的小图并分别提取它们的特征。分解方法就是:从大图的 (1, 1)、(1, 2)、(1, 3)、…  、(3, 3)等 9 个点开始分别作为小图的左上角起点,依次截取 9 张带有重合区域的小图,然后分别提取这 9 张小图的特征:

所以,每个隐藏单元将有 9 个输入,不同于之前的 1 个。然后将所有输入分别导入激活函数计算相应的输出,卷积特征提取的工作就完成了。

对于本例,隐藏层所提取的特征共有 9×k 个;更一般化地,如果大图尺寸是 r×c,小图尺寸是 a×b,那么所提取特征的个数为:

卷积特征提取的原理

卷积特征提取利用了自然图像的统计平稳性(Stationary):

自然图像有其固有特性,也就是说,图像的一部分的统计特性与其他部分是一样的。这也意味着我们在这一部分学习的特征也能用在另一部分上,所以对于这个图像上的所有位置,我们都能使用同样的学习特征。

池化(Pooling)

池化过程

在完成卷积特征提取之后,对于每一个隐藏单元,它都提取到 (r-a+1)×(c-b+1)个特征,把它看做一个矩阵,并在这个矩阵上划分出几个不重合的区域,然后在每个区域上计算该区域内特征的均值或最大值,然后用这些均值或最大值参与后续的训练,这个过程就是【池化】。

池化的优点

  1. 显著减少了参数数量
  2. 池化单元具有平移不变性 (translation invariant)有一个 12×12 的 feature map (隐藏层的一个单元提取到的卷积特征矩阵),池化区域的大小为 6×6,那么池化后,feature map 的维度变为 2×2。

    假设原 feature map 中灰色元素的值为 1,白色元素的值为 0。如果采用 max pooling,那么池化后左上角窗口的值为 1。如果将图像向右平移一个像素:

    池化后左上角窗口的值还是 1。如果将图像缩小:

    池化后左上角窗口的值依然是 1。

    通常我们认为图像经过有限的平移、缩放、旋转,不应改变其识别结果,这就要求经过平移、缩放、旋转的图片所提取的特征与原图所提取的特征相同或相似,因此分类器才能把它们识别成同一类。

几种池化方式

比较主流的池化方式有如下几种:

  1. 一般池化(General Pooling): max pooling 和 average pooling现在已经知道了 max pooling 与 average pooling 的几何意义,还有一个问题需要思考:它们分别适用于那些场合?在不同的场合下,它们的表现有什么不一样?为什么不一样?

    网络上有人这样区分 max pooling 和 average pooling:

    “average对背景保留更好,max对纹理提取更好”。

    限于篇幅以及我的理解还不深,就不展开讨论了,如果以后需要,我会深入研究一下。

  2. 重叠池化(Overlapping Pooling)重叠池化的相邻池化窗口之间会有重叠区域。
  3. 空间金字塔池化(Spatial Pyramid Pooling)空间金字塔池化拓展了卷积神经网络的实用性,使它能够以任意尺寸的图片作为输入。
  4. 下面列出一些研究池化的论文:http://yann.lecun.com/exdb/publis/pdf/boureau-icml-10.pdf

    http://yann.lecun.com/exdb/publis/pdf/boureau-cvpr-10.pdf

    http://yann.lecun.com/exdb/publis/pdf/boureau-iccv-11.pdf

    http://ais.uni-bonn.de/papers/icann2010_maxpool.pdf

汇总

有 m 张彩色自然图片拿来训练一个神经网络,使它能够对图片中的物体做分类。训练过程可以大致分为以下几步:

  1. 从图片库中随机裁剪出相同尺寸的小图若干张,用来训练一个稀疏自编码器 C1;
  2. 以 C1 作为第一个卷积层,从原图中做卷积特征提取;
  3. 在 C1 下游添加一个池化层 S1,对 C1 所提取的特征做池化计算;
  4. 如果需要提取更加抽象的特征,在 S1 之后添加卷积层 C2,C2 是一个使用 S1 的数据进行训练的稀疏自编码器;
  5. 在 C2 下游添加一个池化层 S2,如果需要提取进一步抽象的特征,重复添加卷积层与池化层即可;
  6. 以最后一个池化层的输出作为数据训练分类器。

课后作业(Convolution and Pooling)

In this exercise you will use the features you learned on 8×8 patches sampled from images from the STL-10 dataset in the earlier exercise on linear decoders for classifying images from a reduced STL-10 dataset applying convolution and pooling. The reduced STL-10 dataset comprises 64×64 images from 4 classes (airplane, car, cat, dog).

这次作业依赖上一次“linear decoders”作业的代码,使用的数据是 STL-10 的一个子集,用来识别四种图像:飞机、汽车、猫和狗。

代码地址,由于 GIthub 有文件大小限制,所以这次没有上传数据文件。

Pooling 的代码比较简单,所以这里把计算卷积的代码详细注释后贴出来:

cnnConvolve.m

运行结果(识别的正确率):

  1. 使用 average pooling:
  2. 使用 max pooling:

卷积神经网络初探 | 数据科学家联盟 http://dataunion.org/20942.html相关推荐

  1. 【中国图形图像学报】面向COVID-19疫情预测的图卷积神经网络时空数据学习——CCF B、CSCD

    [中国图形图像学报]面向COVID-19疫情预测的图卷积神经网络时空数据学习 摘 要 当前的疾病传播研究主要集中于时序数据和传染病模型,缺乏运用空间信息提升预测精度的探索和解释.在处理时空数据时需要分 ...

  2. 回归预测 | MATLAB实现PSO-GCNN粒子群算法优化分组卷积神经网络的数据多输入单输出回归预测

    回归预测 | MATLAB实现PSO-GCNN粒子群算法优化分组卷积神经网络的数据多输入单输出回归预测 目录 回归预测 | MATLAB实现PSO-GCNN粒子群算法优化分组卷积神经网络的数据多输入单 ...

  3. 卷积神经网络预测数据值,一维卷积神经网络 keras

    1.关于keras构建的神经网络的输出结果解释 ETA:Estimated Time of Arrival.Loss:系统的损失.acc:Accuracy正确率. 谷歌人工智能写作项目:小发猫 2.卷 ...

  4. cnn神经网络可以用于数据拟合吗_使用Keras搭建卷积神经网络进行手写识别的入门(包含代码解读)...

    本文是发在Medium上的一篇博客:<Handwritten Equation Solver using Convolutional Neural Network>.本文是原文的翻译.这篇 ...

  5. 卷积神经网络在物联网场景中的应用初探

    本文转自:https://www.jianshu.com/p/8b6446181a52 概述 机器学习发展到今天,得益于数据量的增长.算力的丰富.和深度神经网络技术的不断创新和广泛应用,像计算机视觉. ...

  6. tensorflow lstm 预测_图卷积神经网络GCN与递归结构RNN相结合的时间序列预测

    时间序列预测任务可以按照不同的方法执行.最经典的是基于统计和自回归的方法.更准确的是基于增强和集成的算法,我们必须使用滚动周期生成大量有用的手工特性.另一方面,我们可以使用在开发过程中提供更多自由的神 ...

  7. 实用卷积神经网络 运用python pdf_解析卷积神经网络—深度学习实践手册 中文pdf高清版...

    解析卷积神经网络-深度学习实践手册从实用角度着重解析了深度学习中的一类神经网络模型--卷积神经网络,向读者剖析了卷积神经网络的基本部件与工作机理,更重要的是系统性的介绍了深度卷积神经网络在实践应用方面 ...

  8. 卷积神经网络图像识别_[源码和文档分享]基于CUDA的卷积神经网络算法实现

    摘 要 卷积神经网络是近年来人工智能领域取得重大突破的一种重要手段,给出了图像识别.语音识别和自然语言处理领域中关键问题的优化解决方案,尤其适合处理图像方面的任务,如人脸识别和手写体识别.手写数字识别 ...

  9. 卷积神经网络前向及反向传播过程数学解析

    卷积神经网络前向及反向传播过程数学解析 文章目录 <center>卷积神经网络前向及反向传播过程数学解析 1.卷积神经网络初印象 2.卷积神经网络性质 3.前向传播 3.1.卷积层层级间传 ...

最新文章

  1. Asp.NetCore1.1版本没了project.json,这样来生成跨平台包
  2. python老鼠打洞问题_脑筋急转弯:老鼠为什么要打洞?这答案让人哭笑不得
  3. FPGA篇(八)FPGA学习经典网站推荐 (转)
  4. 危机下,你还敢提加薪吗?
  5. 收藏!MySQL 面试必须掌握的 8 个知识点!
  6. Linux开放端口、关闭防火墙操作
  7. overlayfs高密 读性能_RFID读写器天线圆极化与线极化的性能区别
  8. 光源选型的要素有哪些?
  9. 【软件工程】三、软件开发方法学——结构化分析方法
  10. Python爬虫入门教程05:B站视频弹幕的爬取
  11. 双android系统pcb整合,基于Android的大屏幕拼接显示系统研究与实现
  12. html2canvas教程_HTML5 Canvas教程:简介
  13. 某微信小程序连锁超市响应参数解密
  14. windows 查看端口号
  15. 效率倍增!12 个必知必会的 Python 数据处理技巧!
  16. Java —— 冒泡排序
  17. centos7.6下载地址
  18. 17年1月9日,小程序来了。深度解析2017微信公开课
  19. Photoshopcs6 自学笔记0 快捷键
  20. Hadoop运行原理之Spill, Shuffle

热门文章

  1. 亿级别记录的mongodb批量导入Es的java代码完整实现
  2. Where to Store your JWTs – Cookies vs HTML5 Web Storage--转
  3. Java 8 Stream API详解--转
  4. 四层和七层负载均衡的区别介绍--转
  5. 【SQL】SQL语句多表联合查询
  6. NUXT 入门第一课: 关于 Nuxt.js
  7. 算法与数据结构(冒泡排序,选择排序和插入排序的总结)
  8. Redis进阶-如何从海量的 key 中找出特定的key列表 Scan详解
  9. linux 没权限dev null,Linux mint cinnamon 64位找不到/dev/null
  10. 隐藏tomcat页面异常显示的版本信息