《深度学习入门-基于Python的理论与实现》第七章带读 -- CNN介绍
《深度学习入门-基于Python的理论与实现》第七章带读 – CNN介绍
文章目录
- 《深度学习入门-基于Python的理论与实现》第七章带读 -- CNN介绍
- @[toc]
- 7.1 整体结构
- 7.2 卷积层
- a.全连接层存在的问题
- b.卷积运算
- c.填充
- d.步幅
- e.三维数组的卷积运算
- 7.3 池化层
- a.池化层的介绍
- b.池化层的特征
- 7.4 具有代表性的CNN网络
- a.LeNet
- b.AlexNet
- 7.5 小结
- 开篇介绍:《深度学习入门-基于Python的理论与实现》书籍介绍
- 第一章:《深度学习入门-基于Python的理论与实现》第一章带读
- 第二章:《深度学习入门-基于Python的理论与实现》第二章带读 – 感知机
- 第三章:深度学习入门-基于Python的理论与实现》第三章带读 – 神经网络
- 第四章:《深度学习入门-基于Python的理论与实现》第四章带读 – 神经网络的学习
- 第五章:《深度学习入门-基于Python的理论与实现》第五章带读 – 误差反向传播
- 第六章:《深度学习入门-基于Python的理论与实现》第六章带读 – 训练方法介绍
在第六章,我们介绍了深度学习模型训练过程中非常重要的一些技巧,包含了:
- 如何更新模型的参数
- 如何初始化需要的权重
- Batch Normalization
- 正则化处理
- 超参数验证
本章,我们一起看看深度学习中非常重要的一个模型:卷积神经网络(Convolutional Neural Network,CNN) ,其被广泛用于图像识别、语音识别等领域。
7.1 整体结构
CNN网络在之前神经网络的基础上,增加了卷积层 (Convolution层)和池化层(Pooling层)。我们先来看看之前基于全连接层(Affine层)的神经网络图:
基于CNN的网络的例子:新增了Convolution层和Pooling层(用灰色的方块表示):
对比发现,CNN中新增了 Convolution 层和 Pooling 层。CNN中层的连接顺序是“Convolution - ReLU - ( Pooling) ”(Pooling 层有时会被省略)。这可以理解为之前的“Affine - ReLU” 连接被替换成了“Convolution - ReLU - ( Pooling) ”连接。
除此之外,CNN中,靠近输出的层中使用了之前 的“Affine - ReLU” 组合。还有,最后的输出层中使用了之前的“Affine Softmax” 组合。
7.2 卷积层
a.全连接层存在的问题
问题:数据的形状被“忽视”了。
如:前面提到的使用了 MNIST 数据集的例子中,输入图像就是 1 通道、高 28 像素、长 28 像素 的(1, 28, 28)形状,但却被排成1列,以784个数据的形式输入到最开始的 Affine层。
基于以上问题,我们需要找出一种方法,既可以学习到需要的特征,又保持形状相关的信息。而卷积层就可以满足这个需求。
接下来,我们看看卷积层是如何进行运算的。
b.卷积运算
卷积层进行的处理就是卷积运算。卷积运算相当于图像处理中的“滤波器运算”。
卷积层运算结果:
计算过程:
通过,最后内容 = 矩阵对应位置*滤波器
15 =
12+20+31+00+11+22+31+00+1*2 =
2+3+1+4+3+2
最后在上内容中增加偏置:
c.填充
在进行卷积层的处理之前,有时要向输入数据的周围填入固定的数据(比如0等),这称为填充(padding),是卷积运算中经常会用到的处理。
卷积运算的填充处理如下图:向输入数据的周围填入0(图中用虚线表示填充,并省略了填充的内容"0”)
为什么要进行padding呢?
使用填充主要是为了调整输出的大小。比如,对大小为(4, 4)的输入数据应用(3, 3)的滤波器时,输出大小变为(2, 2),相当于输出大小 比输入大小缩小了2个元素。这在反复进行多次卷积运算的深度网络中会成为问题。
为什么呢?因为如果每次进行卷积运算都会缩小空间,那么在某个时刻输出大小就有可能变为1,导致无法再应用卷积运算。为了避免出现这样的情况,就要使用填充。在刚才的例子中,将填充的幅度设为1,那么相对于输入大小(4, 4), 输出大小也保持为原来的(4, 4)。因此,卷积运算就可以在保持空间大小不变的情况下将数据传给下一层。
d.步幅
应用滤波器的位置间隔称为步幅(stride)。之前的例子中步幅都是1,如果将步幅设为2,则如图所示,应用滤波器的窗口的间隔变为2个元素。
根据之前观察,我们发现:增大步幅后,输出大小会变小。而增大填充后,输出大小会变大。
具体他们之间会有什么关系呢?
假设输入大小为(H, W),滤波器大小为(FH, FW),输出大小为 (OH, OW),填充为P,步幅为S。此时,输出大小可通过式(7.1)进行计算。
e.三维数组的卷积运算
之前卷积运算的例子都是以有高、长方向的2维形状为对象的。但是,图像是3维数据,除了高、长方向之外,还需要处理通道方向(一般黑白图片为1通道,彩色图片为3通道)。
3通道数据计算结果:
3通道数据计算过程:
通过每个通道分别计算,最后进行求和。
7.3 池化层
a.池化层的介绍
池化层的目的是:缩小高、长方向上的空间的运算。
一般有最大池化和平均池化。
- 最大池化:从目标区域中取出最大值
- 平均池化:计算目标区域的平均值
举例:按照步幅2进行2*2的最大池化处理顺序:
b.池化层的特征
没有要学习的参数
- 池化只是从目标区域中取最大值(或者平均值),所以不存在要学习的参数。
通道数不发生变化
- 经过池化运算,输入数据和输出数据的通道数不会发生变化。计算是按通道独立进行的。
- 经过池化运算,输入数据和输出数据的通道数不会发生变化。计算是按通道独立进行的。
对微小的位置变化具有鲁棒性(健壮)
- 输入数据发生微小偏差时,池化仍会返回相同的结果。因此,池化对输入数据的微小偏差具有鲁棒性。
7.4 具有代表性的CNN网络
前面我们介绍了CNN中的卷积层和池化层,其实如果堆叠了多层卷积层,则随着层次加深,提取的信息也愈加复杂、抽象,这是深度学习中很有意思的一个地方。最开始的层对简单的边缘有响应,接下来的层对纹理有响应,再后面的层对更加复杂的物体部件有响应。也就是说,随着层次加深,神经元从简单的形状向“高级”信息变化。换句话说,就像我们理解东西的“含义”一样,响应的对象在逐渐变化。
如下图:CNN的卷积层中提取的信息。第1层的神经元对边缘或斑块有响应,第3层对纹理有响应,第5层对物体部件有响应,最后的全连接层对物体的类别(狗或车)有响应。
关于CNN,迄今为止已经提出了各种网络结构。这里,我们介绍其中特别重要的两个网络,一个是在1998年首次被提出的CNN元祖LeNet , 另一个是在深度学习受到关注的2012年被提出的AlexNet。
a.LeNet
LeNet在1998年被提出,是进行手写数字识别的网络。如下图,它有连续的卷积层和池化层(正确地讲,是只“抽选元素”的子采样层),最后经全连接层输出结果。
和“现在的CNN”相比, LeNet有几个不同点。
- 第一个不同点在于激活函数。LeNet 中使用sigmoid 函数,而现在的 CNN 中主要使用 ReLU 函数。
- 此外,原始的LeNet中使用子采样(subsampling)缩小中间数据的大小,而 现在的CNN中Max池化是主流。
b.AlexNet
AlexNet是引发深度学习热潮的导火线,不过它的网络结构和LeNet基本上没有什么不同.
AlexNet叠有多个卷积层和池化层,最后经由全连接层输出结果。虽然结构上AlexNet和LeNet没有大的不同,但有以下几点差异:
- 激活函数使用ReLU。
- 使用进行局部正规化的LRN(Local Response Normalization)层。
- 使用Dropout。
7.5 小结
这一章中主要介绍了CNN,以及卷积层和池化层。同时我们在其基础上又介绍了LeNet和AlexNet两个网络。本章中的难点是卷积层和池化层的理解。
书籍下载链接:https://pan.baidu.com/s/1goHhf2GZt0gxxbLXa42CmA
密码: 4vi2
欢迎微信搜索关注微信公众号【布道NLP】获取更多AI相关资料和知识。
《深度学习入门-基于Python的理论与实现》第七章带读 -- CNN介绍相关推荐
- 深度学习入门基于Python的理论与实现_第一章_Python入门(原创笔记)
前言 此书使用Python作为编程语言,尽可能地少使用外部库,从零开始实现深度学习的程序. 此书从简单的机器学习问题开始,最终实现一个能高精度地识别图像的系统. 此书以图像识别为主题,主要学习使用深度 ...
- 深度学习入门 基于Python的理论与实现
作者:斋藤康毅 出版社:人民邮电出版社 品牌:iTuring 出版时间:2018-07-01 深度学习入门 基于Python的理论与实现
- 《深度学习入门——基于Python的理论与实现》笔记
PS:写这篇博客主要是记录下自己认为重要的部分以及阅读中遇到的些问题,加深自己的印象. 附上电子书及源代码: 链接:https://pan.baidu.com/s/1f2VFcnXSSK-u3wuvg ...
- 深度学习入门-基于Python的理论入门与实现源代码加mnist数据集下载推荐
深度学习入门-基于Python的理论入门与实现源代码加mnist数据集下载推荐 书籍封面 1-图灵网站下载 书里也说了,可以图灵网站下载https://www.ituring.com.cn/book/ ...
- 《深度学习入门-基于Python的理论与实现》学习笔记1
<深度学习入门-基于Python的理论与实现>学习笔记1 第一章Python入门 Python是一个简单.易读.易记的编程语言,可以用类似于英语的语法进行编写程序,可读性高,且能写出高性能 ...
- 《深度学习入门--基于python的理论与实现》——斋藤康毅读书笔记
<深度学习入门--基于python的理论与实现>读书笔记(第二章) 写在前面 第二章:感知机 2.1感知机是什么 2.2简单的逻辑电路 2.2.1与门(and gate) 2.2.2与非门 ...
- python从入门到精通 邮电出版社_《人民邮电出版社Python深度学习入门:基于PYTHON的理论与实现》【价格 目录 书评 正版】_中国图书网...
译者序 xiii 前言 xv 第 1 章 Python入门 1 1.1 Python是什么 1 1.2 Python的安装 2 1.2.1 Python版本 2 1.2.2 使用的外部库 2 1.2. ...
- 《深度学习入门——基于Python的理论与实现》斋藤康毅学习笔记(二)
第二章 感知机 1逻辑门 错误:python 出现的异常 inconsistent use of tabs and spaces in indentation 意思是:在缩进中不一致地使用制表符和空格 ...
- 深度学习入门-基于Python的理论与实现-斋藤康毅(待续)
神经网络的学习 损失函数 一般用均方误差和交叉熵误差函数 均方误差: 交叉熵误差函数: 基于im2col展开 因为老实做卷积,会有很多for循环,而且很慢 所以用im2col函数来避免使用for循环 ...
- 《深度学习入门——基于Python的理论与实现》斋藤康毅学习笔记(一)
第一章 (只将自己有疑惑并得到解决的学习内容作以下笔记) 1.python解释器 1.1数组 错误:a[ : -1] 不是获取所有元素 修改:a[ : -1]表示获取从第一个元素到最后一个元素之间的元 ...
最新文章
- FPGA实现序列检测(训练testbench写法)
- Spring容器中获取Bean实例的七种方式(附实战源码)
- Jenkins中安装Credentials Binding插件时提示:Failed to load: SSH Credentials Plugin (1.18.2),Jenkins(2.282)or
- 简练软考知识点整理-规划风险应对
- 关于Android 中 一个错误的解决办法 “Do not request Window.FEATURE_ACTION_BAR.....
- 每天一道LeetCode-----在给定序列中找到满足nums[i]nums[i-1]nums[i]nums[i+1]的位置,要求时间复杂度是O(logN)
- 360 自动打开word_Word文档高手的组合键用法,你知道几个?
- 基于MATLAB的Sobel边缘检测算法实现
- QPS 提升60%,揭秘阿里巴巴轻量级开源 Web 服务器 Tengine 负载均衡算法
- 从事测试的第6年 , 开工第二天五千字总结..我不平凡的2021
- idea代码格式化的自定义
- 坚持努力,在黑暗中寻找光明——我的2014
- 动态电路中的动态元件——电容和电感
- Java计算当前时间,结合时区
- vue中使用vue-pdf插件显示pdf
- 裸金属服务器能降级虚拟机不,裸金属服务器属于虚拟机吗
- 数据服务 开源方案技术选型
- Python:警告 的11种情况
- python绘制常用的概率分布曲线
- 最近论文汇总:Squeeze-and-Excitation Networks