CNN核心概念理解
卷积神经网络 (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核心概念理解的更多相关文章
- Spark核心概念理解
本文主要内容来自于<Hadoop权威指南>英文版中的Spark章节,能够说是个人的翻译版本号,涵盖了基本的Spark概念.假设想获得更好地阅读体验,能够訪问这里. 安装Spark 首先从s ...
- Kubenetes 核心概念理解
Kubernetes 是一个具有自动控制 .自动纠错功能的资源管理系统 可以把 Node , Pod , Replication Controller , Service 等都看做是一种 " ...
- 领域驱动设计(DDD)部分核心概念的个人理解
领域驱动设计(DDD)是一种基于模型驱动的软件设计方式.它以领域为核心,分析领域中的问题,通过建立一个领域模型来有效的解决领域中的核心的复杂问题.Eric Ivans为领域驱动设计提出了大量的最佳实践 ...
- 领域驱动设计(DDD)部分核心概念的个人理解(转)
领域驱动设计(DDD)是一种基于模型驱动的软件设计方式.它以领域为核心,分析领域中的问题,通过建立一个领域模型来有效的解决领域中的核心的复杂问题.Eric Ivans为领域驱动设计提出了大量的最佳实践 ...
- 理解maven的核心概念
原文出处:http://www.cnblogs.com/holbrook/archive/2012/12/24/2830519.html 好久没进行java方面的开发了,最近又完成了一个java相关的 ...
- 大数据核心知识点:Hbase、Spark、Hive、MapReduce概念理解,特点及机制
今天,上海尚学堂大数据培训班毕业的一位学生去参加易普软件公司面试,应聘的职位是大数据开发.面试官问了他10个问题,主要集中在Hbase.Spark.Hive和MapReduce上,基础概念.特点.应用 ...
- 十分钟带你理解Kubernetes核心概念
什么是Kubernetes? Kubernetes(k8s)是自动化容器操作的开源平台,这些操作包括部署,调度和节点集群间扩展.如果你曾经用过Docker容器技术部署容器,那么可以将Docker看成K ...
- Maven(三)理解Maven核心概念
转载自: http://www.cnblogs.com/holbrook/archive/2012/12/24/2830519.html 本文以类图的方式,介绍maven核心的12个概念以及相互之间的 ...
- DDD战略设计相关核心概念的理解
前言 本文想再讨论一下关于领域.业务.业务模型.解决方案.BC.领域模型.微服务这些概念的含义和关系.初衷是我发现现在DDD领域建模以及解决方案落地过程中,常常对这些概念理解不清楚或者有歧义,导致我们 ...
随机推荐
- 075、Java面向对象之定义匿名对象
01.代码如下: package TIANPAN; class Book { // 定义一个新的类 private String title; // 书的名字 private double price ...
- (转)C#的 GC工作原理基础
作为一位C++出身的C#程序员,我最初对垃圾收集(GC)抱有怀疑态度,怀疑它是否能够稳定高效的运作:而到了现在,我自己不得不说我已经逐渐习惯并依赖GC与我的程序“共同奔跑”了,对“delete”这个习 ...
- Jmeter插件解释
Jmeter插件解释 1.jp@gc - Actiive Threads Over Time:不同时间活动用户数量展示(图表) 2.jp@gc - AutoStop Listener :自动停止监听 ...
- 吴裕雄--天生自然JAVAIO操作学习笔记:内存操作流、管道流与打印流操作
import java.io.* ; class Send implements Runnable{ // 线程类 private PipedOutputStream pos = null ; // ...
- Matplotlib 图形绘制
章节 Matplotlib 安装 Matplotlib 入门 Matplotlib 基本概念 Matplotlib 图形绘制 Matplotlib 多个图形 Matplotlib 其他类型图形 Mat ...
- JSONObject.fromObject() 转string时,实体里面的时间错乱的问题
在把要入库的数据实体转成JSON字符串发给kafka的时候,出现了问题,转换完以后,就变成这样子的了,真的是第一次见到这种,真的是长见识了 然后百度了一下:https://www.cnblogs.co ...
- Python测试进阶——(4)Python程序监控、存储、分析并可视化CPU和内存利用率
monitor190617.py 监控cpu和内存利用率信息,组织成json格式,并写入到 record.txt 文件中: import psutil import time import json ...
- python学习0day
一开始学习python没有什么感觉,也没怎么用到,时间间隔大概有一年了开始重新拾起python,话说滋味不太好受,推荐大家学到就常常的练习,不要和小白一样,难受.... 推荐一个网站: 菜鸟教程 - ...
- 云时代架构阅读笔记十六——Hystrix理解
背景 分布式系统环境下,服务间类似依赖非常常见,一个业务调用通常依赖多个基础服务.如下图,对于同步调用,当库存服务不可用时,商品服务请求线程被阻塞,当有大批量请求调用库存服务时,最终可能导致整个商品服 ...
- Centos 7 安装与卸载MYSQL5.7
先介绍卸载防止重装 yum方式 查看yum是否安装过mysqlyum list installed mysql*如或显示了列表,说明系统中有MySQL yum卸载 根据列表上的名字 yum remov ...