CNN(Convolutional Neural Network)

卷积神经网络(简称CNN)最早可以追溯到20世纪60年代,Hubel等人通过对猫视觉皮层细胞的研究表明,大脑对外界获取的信息由多层的感受野(Receptive Field)激发完成的。在感受野的基础上,1980年Fukushima提出了一个理论模型Neocognitron是感受野在人工神经网络领域的首次应用。1998年,Lecun等人提出的LeNet-5模型在手写字符识别上取得了成功,引起了学术界对卷积神经网络的关注。2012年,Krizhevsky 等人提出的AlexNet模型在ImageNet图像分类竞赛中取得第一名的成绩,其模型准确度领先第二名11%。在AlexNet之后,VGG(Visual Geometry Group)、GoogLeNet、ResNet也相继被提出。

ANN简化依据

我们也可以用ANN进行图片分类。但是,在将ANN用于图片分类会导致模型参数过多。例如,训练的图片大小为100x100x3,第一层隐层的神经元数目为1000时,参数就达到3x107。因此,需要人们利用先验知识来简化ANN以达到减少模型的参数,而简化后的结构就是CNN。

ANN的简化依据:①对于一个神经元来说,并不需要连接图片的全局区域,只需要连接局部区域的信息来检测局部物体,如图1-1所示。

图1-1 整体区域与局部区域

②同一个物体可能会出现在不同图片的不同区域。如有的鸟嘴位置在左上角,而在另一张图片中间,如图1-2所示

图1-2 鸟嘴在不同的区域

③对图片进行子采样,不会对人对图片内容的理解产生太大影响。可以把图片的奇数行、偶数列的像素去掉,使图片变为原图片的1/4,但不影响我们理解图片内容,如图1-3所示。子采样可以减小图片大小继而减少模型参数量。

图1-3 图片子采样

CNN结构

卷积层(Convolution Layer)

卷积层主要进行卷积操作。我们先定义一个过滤器(也称作卷积核),其实就是一个矩阵(如图1-4所示)

图1-4 过滤器

以图1-4和1-5为例,卷积操作就如图1-6所示。卷积操作就是过滤器跟过滤器覆盖的图片局部区域(如图1-5的红色区域)对应的每个像素先相乘后累加。假设过滤器上的每个像素值为fij,图片上被覆盖区域的像素为amn,那么卷积操作就是

图1-5 image

图1-6 卷积操作

在完成卷积后,会挪动过滤器再进行卷积操作,挪动的距离称作步长(stride)。假定步长为1,则向右移动,如图1-7所示。单个过滤器在图片上完成卷积的动态过程如图1-8所示

图1-7 步长

图1-8 完整的卷积操作

过滤器的卷积计算的作用在于如果有图片的局部区域跟过滤器比较相似,在进行卷积后的输出值会比较大,卷积后的值越大,就表明检测到对应物体。过滤器的大小只覆盖图片的局部区域,就对应“ANN简化依据①”;而在挪动过程中,过滤器是不变的,则可以检测不同区域上相同的物体,对应的就是“ANN简化依据②”。过滤器在挪动过程中对应的参数也就是不变的,因此也被称作权值共享。

多过滤器卷积操作

对于一个输入图片,我们可以设置多个过滤器来进行卷积。例如,我们使用5个过滤器来进行卷积,就得到5个相同大小的特征图。这些特征图会从新组合成为高度为5的图片,作为下一层卷积的输入。所以,卷积之后只会得到一个图片,图片的深度就是过滤器的数量。

池化层(Pooling Layer)

卷积层在完成卷积操作后会得到一个矩阵,这个矩阵被称作特征图(Feature Map)。池化就是将特征图分为若干区域,每个区域用一个值来进行表示。如图1-9,将特征图分为4个2x2区域,每个区域用最大值来进行表示(当然也可以采用均值,最小值等其他操作)。

图1-9 最大池化操作

池化层的作用就是缩小特征图,得到一个更小的子图来表征原图。因此池化操作对应了“ANN简化依据③”。

参数训练过程

CNN的整个训练过程跟ANN并没有太大区别,都是利用BP来完成参数更新。但是,由于CNN中有增加权值共享这一特性,因此在更新的时候需要特别处理。如图1-10所示,在进行前向传播时,不同颜色的权重的值是一样的。但是在进行BP更新参数时,由于输入值不一样,因此计算出来的梯度也是不一样的。为了使所有不同颜色的权重值一样,可以分别计算出相同颜色的每一个权重的梯度,再取平均值。最后,让每一个权重更新同样的值就可以。

图1-10 权值共享

CNN各层的学习对象

CNN在图像处理上确实取得了成功,但是由于CNN的内部过于复杂,人们往往将CNN看做一个黑盒子。因此,我们还是需要去探究,CNN到底学习到了什么。

过滤器的检测对象

如何知道各层的过滤器在检测的对象?对于一个正常的流程,应该是我们输入一张图片,进行卷积后的输出值越大,说明过滤器就是在检测这个对象。因此,我们需要反推正常的流程。即在确定使输出值越大的前提下,去生成输入的图片。

过滤器经过卷积后的矩阵(如图1-10所示)的各个元素记作,k表示第k个过滤器。评估函数为,求解的目标是,利用梯度上升就可以完成的求解。

图1-10 特征图

过滤器学习到的检测对象,如图1-11所示。每一个过滤器都会检测不同的对象,有些是竖线,有些是横线等。

图1-11 过滤器的检测对象

全连接层神经元的检测对象

我们可以利用跟过滤器检测对象同样的方法,生成出全连接层神经元的检测对象。如图1-12所示。跟过滤器的检测对象不一样的是,全连接层的神经元输出更像是全局对象,而不是检测局部对象。

图1-12 全连接层神经元的检测对象

输出层神经元的检测对象

当我们考虑输出层神经的检测对象时,采用跟过滤器检测对象相同的做法,得到的结果如图1-13所示,显然得到的结果非常糟糕,因为根本不知道生成的图片是什么。

图1-13  输出层神经元的检测对象

但是,你把1-13中的8作为CNN的输入,输出的结果会表示该图片是8。因此,深度神经网络似乎也不是那么智能,很容易被欺骗。为了让输出层神经元的检测对象看过去更像是一个数字,需要对评估函数做一些修改。对于数字而言,数字线条占总图片大小的区域并不是很多。因此,我们需要让生成的x*尽可能小。最终的评估函数为

跟原先的评估函数相比,其实就是多了L1正则化这一项。为么是评估函数值越大,L1就需要越小越好。新的评估函数会得到稍微更好的结果,如图1-14所示

图1-14 L1后的输出层神经元的检测对象

CNN的实际应用

Deep Dream

Deep Dream就是你给一张图片,然后机器会根据图片内容,增加机器看到的物体(效果图如图1-15所示)。Deep Dream的大致思想跟检测对象的做法是相似。

图1-15 Deep Dream效果图

Deep Dream的做法流程如图1-16所示,给定一张图片,获得图片的输出向量。对于输出向量,其中令正值越大,负值越小。这个做法就是要夸张化CNN所检测的对象。最后利用修改后的向量作为目标,来反向重新调整图片。

图1-16 Deep Dream大致流程

Deep Style

Deep Style是给定两张图片,一张是偏内容,一张是偏风格。然后,将两种图片进行“融合”,效果如图1-17所示

图1-17 Deep Style效果图

Deep Style的大致思想如图1-18所示,一个CNN提取图片的内容;一个CNN提取图片的风格,图片的风格主要体现在过滤器与过滤器输出值之间的关联性。则最终要构造的图片应该能使输出跟左边的内容很相似,且过滤器输出值之间的关联性跟右边的很相似。

图1-18 Deep Style思想

Play Go

将CNN用在下围棋的话,则输入是当前棋盘就是,输出就是下一子的位置。对于整个棋盘,我们可以用(1,-1,0)代表(黑子,白子,无子)。而CNN之后以可以用来下围棋,原因在于将围棋的一些特性跟“ANN简化依据”相似。在围棋上,有时候并不需要全局的信息,而且这种局部信息可能会在棋盘的不同位置。但是,围棋不像图片,不能进行子采样。因此,将CNN应用于围棋时,应该去掉池化层。

图1-19 围棋

参考资料

[1]机器学习-李宏毅

CNN(Convolutional Neural Network)的更多相关文章

  1. 卷积神经网络(Convolutional Neural Network,CNN)

    全连接神经网络(Fully connected neural network)处理图像最大的问题在于全连接层的参数太多.参数增多除了导致计算速度减慢,还很容易导致过拟合问题.所以需要一个更合理的神经网 ...

  2. 卷积神经网络(Convolutional Neural Network, CNN)简析

    目录 1 神经网络 2 卷积神经网络 2.1 局部感知 2.2 参数共享 2.3 多卷积核 2.4 Down-pooling 2.5 多层卷积 3 ImageNet-2010网络结构 4 DeepID ...

  3. 深度学习FPGA实现基础知识10(Deep Learning(深度学习)卷积神经网络(Convolutional Neural Network,CNN))

    需求说明:深度学习FPGA实现知识储备 来自:http://blog.csdn.net/stdcoutzyx/article/details/41596663 说明:图文并茂,言简意赅. 自今年七月份 ...

  4. 【转载】 卷积神经网络(Convolutional Neural Network,CNN)

    作者:wuliytTaotao 出处:https://www.cnblogs.com/wuliytTaotao/ 本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可,欢迎 ...

  5. Convolutional neural network (CNN) - Pytorch版

    import torch import torch.nn as nn import torchvision import torchvision.transforms as transforms # ...

  6. 论文阅读(Weilin Huang——【TIP2016】Text-Attentional Convolutional Neural Network for Scene Text Detection)

    Weilin Huang--[TIP2015]Text-Attentional Convolutional Neural Network for Scene Text Detection) 目录 作者 ...

  7. Convolutional Neural Network in TensorFlow

    翻译自Build a Convolutional Neural Network using Estimators TensorFlow的layer模块提供了一个轻松构建神经网络的高端API,它提供了创 ...

  8. HYPERSPECTRAL IMAGE CLASSIFICATION USING TWOCHANNEL DEEP CONVOLUTIONAL NEURAL NETWORK阅读笔记

    HYPERSPECTRAL IMAGE CLASSIFICATION USING TWOCHANNEL  DEEP  CONVOLUTIONAL NEURAL NETWORK 论文地址:https:/ ...

  9. A NEW HYPERSPECTRAL BAND SELECTION APPROACH BASED ON CONVOLUTIONAL NEURAL NETWORK文章笔记

    A NEW HYPERSPECTRAL BAND SELECTION APPROACH BASED ON CONVOLUTIONAL NEURAL NETWORK 文章地址:https://ieeex ...

随机推荐

  1. request.getContextPath()返回值问题

    转自:http://blog.sina.com.cn/s/blog_6cbe0cff0101j6jl.html request.getContextPath()是在开发Web项目时,经常用到的方法,其 ...

  2. 01 . Go之从零实现Web框架(类似Gin)

    设计一个框架 大部分时候,我们需要实现一个 Web 应用,第一反应是应该使用哪个框架.不同的框架设计理念和提供的功能有很大的差别.比如 Python 语言的 django和flask,前者大而全,后者 ...

  3. C++模板元编程----堆排序

    目录 目录 前言 实现的一些小细节 Debug 惰性求值 总结 Ref 前言 经过前两次经验的积累,终于来到了麻烦的堆排序.在一开始接触模板元编程的时候,我就期望有一天能够写出元编程堆排序的代码.原因 ...

  4. SalesForce学习——权限管理

    Salesforce 对于权限的管理是非常严谨的并且支持不同维度的权限控制.常用的有简档.权限集.角色层级机构.组织范围. 简档:Profiles是Salesforce为每个用户指定的标准配置文件,在 ...

  5. ES6 Set.Map.Symbol数据结构

    一.ES6 Set数据结构 ES6新推出了Set数据结构,它与数组很类似,Set内部的成员不允许重复,每一个值在Set中都是唯一的,如果有重复的值出现会自动去重(也可以理解为忽略掉),返回的是集合对象 ...

  6. 使用lua+redis解决发多张券的并发问题

    前言 公司有一个发券的接口有并发安全问题,下面列出这个问题和解决这个问题的方式. 业务描述 这个接口的作用是给会员发多张券码.涉及到4张主体,分别是:用户,券,券码,用户领取记录. 下面是改造前的伪代 ...

  7. 【函数分享】每日PHP函数分享(2021-1-9)

    implode() 将一个一维数组的值转化为字符串. string implode ( string $glue , array $pieces ) 参数描述 glue     默认为空的字符串. p ...

  8. P4292 [WC2010]重建计划 点分治+单调队列

    题目描述 题目传送门 分析 看到比值的形式就想到 \(01分数规划\),二分答案 设当前的值为 \(mids\) 如果存在\(\frac{\sum _{e \in S} v(e)}{|S|} \geq ...

  9. springboot源码解析-管中窥豹系列之aware(六)

    一.前言 Springboot源码解析是一件大工程,逐行逐句的去研究代码,会很枯燥,也不容易坚持下去. 我们不追求大而全,而是试着每次去研究一个小知识点,最终聚沙成塔,这就是我们的springboot ...

  10. 【Git】简易使用教程

    Git简介 诞生 简单的来说,就是为了托管庞大的Linux源码,开始选择了商用的版本控制系统BitKeeper,但是因为一系列操作,BitKeeper不让用了,所以Linus花了两周时间自己用C写了一 ...