DeepLearning.ai学习笔记(四)卷积神经网络 -- week2深度卷积神经网络 实例探究
一、为什么要进行实例探究?
通过他人的实例可以更好的理解如何构建卷积神经网络,本周课程主要会介绍如下网络
- LeNet-5
- AlexNet
- VGG
- ResNet (有152层)
- Inception
二、经典网络
1.LeNet-5
该网络主要针对灰度图像训练的,用于识别手写数字。

该网络是在1980s提出的,当时很少用到Padding,所以可以看到随着网络层次增加,图像的高度和宽度都是逐渐减小的,深度则不断增加。
另外当时人们会更倾向于使用Average Pooling,但是现在则更推荐使用Max Pooling。
还有就是最后的预测没有使用softmax,而是使用了一般的方法
2. AlexNet

AlexNet其实和LetNet-5有很多相似的地方,如大致的网络结构。不同的地方主要有如下:
- 激活函数使用的是Relu,最后一层使用的是Softmax
- 参数更多,有6000万个参数,而LeNet-5只有6万个左右
- 使用Max Pooling
3.VGG-16

这个网络有点牛逼了,因为它有将近1.38亿个参数,即使放到现在也是一个很大的网络,但是这个网络的结构并不复杂。下面主要介绍一下上图网络。
首先该网络使用的是Same卷积,即保证高度和宽度不变,另外因为总共有16层卷积操作,所以就不把每一层都用图像的方式表现出来了,例如[CONV 64 X2]表示的是用64个过滤器进行Same卷积操作2次,即右上角所画的示意图,(224,224,3) -> (224,224,64) -> (224,224,64)
上面三个是比较经典的网络,如果想深入的理解,可以阅读其论文,不过吴大大建议的阅读顺序是AlexNet->VGG->LeNet。
三、残差网络(Residual Network)
视频开始,吴大大表示“非常深的网络是很难训练的,因为存在梯度消失和梯度爆炸的问题”,为了解决这个问题,引入了(跳远链接)Skip Connection(跳远链接),残差网络正是使用了这个方法。
- 残差块(Residual Block)
首先介绍组成残差网络的单元:残差块(Residual Block),如下图示:

残差块是由两层网络节点组成的,\(a^{[l]}\)经过线性变化,再通过Relu激活函数后得到\(a^{[l+1]}\),\(a^{[l+2]}\)也同理,具体过程如下图示:

特别注意上图中的紫色线连接,\(a^{[l]}\)通过这条线直接将数据传递给\(a^{[l+2]}\),所以\(a^{[l+2]}=g(z^{[l+1]}+a^{[l]})\),这条紫色线也叫作short cut(或skip connection)
- 残差网络

如图示,残差网络每两层网络节点组成一个残差块,这也就是其与普通网络(Plain Network)的差别。
结合之前的课程我们知道如果使用普通网络训练模型,训练误差会随着网络层次加深先减小,而后会开始增加,而残差网络则不会有这种情况,反而它会随着层次增加,误差也会越来越小,这与理论相符。
四、残差网络为什么有用?
为了直观解释残差网络为什么有用,假设我们已经通过一个很大的神经网络得到了\(a^{[l]}\)。而现在我们又需要添加两层网络进去,我们看看如果添加的是残差块会有什么效果。如下图示:

由残差块的特点我们知道\(a^{[l+2]}=g(z^{[l+1]}+a^{[l]})=g(W^{[l+1]}a^{[l]}+b^{[l+1]}+a^{[l]})\)。
我们先考虑一个极端情况,即\(W^{[l+1]}=0,b^{[l+1]}=0\),那么\(a^{[l+2]}=g(a^{[l]})=a^{[l]}\) (因为激活函数是Relu),所以在添加了额外的两层网络后,即使最坏情况也是保持和之前结果一样。而如果只是加上普通的两层网络,可能结果会更好,但是也很有可能结果会越来越糟糕,这也就是为什么残差网络能够保证深度网络依旧有用的原因了。
另外有个问题需要注意的是各层网络的维度,因为\(a^{[l+2]}=g(z^{[l+1]}+a^{[l]})\),那么就要求\(z^{[l+1]}\)要和\(a^{[l]}\)保持相同的维度所以残差网络使用的是Same卷积。
但是如果唯独不一样也没关系,可以给\(a^{[l]}\)乘上一个\(W_s\)来保持相同维度。\(W_s\)的值可以通过学习获得
五、网络中的网络以及1*1卷积
1*1卷积乍看起来好像很没用,如下图

但是如果这个1*1的卷积有深度呢?

说个更加直观的理解就是使用1*1卷积可以很方便的减少深度,而不改变高度和宽度,如下图所示:

只需要用32个(1*1*192)的过滤器即可,如果不用1*1卷积,例如采用2*2卷积,要想实现只改变深度,那么还需要使用padding,相比起来更加麻烦了。
六、Inception网络简介
- 简介

如上图示,我们使用了各种过滤器,也是用了Max Pooling。但是这些并不需要人工的选择其个数,这些都可以通过学习来确定下来。所以这种方法很好的帮助我们选择何种过滤器的问题,这也就是Inception网络。
- 计算成本
但是需要注意的一点则是随之而来的计算成本,尤其是5*5的过滤器,下面以这个过滤器举例进行说明:

如上图示,使用32个5*5*192的过滤器,对(28,28,192)进行Same卷积运算得到(28,28,32)的输出矩阵,该卷积需要执行的乘法运算有多少次呢?
输出矩阵中的一个数据是经过 \(5*5*192\)次乘法得到的,那么总共的乘法运算次数则是\(5*5*192*28*28*32=\)1.2亿
- 瓶颈层(Bottleneck layer)
上面的运算次数多大1.2亿次,运算量相当之大,因此有另一种网络结构对此进行优化,而且可以达到同样的效果,即采用1*1卷积

如图示进行了两次卷积,我们计算一下总共的乘法次数。
第一次卷积:\(28*28*16*192=\)2.4million
第二次卷积:\(28*28*32*5*5*16=\)10million
总共乘法次数是12.4million,这与上面直接用5*5过滤器的运算次数整整少了十倍。
七、Inception网络


八、使用开源的实现方案
这一节主要介绍了如何使用github,这里不做详细记录了。
九、迁移学习
简单说就是在他人的基础上实现自己想要的模型,举个栗子,假如我们现在需要识别家里养的两只猫,分别叫小花和小白,但是我们只有比较少的图片。辛运的是网上已经有一个已经训练好的模型,是用来区分1000个不同事物的(包括猫),其网络模型如下:

我们的需求是最后结果有三种:是小花,是小白,都不是。所以需要对softmax做如下图修改。另外由于数据较少,所以可以对他人的模型的前面的结构中的参数进行冻结,即权重和偏差不做改动。

当然,如果我们有一定量的数据,那么freeze的范围也可以随之减少,即拿来训练的层次可以增多

十、数据扩充
1.Common augmentation methods
- 旋转(rotation)
- 修剪(shearing)
- 局部变形(local warping)
- 镜像(mirroring)

2.Color shifting
我们都知道图像是由RGB三种颜色构成的,所以该数据扩充方法常采用PCA color augmentation,即假如一个图片的R和G成分较多,那么该算法则会相应的减少R,G的值,而增加B的值

DeepLearning.ai学习笔记(四)卷积神经网络 -- week2深度卷积神经网络 实例探究的更多相关文章
- DeepLearning.ai学习笔记(三)结构化机器学习项目--week2机器学习策略(2)
一.进行误差分析 很多时候我们发现训练出来的模型有误差后,就会一股脑的想着法子去减少误差.想法固然好,但是有点headlong~ 这节视频中吴大大介绍了一个比较科学的方法,具体的看下面的例子 还是以猫 ...
- DeepLearning.ai学习笔记汇总
第一章 神经网络与深度学习(Neural Network & Deeplearning) DeepLearning.ai学习笔记(一)神经网络和深度学习--Week3浅层神经网络 DeepLe ...
- DeepLearning.ai学习笔记(四)卷积神经网络 -- week4 特殊应用:人力脸识别和神经风格转换
一.什么是人脸识别 老实说这一节中的人脸识别技术的演示的确很牛bi,但是演技好尴尬,233333 啥是人脸识别就不用介绍了,下面笔记会介绍如何实现人脸识别. 二.One-shot(一次)学习 假设我们 ...
- DeepLearning.ai学习笔记(四)卷积神经网络 -- week3 目标检测
一.目标定位 这一小节视频主要介绍了我们在实现目标定位时标签该如何定义. 上图左下角给出了损失函数的计算公式(这里使用的是平方差) 如图示,加入我们需要定位出图像中是否有pedestrian,car, ...
- Deep Learning.ai学习笔记_第四门课_卷积神经网络
目录 第一周 卷积神经网络基础 第二周 深度卷积网络:实例探究 第三周 目标检测 第四周 特殊应用:人脸识别和神经风格转换 第一周 卷积神经网络基础 垂直边缘检测器,通过卷积计算,可以把多维矩阵进行降 ...
- DeepLearning.ai学习笔记(四)卷积神经网络 -- week1 卷积神经网络基础知识介绍
一.计算机视觉 如图示,之前课程中介绍的都是64* 64 3的图像,而一旦图像质量增加,例如变成1000 1000 * 3的时候那么此时的神经网络的计算量会巨大,显然这不现实.所以需要引入其他的方法来 ...
- DeepLearning.ai学习笔记(二)改善深层神经网络:超参数调试、正则化以及优化--Week2优化算法
1. Mini-batch梯度下降法 介绍 假设我们的数据量非常多,达到了500万以上,那么此时如果按照传统的梯度下降算法,那么训练模型所花费的时间将非常巨大,所以我们对数据做如下处理: 如图所示,我 ...
- DeepLearning.ai学习笔记(一)神经网络和深度学习--Week3浅层神经网络
介绍 DeepLearning课程总共五大章节,该系列笔记将按照课程安排进行记录. 另外第一章的前两周的课程在之前的Andrew Ng机器学习课程笔记(博客园)&Andrew Ng机器学习课程 ...
- DeepLearning.ai学习笔记(五)序列模型 -- week2 自然语言处理与词嵌入
一.词汇表征 首先回顾一下之前介绍的单词表示方法,即one hot表示法. 如下图示,"Man"这个单词可以用 \(O_{5391}\) 表示,其中O表示One_hot.其他单词同 ...
随机推荐
- Hibernate学习(二补充)关系映射----基于外键的双向一对一
刚刚写的是基于外键的单向一对一. 那么双向一对一就是在单向一对一的基础上稍微改动就可以了. account.java和account.hbm.xml都不用变动 只要我们小小的变动address.j ...
- 巧用CAS解决数据一致性问题
缘起:在高并发的分布式环境下,对于数据的查询与修改容易引发一致性问题,本文将分享一种非常简单但有效的优化方法. 一.业务场景 业务场景为,购买商品的过程要对余额进行查询与修改,大致的业务流程如下: ( ...
- MyBatis_动态SQL
一.动态SQL 动态SQL,主要用于解决查询条件不确定的情况:在程序运行期间,根据提交的查询条件进行查询. 动态SQL,即通过MyBatis提供的各种标签对条件作出判断以实现动态拼接SQL语句. 二. ...
- springboot整合redis
springboot-整合redis springboot学习笔记-4 整合Druid数据源和使用@Cache简化redis配置 一.整合Druid数据源 Druid是一个关系型数据库连接池,是阿 ...
- MongoDB的CURD命令
1.启动客户端 在MongDB服务成功启动的情况下,打开cmd,在MongDB的bin文件目录下执行MongDB命令 可以看到MongDB版本号3.0.7与默认连接的数据库test.test数据库是系 ...
- 【java】反射简单示例
package 反射; public class Test反射 { public static void main(String[] args) { System.out.println(Runtim ...
- JaveScript运算符(JS知识点归纳三)
JaveScript中有许多的运算符,在这里就只说明一些需要注意的. 01 一元运算符 一元:指的是参与运算的操作数只有一个 最经常使用的是++ -- 计算规则: ++/-- 前置于操作数的时候 ...
- iOS cocos2d安装以及问题解决
一:下载: 首先要去Cocos2d和Cocos2d-x网站下载相关的工具: 1.Cocos2d下载地址:http://www.cocos2d-iphone.org,然后进入Download页面,下边有 ...
- Docker(五):Docker高级网络配置
1.容器跨主机多子网方案 网络设计如下: 主机1:10.110.52.38 容器1: 192.168.0.1 vlan1 容器2: 192.168.0.2 vlan2 主机2:10.110.52.66 ...
- sar 命令详解
sar (System Activity Reporter)命令是LInux下系统运行状态统计工具, 它将指定的操作系统状态计数器显示到标准输出设备. sar 工具将对系统当前的状态进行取样,然后通过 ...