卷积神经网络 (Convolutional Neural Networks,简称CNN),是一种经典的神经网络算法。由于在图像识别领域取得的良好效果,随着人工智能的火热,它也受到越来越多的关注。CNN的核心概念卷积、池化听起来好像很神秘,了解之后会发现其实也并不复杂。本文试图用通俗的语言,简明扼要地介绍这些关键的概念,给读者带来一个直观的理解。作者在文章最后给出了一些参考资料,以便读者进一步参考。

一、为什么要提出CNN?

我们知道CNN是一种基于神经网络的算法。而传统的神经网络,多层感知机(MLP),在图像识别领域的效果并不好。原因也很容易理解:按照传统网络的观点,要处理图像,需要将图片按行展开,每一个像素就是一个输入。可想而知,参数数量会多么巨大,而这又会带来更多问题:需要庞大的数据集、漫长的训练时间不说,还容易带来让人头疼的过拟合问题。

以手写体识别为例,一个图像经过平移、旋转、缩放等变换会呈现出不同的姿态。人类很容易应对这种变换,但是对于传统的神经网络来说,其泛化能力就不足以处理这些变换了。

还有一个问题,图像本身带有拓扑结构——典型的二维结构。而传统的全连接网络不能有效利用这种结构。在进入神经网络之前,这些重要的结构信息就已经被破坏掉了。为了解决上面提到的各种问题,LeCun在1998年提出了LeNet,从此CNN应运而生。

二、什么是卷积?

首先来看看“卷积”这个关键概念。首先需要明确的是,卷积不是在CNN中被提出的,而是一种有着广泛应用的数学运算,有明确的数学定义和物理意义。在图像处理领域常常使用卷积操作,很多图像处理操作比如模糊、锐化等都可以通过卷积来实现。

下面来看看CNN中卷积运算是怎么进行的:对于给定的一幅图像来说,给定一个卷积核,卷积操作就是根据卷积窗口进行加权求和。卷积窗口在整个图片上滑动,在每一个位置输出一个数值,最终仍然输出一个矩阵。如下图所示:

在图像处理中,卷积核是已知的。而在CNN的卷积层,卷积核的参数也是需要训练的。在LeCun的论文中,他使用局部感受野的概念来解释其原理。考虑到人类在感知目标时总是从局部到总体、从片面到全面的,这样就从神经科学的角度解释了卷积层的原理。本文从另一个角度解释,卷积可以视为图像处理的操作,但是图像变换的参数是未知的,需要从数据集中学习得到。这正是机器学习方法擅长的套路。

希望上面的解释能使读者对卷积产生一个直观的认识。实际上CNN中的卷积和数学上的卷积并不完全一致,如果想要进一步理解卷积的概念和应用,可以参阅下面给出的参考资料。

  • http://setosa.io/ev/image-kernels/,以交互的方式理解图像处理中的卷积
  • https://www.zhihu.com/question/22298352/answer/228543288,对卷积运算的通俗理解
  • https://blog.csdn.net/lz0499/article/details/70195284,从数字信号处理角度理解卷积,包括在图像领域中的应用

三、什么是池化?

LeNet5中第一个隐藏层是卷积层,第二个隐藏层就是池化层。池化,实际上也没有听上去那么神秘,其实就是图片下采样 (sub-sampling)。具体来说就是对图片的每个子区域进行聚合统计,例如最大值、平均值等。得到的效果是相邻的几个像素合并成一个像素。下面举一个例子 (2, 2) 最大池化的例子。

假设原图是一张4 * 4的图片,(2, 2) 池化就是对相邻的4个像素,取最大值作为下采样后的像素值。计算过程如下所示:

经过此次下采样,我们得到处理后的图片为:

池化的方法还有很多,比如可以使用不同的聚合函数,还有重叠采样的池化等。那么在神经网络中加入池化层有什么作用呢?首先,很明显地,经过池化后像素点的个数大大减少了,训练参数的数量也随之下降。在计算能力足够的情况下是不是就不需要池化了呢?也不是的,池化的过程省略掉了图片的一些细节,这样有利于避免过拟合,增加模型的泛化性能。

四、全连接层

在经过若干次卷积和池化之后,特征图被送到全连接层进行分类。全连接层的功能相当于经典的前向全连接网络,因此作为分类器是非常自然的。回过头来看CNN的整体架构,可以把卷积和池化的步骤看做是特征提取的过程,把最后的全连接层看做一个分类器。这就回归到机器学习的经典套路了,理解这种结构也比较自然了。

五、总结

本文简要介绍了CNN中的几个关键性的概念,力图清晰,不求全面。最后,作者也是刚刚接触深度学习不久,如有谬误之处,还请批评指正。

参考资料

  • 《Gradient-Based Learning Applied to Document Recognition》,LeCun经典之作
  • https://blog.csdn.net/hjimce/article/details/47323463,包含了理论和实战部分
  • https://my.oschina.net/u/876354/blog/1620906,给出了很不错的例子
  • https://blog.csdn.net/qianqing13579/article/details/71076261:翻译了LeNet论文部分篇章

CNN核心概念理解的更多相关文章

  1. Spark核心概念理解

    本文主要内容来自于<Hadoop权威指南>英文版中的Spark章节,能够说是个人的翻译版本号,涵盖了基本的Spark概念.假设想获得更好地阅读体验,能够訪问这里. 安装Spark 首先从s ...

  2. Kubenetes 核心概念理解

    Kubernetes 是一个具有自动控制 .自动纠错功能的资源管理系统 可以把 Node , Pod , Replication Controller , Service 等都看做是一种 " ...

  3. 领域驱动设计(DDD)部分核心概念的个人理解

    领域驱动设计(DDD)是一种基于模型驱动的软件设计方式.它以领域为核心,分析领域中的问题,通过建立一个领域模型来有效的解决领域中的核心的复杂问题.Eric Ivans为领域驱动设计提出了大量的最佳实践 ...

  4. 领域驱动设计(DDD)部分核心概念的个人理解(转)

    领域驱动设计(DDD)是一种基于模型驱动的软件设计方式.它以领域为核心,分析领域中的问题,通过建立一个领域模型来有效的解决领域中的核心的复杂问题.Eric Ivans为领域驱动设计提出了大量的最佳实践 ...

  5. 理解maven的核心概念

    原文出处:http://www.cnblogs.com/holbrook/archive/2012/12/24/2830519.html 好久没进行java方面的开发了,最近又完成了一个java相关的 ...

  6. 大数据核心知识点:Hbase、Spark、Hive、MapReduce概念理解,特点及机制

    今天,上海尚学堂大数据培训班毕业的一位学生去参加易普软件公司面试,应聘的职位是大数据开发.面试官问了他10个问题,主要集中在Hbase.Spark.Hive和MapReduce上,基础概念.特点.应用 ...

  7. 十分钟带你理解Kubernetes核心概念

    什么是Kubernetes? Kubernetes(k8s)是自动化容器操作的开源平台,这些操作包括部署,调度和节点集群间扩展.如果你曾经用过Docker容器技术部署容器,那么可以将Docker看成K ...

  8. Maven(三)理解Maven核心概念

    转载自: http://www.cnblogs.com/holbrook/archive/2012/12/24/2830519.html 本文以类图的方式,介绍maven核心的12个概念以及相互之间的 ...

  9. DDD战略设计相关核心概念的理解

    前言 本文想再讨论一下关于领域.业务.业务模型.解决方案.BC.领域模型.微服务这些概念的含义和关系.初衷是我发现现在DDD领域建模以及解决方案落地过程中,常常对这些概念理解不清楚或者有歧义,导致我们 ...

随机推荐

  1. 记一次菜鸡的低级折腾--WordPress get Webshell(后台文件编辑插马)

    挺简单的一个测试站,开始思路错了,一直去网上找WordPress的漏洞,看有没有什么能利用的,未果,因为这个测试站有些地方并不完善,有的漏洞利用不了,菜鸡的我连弱口令都没猜对,没知识就是这么悲哀. 下 ...

  2. (实例)Linux 内核添加exfat驱动

    背景: 由于exfat是常用的文件系统格式,而Linux由于版权的问题,没有在官方中添加有关的驱动. 但是 微软也同意开源了,所以比较新的 Linux 会支持这一块. 为了支持exfat的驱动,我们需 ...

  3. wx.previewimage预览返回会触发onshow的处理方法

    最近做详情页,添加图片预览后竟然触发onshow的处理方法.就显得很尴尬.框架用的uni-app 解决方法 1.page外全局定义开关变量 var a; export default { } 2 .o ...

  4. oozie的常见错误

    1.变量或路径的英文字母写错,常常是大小写搞混,或者是字母顺序颠倒. 2.本地 oozie_works 工作目录下的文件,如job.properties,workflow.xml等,修改后,忘记上传到 ...

  5. 侯捷C++学习(一)

    //c++学习//标准库非常重要//要规范自己的代码complex c1(2,1);complex c2;complex* pc = new complex(0,1);string s1(" ...

  6. C++面试常见问题——13结构体与共用体的sizeof

    结构体与共用体的sizeof 结构体的sizeof 结构体变量占用的内存空间大小通常是其基本类型的大小,但是由例外(字节对齐机制) struct S1{ char c[5]; int a; doubl ...

  7. Oracle删除重复数据并且只留其中一条数据

    数据库操作中,经常会因为导数据造成数据重复,需要进行数据清理,去掉冗余的数据,只保留正确的数据 一:重复数据根据单个字段进行判断 1.首先,查询表中多余的数据,由关键字段(name)来查询. sele ...

  8. stm32CubeMx CAN 发送数据

    平台  STM32F429 软件  STM32CubeMx 5.0.0 固件库  STM32Cube_FW_F4_V1.23.0 目的: 实现 CAN 的发送 一  简介 CAN是控制器局域网络(Co ...

  9. 微信小程序循环中点击一个元素,其他的元素不发生变化,类似点击一个循环中的语音,其他的不发生点击事件

    类似语音,因为都在一个数据内,所以点击第一个,所有的语音都变化,解决方法就是 把整个数据都获取下来,然后更改其中一个需要更改的值,然后再把整个数据都setdata回去,如果需要动画的话,wxml里面放 ...

  10. jsp快速回顾

    http://www.cnblogs.com/zfc2201/archive/2011/08/17/2143615.html http://blog.163.com/mount_lee/blog/st ...