红色石头的个人网站:redstonewill.com

《Convolutional Neural Networks》是Andrw Ng深度学习专项课程中的第四门课。这门课主要介绍卷积神经网络(CNN)的基本概念、模型和具体应用。该门课共有4周课时,所以我将分成4次笔记来总结,这是第2节笔记。

1. Why look at case studies

本周课程将主要介绍几个典型的CNN案例。通过对具体CNN模型及案例的研究,来帮助我们理解知识并训练实际的模型。

典型的CNN模型包括:

  • LeNet-5

  • AlexNet

  • VGG

除了这些性能良好的CNN模型之外,我们还会介绍Residual Network(ResNet)。其特点是可以构建很深很深的神经网络(目前最深的好像有152层)。

另外,还会介绍Inception Neural Network。接下来,我们将一一讲解。

2. Classic Networks

LeNet-5模型是Yann LeCun教授于1998年提出来的,它是第一个成功应用于数字识别问题的卷积神经网络。在MNIST数据中,它的准确率达到大约99.2%。典型的LeNet-5结构包含CONV layer,POOL layer和FC layer,顺序一般是CONV layer->POOL layer->CONV layer->POOL layer->FC layer->FC layer->OUTPUT layer,即y^y^\hat y。下图所示的是一个数字识别的LeNet-5的模型结构:

该LeNet模型总共包含了大约6万个参数。值得一提的是,当时Yann LeCun提出的LeNet-5模型池化层使用的是average pool,而且各层激活函数一般是Sigmoid和tanh。现在,我们可以根据需要,做出改进,使用max pool和激活函数ReLU。

AlexNet模型是由Alex Krizhevsky、Ilya Sutskever和Geoffrey Hinton共同提出的,其结构如下所示:

AlexNet模型与LeNet-5模型类似,只是要复杂一些,总共包含了大约6千万个参数。同样可以根据实际情况使用激活函数ReLU。原作者还提到了一种优化技巧,叫做Local Response Normalization(LRN)。 而在实际应用中,LRN的效果并不突出。

VGG-16模型更加复杂一些,一般情况下,其CONV layer和POOL layer设置如下:

  • CONV = 3x3 filters, s = 1, same

  • MAX-POOL = 2x2, s = 2

VGG-16结构如下所示:

VGG-16的参数多达1亿3千万。

3. ResNets

我们知道,如果神经网络层数越多,网络越深,源于梯度消失和梯度爆炸的影响,整个模型难以训练成功。解决的方法之一是人为地让神经网络某些层跳过下一层神经元的连接,隔层相连,弱化每层之间的强联系。这种神经网络被称为Residual Networks(ResNets)。

Residual Networks由许多隔层相连的神经元子模块组成,我们称之为Residual block。单个Residual block的结构如下图所示:

上图中红色部分就是skip connection,直接建立a[l]a[l]a^{[l]}与a[l+2]a[l+2]a^{[l+2]}之间的隔层联系。相应的表达式如下:

z[l+1]=W[l+1]a[l]+b[l+1]z[l+1]=W[l+1]a[l]+b[l+1]

z^{[l+1]}=W^{[l+1]}a^{[l]}+b^{[l+1]}

a[l+1]=g(z[l+1])a[l+1]=g(z[l+1])

a^{[l+1]}=g(z^{[l+1]})

z[l+2]=W[l+2]a[l+1]+b[l+2]z[l+2]=W[l+2]a[l+1]+b[l+2]

z^{[l+2]}=W^{[l+2]}a^{[l+1]}+b^{[l+2]}

a[l+2]=g(z[l+2]+a[l])a[l+2]=g(z[l+2]+a[l])

a^{[l+2]}=g(z^{[l+2]}+a^{[l]})

a[l]a[l]a^{[l]}直接隔层与下一层的线性输出相连,与z[l+2]z[l+2]z^{[l+2]}共同通过激活函数(ReLU)输出a[l+2]a[l+2]a^{[l+2]}。

该模型由Kaiming He, Xiangyu Zhang, Shaoqing Ren和Jian Sun共同提出。由多个Residual block组成的神经网络就是Residual Network。实验表明,这种模型结构对于训练非常深的神经网络,效果很好。另外,为了便于区分,我们把非Residual Networks称为Plain Network。

Residual Network的结构如上图所示。

与Plain Network相比,Residual Network能够训练更深层的神经网络,有效避免发生发生梯度消失和梯度爆炸。从下面两张图的对比中可以看出,随着神经网络层数增加,Plain Network实际性能会变差,training error甚至会变大。然而,Residual Network的训练效果却很好,training error一直呈下降趋势。

4. Why ResNets Work

下面用个例子来解释为什么ResNets能够训练更深层的神经网络。

如上图所示,输入x经过很多层神经网络后输出a[l]a[l]a^{[l]},a[l]a[l]a^{[l]}经过一个Residual block输出a[l+2]a[l+2]a^{[l+2]}。a[l+2]a[l+2]a^{[l+2]}的表达式为:

a[l+2]=g(z[l+2]+a[l])=g(W[l+2]a[l+1]+b[l+2]+a[l])a[l+2]=g(z[l+2]+a[l])=g(W[l+2]a[l+1]+b[l+2]+a[l])

a^{[l+2]}=g(z^{[l+2]}+a^{[l]})=g(W^{[l+2]}a^{[l+1]}+b^{[l+2]}+a^{[l]})

输入x经过Big NN后,若W[l+2]≈0W[l+2]≈0W^{[l+2]}\approx0,b[l+2]≈0b[l+2]≈0b^{[l+2]}\approx0,则有:

a[l+2]=g(a[l])=ReLU(a[l])=a[l]    when a[l]≥0a[l+2]=g(a[l])=ReLU(a[l])=a[l]whena[l]≥0

a^{[l+2]}=g(a^{[l]})=ReLU(a^{[l]})=a^{[l]}\ \ \ \ when\ a^{[l]}\geq0

可以看出,即使发生了梯度消失,W[l+2]≈0W[l+2]≈0W^{[l+2]}\approx0,b[l+2]≈0b[l+2]≈0b^{[l+2]}\approx0,也能直接建立a[l+2]a[l+2]a^{[l+2]}与a[l]a[l]a^{[l]}的线性关系,且a[l+2]=a[l]a[l+2]=a[l]a^{[l+2]}=a^{[l]},这其实就是identity function。a[l]a[l]a^{[l]}直接连到a[l+2]a[l+2]a^{[l+2]},从效果来说,相当于直接忽略了a[l]a[l]a^{[l]}之后的这两层神经层。这样,看似很深的神经网络,其实由于许多Residual blocks的存在,弱化削减了某些神经层之间的联系,实现隔层线性传递,而不是一味追求非线性关系,模型本身也就能“容忍”更深层的神经网络了。而且从性能上来说,这两层额外的Residual blocks也不会降低Big NN的性能。

当然,如果Residual blocks确实能训练得到非线性关系,那么也会忽略short cut,跟Plain Network起到同样的效果。

有一点需要注意的是,如果Residual blocks中a[l]a[l]a^{[l]}和a[l+2]a[l+2]a^{[l+2]}的维度不同,通常可以引入矩阵WsWsW_s,与a[l]a[l]a^{[l]}相乘,使得Ws∗a[l]Ws∗a[l]W_s*a^{[l]}的维度与a[l+2]a[l+2]a^{[l+2]}一致。参数矩阵WsWsW_s有来两种方法得到:一种是将WsWsW_s作为学习参数,通过模型训练得到;另一种是固定WsWsW_s值(类似单位矩阵),不需要训练,WsWsW_s与a[l]a[l]a^{[l]}的乘积仅仅使得a[l]a[l]a^{[l]}截断或者补零。这两种方法都可行。

下图所示的是CNN中ResNets的结构:

ResNets同类型层之间,例如CONV layers,大多使用same类型,保持维度相同。如果是不同类型层之间的连接,例如CONV layer与POOL layer之间,如果维度不同,则引入矩阵WsWsW_s。

5. Networks in Networks and 1x1 Convolutions

Min Lin, Qiang Chen等人提出了一种新的CNN结构,即1x1 Convolutions,也称Networks in Networks。这种结构的特点是滤波器算子filter的维度为1x1。对于单个filter,1x1的维度,意味着卷积操作等同于乘积操作。

那么,对于多个filters,1x1 Convolutions的作用实际上类似全连接层的神经网络结构。效果等同于Plain Network中a[l]a[l]a^{[l]}到a[l+1]a[l+1]a^{[l+1]}的过程。这点还是比较好理解的。

1x1 Convolutions可以用来缩减输入图片的通道数目。方法如下图所示:

6. Inception Network Motivation

之前我们介绍的CNN单层的滤波算子filter尺寸是固定的,1x1或者3x3等。而Inception Network在单层网络上可以使用多个不同尺寸的filters,进行same convolutions,把各filter下得到的输出拼接起来。除此之外,还可以将CONV layer与POOL layer混合,同时实现各种效果。但是要注意使用same pool。

Inception Network由Christian Szegedy, Wei Liu等人提出。与其它只选择单一尺寸和功能的filter不同,Inception Network使用不同尺寸的filters并将CONV和POOL混合起来,将所有功能输出组合拼接,再由神经网络本身去学习参数并选择最好的模块。

Inception Network在提升性能的同时,会带来计算量大的问题。例如下面这个例子:

此CONV layer需要的计算量为:28x28x32x5x5x192=120m,其中m表示百万单位。可以看出但这一层的计算量都是很大的。为此,我们可以引入1x1 Convolutions来减少其计算量,结构如下图所示:

通常我们把该1x1 Convolution称为“瓶颈层”(bottleneck layer)。引入bottleneck layer之后,总共需要的计算量为:28x28x16x192+28x28x32x5x5x16=12.4m。明显地,虽然多引入了1x1 Convolution层,但是总共的计算量减少了近90%,效果还是非常明显的。由此可见,1x1 Convolutions还可以有效减少CONV layer的计算量。

7.Inception Network

上一节我们使用1x1 Convolution来减少Inception Network计算量大的问题。引入1x1 Convolution后的Inception module如下图所示:

多个Inception modules组成Inception Network,效果如下图所示:

上述Inception Network除了由许多Inception modules组成之外,值得一提的是网络中间隐藏层也可以作为输出层Softmax,有利于防止发生过拟合。

8. Using Open-Source Implementation

本节主要介绍GitHub的使用,GitHub是一个面向开源及私有软件项目的托管平台,上面包含有许多优秀的CNN开源项目。关于GitHub具体内容不再介绍,有兴趣的小伙伴自行查阅。

9. Transfer Learning

有关Transfer Learning的相关内容,我们在 Coursera吴恩达《构建机器学习项目》课程笔记(2)– 机器学习策略(下)中已经详细介绍过,这里就不再赘述了。

10. Data Augmentation

常用的Data Augmentation方法是对已有的样本集进行Mirroring和Random Cropping。

另一种Data Augmentation的方法是color shifting。color shifting就是对图片的RGB通道数值进行随意增加或者减少,改变图片色调。

除了随意改变RGB通道数值外,还可以更有针对性地对图片的RGB通道进行PCA color augmentation,也就是对图片颜色进行主成分分析,对主要的通道颜色进行增加或减少,可以采用高斯扰动做法。这样也能增加有效的样本数量。具体的PCA color augmentation做法可以查阅AlexNet的相关论文。

最后提一下,在构建大型神经网络的时候,data augmentation和training可以由两个不同的线程来进行。

11. State of Computer Vision

神经网络需要数据,不同的网络模型所需的数据量是不同的。Object dection,Image recognition,Speech recognition所需的数据量依次增加。一般来说,如果data较少,那么就需要更多的hand-engineering,对已有data进行处理,比如上一节介绍的data augmentation。模型算法也会相对要复杂一些。如果data很多,可以构建深层神经网络,不需要太多的hand-engineering,模型算法也就相对简单一些。

值得一提的是hand-engineering是一项非常重要也比较困难的工作。很多时候,hand-engineering对模型训练效果影响很大,特别是在数据量不多的情况下。

在模型研究或者竞赛方面,有一些方法能够有助于提升神经网络模型的性能:

  • Ensembling: Train several networks independently and average their outputs.

  • Multi-crop at test time: Run classifier on multiple versions of test images and average results.

但是由于这两种方法计算成本较大,一般不适用于实际项目开发。

最后,我们还要灵活使用开源代码:

  • Use archittectures of networks published in the literature

  • Use open source implementations if possible

  • Use pretrained models and fine-tune on your dataset

更多AI资源请关注公众号:红色石头的机器学习之路(ID:redstonewill)

Coursera吴恩达《卷积神经网络》课程笔记(2)-- 深度卷积模型:案例研究相关推荐

  1. Coursera吴恩达《神经网络与深度学习》课程笔记(1)-- 深度学习概述

    红色石头的个人网站:redstonewill.com 吴恩达(Andrew Ng)相信大家都不陌生了.8 月 8 日,吴恩达在他自己创办的在线教育平台 Coursera 上线了他的人工智能专项课程(D ...

  2. 吴恩达机器学习系列课程笔记——第十一章:机器学习系统的设计(Machine Learning System Design)

    11.1 首先要做什么 https://www.bilibili.com/video/BV164411b7dx?p=65 在接下来的视频中,我将谈到机器学习系统的设计.这些视频将谈及在设计复杂的机器学 ...

  3. 【机器学习 吴恩达】CS229课程笔记notes3翻译-Part V支持向量机

    CS229 课程笔记 吴恩达 Part V 支持向量机 这部分展现了支持向量机(SVM)学习算法.SVM是最好的监督学习算法之一.为了讲述SVM,我们需要首先谈论边界和用大的间隔分离数据.接下来,我们 ...

  4. 吴恩达机器学习系列课程笔记——第十六章:推荐系统(Recommender Systems)

    16.1 问题规划 https://www.bilibili.com/video/BV164411b7dx?p=96 在接下来的视频中,我想讲一下推荐系统.我想讲推荐系统有两个原因: 第一.仅仅因为它 ...

  5. Coursera吴恩达《神经网络与深度学习》课程笔记(3)-- 神经网络基础之Python与向量化

    红色石头的个人网站:redstonewill.com 上节课我们主要介绍了逻辑回归,以输出概率的形式来处理二分类问题.我们介绍了逻辑回归的Cost function表达式,并使用梯度下降算法来计算最小 ...

  6. Coursera吴恩达《神经网络与深度学习》课程笔记(2)-- 神经网络基础之逻辑回归...

    转至:https://blog.csdn.net/red_stone1/article/details/77851177 上节课我们主要对深度学习(Deep Learning)的概念做了简要的概述.我 ...

  7. Coursera吴恩达《神经网络与深度学习》课程笔记(2)-- 神经网络基础之逻辑回归

    红色石头的个人网站:redstonewill.com 上节课我们主要对深度学习(Deep Learning)的概念做了简要的概述.我们先从房价预测的例子出发,建立了标准的神经网络(Neural Net ...

  8. Coursera吴恩达《神经网络与深度学习》课程笔记(5)-- 深层神经网络

    红色石头的个人网站:redstonewill.com 上节课我们主要介绍了浅层神经网络.首先介绍神经网络的基本结构,包括输入层,隐藏层和输出层.然后以简单的2 layer NN为例,详细推导了其正向传 ...

  9. Coursera吴恩达《神经网络与深度学习》课程笔记(4)-- 浅层神经网络

    红色石头的个人网站:redstonewill.com 上节课我们主要介绍了向量化.矩阵计算的方法和python编程的相关技巧.并以逻辑回归为例,将其算法流程包括梯度下降转换为向量化的形式,从而大大提高 ...

  10. 吴恩达机器学习系列课程笔记

    视频资源获取:https://www.bilibili.com/video/BV164411b7dx?p=1 有监督学习:给算法包含正确答案的数据集,算法的任务就是根据数据集给出更多的正确答案. 回归 ...

最新文章

  1. vue + element 顶部二级菜单_揭秘vue/react组件库中5个quot;作者不造的轮子quot;
  2. 极简单的方式序列化sqlalchemy结果集为JSON
  3. 1227:Ride to Office
  4. 字符串类型日期时间转换为Date类型解析转换异常java.text.ParseException: Unparseable date: “2019-09-27T18:31:31+08:00”
  5. UVA11877 The Coco-Cola Store【模拟】
  6. PCB设计常见的有那些问题
  7. 极客大学架构师训练营 大数据架构、Spark、Storm、Spark Streaming、Flink、HiBench、Impala 第25课 听课总结
  8. 矩阵快速幂 算法原理
  9. 抖音 触摸精灵_触控精灵app下载-触控精灵手机版 v1.3.2 - 安下载
  10. 阿里巴巴2018秋招面经之前端岗(1~5面)
  11. Python + PIL 处理支付宝AR红包
  12. C++STL库之algorithm库
  13. E课网AHB-SRAMC
  14. 关于state和status
  15. visual Studio Code(VS code)软件中HTML超级好用的一个插件 liveserver,vs code浏览网页
  16. centos7.6下载地址
  17. 巧妇能为少米之炊(1)——Android下小内存下的生存之道
  18. 牛B的人到处都是(打击的一沓糊涂)
  19. VS code 设置中文后还显示英文问题解决办法,亲测有效!
  20. 编程好学吗,学完能做什么,怎么学才好?

热门文章

  1. 前端开发跨浏览器计算页面大小、滚动高度
  2. CSS3--幽灵按钮特效(实例)
  3. chips of wow
  4. nyoj 307(最短路变形)
  5. git rm–r folder/file fatal:pathspec did not match any files
  6. hdu 1042 N! 高精度运算
  7. Vue入门:Vue项目创建及启动
  8. 安全 - 堡垒机 - Jumpserver
  9. j2ee之存储过程调用
  10. BZOJ1115:[POI2009]石子游戏Kam(博弈论)