卷积神经网络 (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. GitHub fork 合作开发 - 快速实现版

    目录 一 预备条件 二 fork项目 三 将项目clone到本地 四 push代码到自己的仓库 五 通过pull request提交代码 六 通过本地配置upstream来同步更新主repo的内容 七 ...

  2. Hibernate一对多(多对一)外键设置汇总

    我打算在角色表(role)中添加一个帐号表(account)的外键(accountId),步骤如下: 1.首先在角色表(role)中添加列. 添加语句:alter table role add(acc ...

  3. WebAPI实例

    @{ ViewBag.Title = "About"; } @*<script src="~/Scripts/jquery-1.7.1.min.js"&g ...

  4. OO第四次博客作业(第四单元作业及期末总结)

    (注意:本文写作顺序与作业要求不完全一致,但涵盖了作业的所有要求) 一学期的BUAA特色OO课程结束了. PART 1  我想先写我这一学期的感想 从第一单元满怀期待地写完多项式求值到最后看着60分不 ...

  5. mac安装扩展出现grep: /usr/include/php/main/php.h

    在Mac下执行 sudo phpize时提示: grep: /usr/include/php/main/php.h: No such file or directorygrep: /usr/inclu ...

  6. PreparedStatement 和 Statement 的区别(推荐使用PreparedStatement)

    PreparedStatement与Statement在使用时的区别: 1.Statement: String sql=" "; executeUpdate(sql) 2. Pre ...

  7. Java连载79-Calendar解析

    一. Calendar解析 package com.bjpowernode.java_learning; import java.util.Date; import java.text.ParseEx ...

  8. 2 JVM 运行机制

  9. Codeforces 459E Roland and Rose

    本以为是个树形DP,按照树形DP的方法在那里dfs,结果WA到死,因为它存在有向环,不是树,凡是存在环的情况切记不要用树形的方法去做 题目的突破点在于将边排完序之后,用点表示以该点为边结尾的最大长度, ...

  10. Netty 中队列的使用

    任务队列中的Task有3种典型使用场景 用户程序自定义的普通任务 此前代码: 参考https://www.cnblogs.com/ronnieyuan/p/12016712.html NettySer ...