深度学习笔记之CNN(卷积神经网络)基础
不多说,直接上干货!
卷积神经网络(ConvolutionalNeural Networks,简称CNN)提出于20世纪60年代,由Hubel和Wiesel在研究猫脑皮层中用于局部敏感和方向选择的神经元时发现。
CNN是目前深度学习最大的一个流派,其应用优点在于避免了对图像的复杂前期预处理,可以直接处理原始图像。CNN核心在于“卷积”,传统机器学习中LBP、HOG等特征都可以看作是卷积的一种特殊形式,“卷积”以不同的参数来描述不同的抽象程度特征,更接近于原始图像的“特征抽象”。
如上图所示,利用一个滑动窗口(卷积核)对原始图像区域进行“筛选”,将对应像素相乘,再累加( I*K),就得到了一个像素的卷积结果。可以说卷积就像一个筛子,按照一定规则(借助卷积核“乘累加”)对原始图像再加工(实际是一个积分),公式可以描述为:
来看一个典型的CNN实例,对于分辨率为28*28的图片处理过程:
其中Conv为卷积层(采用5*5的卷积核,Step为1),实现数据特征提取;Pool为池化层,也称为降采样(Sample),实现数据降维;FC为全连接层,通过一定规则的计算(也可能为卷积计算)得到结果。
我们把卷积层、池化层等中间层统一称为隐层。接下来深入了解每个层的含义来加深对CNN的理解。
• 卷积层与权值共享
按照生物学神经元数据处理机制,每个神经元需要与前一层连接,用于特征提取,如下图所示,假设神经元数量为100万,那么对于100万像素的图像将建立1012个连接,这里面的权值的数量是非常大的。
那么如何解决大量的权值计算(参数爆炸)问题呢?大开一下脑洞,我们做两个假设:
1)减少每个神经元(对应隐层像素)的作用范围,比如设为10*10,仅和局部的100个像素建立局部连接;
参数简化: 100(连接权值)*1M(神经元个数)
2)所有神经元采用同一组权值进行计算,对应CNN就是用同一个卷积核去卷积图像,这就是权值共享。
参数简化: 100(权值)
没错,我们只需要100个参数就建立了两层之间的连接,这靠谱吗?相信第一点很好理解,每个神经元是独立工作的,问题在于第二点,权值共享 这个玩笑开的确实有点大。
事实上从生物学上解释,神经元确实是分类的,有的对边缘敏感,有的对亮度敏感,还有的感应颜色,每一类神经元的参数是近似一致的。
想通了吗?关键就在于“分类”,每一类神经元对应一组权值,怕种类不够?
那就用100个卷积核来描述100种神经元。
对于上面的例子,不同的卷积核如右图所示,我们得到最终的参数个数:
参数简化: 100(权值)*100(卷积核)
我们用1万个权值的卷积计算,近似模拟了神经元的处理过程,这个数量级的参数对于计算机来讲并不算多,特别是对于卷积这种已经能够做GPU并行计算的方法,这就是卷积的魅力。
• 池化
池化(降采样)较为容易理解,获取一个区域内的典型特征,比如n*n像素范围的像素最大值或平均值,其意义在于能够对输入进行抽象描述,对特征进行降维。
一般来讲,对于输入的池化区域都是分块处理的,与卷积的区别在于块之间一般不重叠,这样就保证了信息能够更快的抽象,抽象的价值在于提取里面的“显著特征”,而忽略“细节特征”。
常用的两种池化方法:
1)最大值池化,应用最多,能够有效减少卷积层带来的均值偏差,对纹理特征的适应较好;
2)平均值池化,对卷积结果进一步平滑,纹理和边缘特征容易丢失,但能有效避免噪声。
• 激活层
神经网络真正的代表作出场了,在第一节已做过专题讲解,激活层 真正反映了神经元的工作机制,可以说是神经网络的精髓。
在CNN中被广泛采用的ReLU函数有效解决了梯度扩散问题,你可以不必太在意“稀疏”,你可以忘掉“逐层预训练”,总结一句话那就是“激活函数的一小步,深度学习的一大步”。
激活层一般添加在卷积层或者池化层之后,没有明确的位置定义,一般对于简单的网络来讲,激活层通常可以不添加。
• Dropout层
这个问题的提出源于神经网络的另一个大缺陷-“过拟合”,对应于前面导致“梯度扩散”问题的欠拟合。
常规解决“过拟合”问题的方法是模型平均,通过训练多个网络进行加权组合来进行规避,这样带来的问题是更大的计算量。
Dropout方法最早由Hinton大神提出,针对一次训练过程,网络中的神经元节点按照一定的概率进行权值更新,也就是说,神经元有可能仅保留权值参数,下一个训练过程再更新。
按照一定的随机策略,使每一次训练的神经元并不相同,也就是说神经元节点轮流工作,这种随机过程又向人脑前进了一步。
每一次的Dropout相当于对网络做了一次简化(如上图所示),仅简化后的网络节点参与权值更新,整个训练过程中多次Dropout,每个节点都参与了训练和学习,当然偶尔也“翘个班”,过程很简单,为什么能得到好的效果呢?我们来分析一下:
1)“天天大鱼大肉,顿顿鲍鱼龙虾”,偶尔吃个方便面吧,想想都嘚瑟,这个小调剂的效果出奇的好;
2)班上一共20个学生,老师每次选择回答问题的都是那几个优秀的学生,Dropout避免了训练结果对某些节点的强依赖(权重过大);
作者倾向于从遗传学的角度来进行解释,不同的基因组合方式能提高对于环境的适应能力,“优胜劣汰”的进化概率更高。
3)Dropout也可以理解为一种平均模型,区别在于,通过在多Step之间进行平均代替多个模型的组合。
不管从哪个角度进行理解,Dropout本身都是直观有效的,这里面虽然没有严谨的数学公式推导,但源于生物学的直观理解,以及大量的实验足以证明。
就好像有人问我深度学习为什么会有这么好的效果,为什么就能有效收敛?什么理论避免陷入局部最大值?我们对于某些问题的认知仅仅在这个层面上而已,有时候不需要纠结,能解决问题就可以了,至于其背后隐晦的林林种种,So What?
• 全连接层
全连接层直观理解为简化的数据计算,其意义在于求解,对于网络本身的贡献值是比较低的,大多数情况下,全连接层放在网络最后面,有时也会被省略,这里不做过多解释,大家看到的时候能知道干什么的就行了。
• 回归层
回归层理论上不属于CNN的一部分,当然也有人将其合并到网络,或者说也可以看作是全连接层的一部分,anyway,我们只是在这里将过程穿起来而已。
回归是个比较熟悉的概念,前面讲过的逻辑回归、高斯回归等都属于回归,说白了回归就是对特征进行分类,可以分两类,也可以分多类。
回归的作用也只是分类而已,你可以用最简单的SVM分类器进行分类,也可以采用复杂的多类划分,比如Softmax。Softmax是逻辑回归模型在多分类问题上的推广,本质上是将一个P维向量映射成另一个K维向量,其公式描述为:
得到对应的类别代表的概率,这个概率正是我们要的分类结果。
参考博客
深度学习笔记之CNN(卷积神经网络)基础的更多相关文章
- TensorFlow 2.0 深度学习实战 —— 浅谈卷积神经网络 CNN
前言 上一章为大家介绍过深度学习的基础和多层感知机 MLP 的应用,本章开始将深入讲解卷积神经网络的实用场景.卷积神经网络 CNN(Convolutional Neural Networks,Conv ...
- tensorflow学习笔记——图像识别与卷积神经网络
无论是之前学习的MNIST数据集还是Cifar数据集,相比真实环境下的图像识别问题,有两个最大的问题,一是现实生活中的图片分辨率要远高于32*32,而且图像的分辨率也不会是固定的.二是现实生活中的物体 ...
- SIGAI深度学习第八集 卷积神经网络2
讲授Lenet.Alexnet.VGGNet.GoogLeNet等经典的卷积神经网络.Inception模块.小尺度卷积核.1x1卷积核.使用反卷积实现卷积层可视化等. 大纲: LeNet网络 Ale ...
- SIGAI深度学习第七集 卷积神经网络1
讲授卷积神经网络核心思想.卷积层.池化层.全连接层.网络的训练.反向传播算法.随机梯度下降法.AdaGrad算法.RMSProp算法.AdaDelta算法.Adam算法.迁移学习和fine tune等 ...
- 深度学习原理与框架-卷积神经网络-cifar10分类(图片分类代码) 1.数据读入 2.模型构建 3.模型参数训练
卷积神经网络:下面要说的这个网络,由下面三层所组成 卷积网络:卷积层 + 激活层relu+ 池化层max_pool组成 神经网络:线性变化 + 激活层relu 神经网络: 线性变化(获得得分值) 代码 ...
- TensorFlow深度学习实战---图像识别与卷积神经网络
全连接层网络结构:神经网络每两层之间的所有结点都是有边相连的. 卷积神经网络:1.输入层 2.卷积层:将神经网络中的每一个小块进行更加深入地分析从而得到抽象程度更高的特征. 3 池化层:可以认为将一张 ...
- 深度学习原理与框架-卷积神经网络基本原理 1.卷积层的前向传播 2.卷积参数共享 3. 卷积后的维度计算 4. max池化操作 5.卷积流程图 6.卷积层的反向传播 7.池化层的反向传播
卷积神经网络的应用:卷积神经网络使用卷积提取图像的特征来进行图像的分类和识别 分类 相似图像搜索 ...
- 深度学习-使用cuda加速卷积神经网络-手写数字识别准确率99.7%
源码和运行结果 cuda:https://github.com/zhxfl/CUDA-CNN C语言版本参考自:http://eric-yuan.me/ 针对著名手写数字识别的库mnist,准确率是9 ...
- Tensorflow学习笔记3:卷积神经网络实现手写字符识别
# -*- coding:utf-8 -*- import tensorflow as tf from tensorflow.examples.tutorials.mnist import input ...
随机推荐
- js检测对象是否是数组
js检测对象是否是数组 可以通过instanceof 方法一. var arr=[] arr instanceof Array //true var obj={} obj instanceof A ...
- nodejs实现网站数据的爬取
// 引入https模块,由于我们爬取的网站采用的是https协议 const https = require('https'); // 引入cheerio模块,使用这个模块可以将爬取的网页源代码进行 ...
- Day02:我的Python学习之路
1.初识模块 Python的强大之处在于他有非常丰富和强大的标准库和第三方库,现在简单的学习2个常见的标准库——sys和os. (1)系统的标准库sys # Author:GCL # 系统的标准库sy ...
- viva correction statements
* List of amendments| No. | Location | Amendments ...
- 微信小程序显示cms里的html文章
首先在cms模版中将html文章转化为json数据,识别图片,文本和换行,过滤掉样式和标签.这里是用PHP的正则表达式函数来实现的,$content是cms里的html文章. <?php $_a ...
- ASP.NET Core on K8S学习初探(1)K8S单节点环境搭建
当近期的一个App上线后,发现目前的docker实例(应用服务BFF+中台服务+工具服务)已经很多了,而我司目前没有专业的运维人员,发现运维的成本逐渐开始上来,所以容器编排也就需要提上议程.因此我决定 ...
- AI Gossip
本文作者:七牛云人工智能实验室-林亦宁原文地址:https://zhuanlan.zhihu.com/p/26168331 什么是智能 回到几万年前的东非大草原,谁能意识到,那个到处被欺负的,被表哥从 ...
- 在Ignite中使用线性回归算法
在本系列前面的文章中,简单介绍了一下Ignite的机器学习网格,下面会趁热打铁,结合一些示例,深入介绍Ignite支持的一些机器学习算法. 如果要找合适的数据集,会发现可用的有很多,但是对于线性回归来 ...
- 使现有的VSCode成为便携版(绿色版)
VSCode可以说是各种代码编辑器前端之中的神器了,相对体积小且扩展性强,我们希望将它携带在U盘中在各种工作环境中使用,官方也提供了在Windows,Linux和MacOS三大平台中使VSCode便携 ...
- UITextInputMode currentInputMode is deprecated. 警告的解决
如果你的工程最低支持版本为7.0 你会发现有警告 : 'currentInputMode' is deprecated: first deprecated in iOS 7.0 替换方案:UIText ...