博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
DeepLearning.ai笔记:(4-2)-- 深度卷积网络实例探究(Deep convolutional models:case studies)
阅读量:4100 次
发布时间:2019-05-25

本文共 2829 字,大约阅读时间需要 9 分钟。


title: ‘DeepLearning.ai笔记:(4-2)-- 深度卷积网络实例探究(Deep convolutional models:case studies)’

id: dl-ai-4-2
tags:

  • categories:
  • AI
  • Deep Learning
    date: 2018-10-09 17:17:04

首发于个人博客:,欢迎来访

本周主要讲了深度卷积网络的一些模型:LeNet,AlexNet,VGGNet,ResNet,Inception,1×1卷积,迁移学习等。

经典的卷积网络

经典的卷及网络有三种:LeNet、AlexNet、VGGNet。

LeNet-5

LeNet-5主要是单通道的手写字体的识别,这是80年代提出的算法,当时没有用padding,而且pooling用的是average pooling,但是现在大家都用max pooling了。

论文中的最后预测用的是sigmoid和tanh,而现在都用了softmax。

AlexNet

AlexNet是2012年提出的算法。用来对彩色的图片进行处理,其实大致的结构和LeNet-5是很相似的,但是网络更大,参数更多了。

这个时候已经用Relu来作为激活函数了,而且用了多GPU进行计算。

VGG-16

VGG-16是2015的论文,比较简化的是,卷积层和池化层都是用相同的卷积核大小,卷积核都是3×3,stride=1,same padding,池化层用的maxpooling,为2×2,stride=2。只是在卷积的时候改变了每一层的通道数。

网络很大,参数有1.38亿个参数。

建议阅读论文顺序:AlexNet->VGG->LeNet

Residual Network(残差网络)

残差网络是由若干个残差块组成的。

因为在非常深的网络中会存在梯度消失和梯度爆炸的问题,为此,引入了Skip Connection来解决,也就是残差网络的实现。

上图即为一个残差块的基本原理,在原本的传播过程(称为主线)中,加上了 a [ l ] a^{[l]} a[l] z [ l + 2 ] z^{[l+2]} z[l+2]的连接,成为’short cut’或者’skip connetction’。

所以输出的表达式变成了: 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])

残差网络是由多个残差块组成的:

没有残差网络和加上残差网络的效果对比,可以看到,随着layers的增加,ResNet表现的更好:

ResNet为何有用?

假设我们已经经过了一个很大的神经网络Big NN,得到了 a [ l ] a^{[l]} a[l]

那么这个时候再经过两层的神经网络得到 a [ l + 2 ] a^{[l+2]} a[l+2],那么表达式为:

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

如果加上正则化,那么权值就会很小,假设 W [ l + 2 ] , b [ l + 2 ] = 0 W^{[l+2]},b^{[l+2]} = 0 W[l+2],b[l+2]=0, 因为激活函数是Relu,所以

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

所以可以看到,加上残差块以后,更深的网络最差也只是和前面的效果一样,何况还有可能更好。

如果只是普通的两层网络,那么结果可能更好,也可能更差。

注意的是 a [ l + 2 ] a^{[l+2]} a[l+2]要和 a [ l ] a^{[l]} a[l]的维度一样,可以使用same padding,来保持维度。

1×1卷积

用1×1的卷积核可以来减少通道数,从而减少参数个数。

Inception Network

Inception的主要好处就是不需要人工来选择filter的大小和是否要添加池化层的问题。

如图可以一次性把各个卷积核的大小和max pool一起加进去,然后让机器自己学习里面的参数。

但是这样有一个问题,就是计算量太大了,假设是上面的 5 × 5 × 192 5 \times 5 \times 192 5×5×192的卷积核,有32个,这样一共要进行KaTeX parse error: Expected 'EOF', got '\2' at position 9: 28\times\̲2̲8\times32\times…的乘法次数,运算量是很大的。

如何解决这个问题呢?就需要用到前面的1×1的卷积核了。

可以看到经过维度压缩,计算次数少了十倍。

Inception 网络

单个的inception模块如下:

构成的google net如下:

使用开源的实现方案

别人已经实现的网络已经很厉害了,我觉得重复造轮子很没有必要,而且浪费时间,何况你水平也没有别人高。。还不如直接用别人的网络,然后稍加改造,这样可以很快的实现你的想法。

在GitHub上找到自己感兴趣的网络结构fork过来,好好研究!

迁移学习

之前已经讲过迁移学习了,也就是用别人训练好的网络,固定他们已经训练好的网络参数,然后套到自己的训练集上,完成训练。

如果你只有很少的数据集,那么,改变已有网络的最后一层softmax就可以了,比如原来别人的模型是有1000个分类,现在你只需要有3个分类。然后freeze冻结前面隐藏层的所有参数不变。这样就好像是你自己在训练一个很浅的神经网络,把隐藏层看做一个函数来映射,只需要训练最后的softmax层就可以了。

如果你有一定量的数据,那么freeze的范围可以减少,你可以训练后面的几层隐藏层,或者自己设计后面的隐藏层。

数据扩充

数据不够的话,进行数据扩充是很有用的。

可以采用

  • 镜像
  • 随机裁剪
  • 色彩转换color shifting(如三通道:R+20,G-20,B+20)等等

tips:

在数据比赛中

  • ensembling:训练多个网络模型,然后平均结果,或者加权平均
  • 测试时使用muti-crop,也就是在把单张测试图片用数据扩充的形式变成很多张,然后运行分类器,得到的结果进行平均。

转载地址:http://krrii.baihongyu.com/

你可能感兴趣的文章
JS中各种数组遍历方式的性能对比
查看>>
Mysql复制表以及复制数据库
查看>>
进程管理(一)
查看>>
linux 内核—进程的地址空间(1)
查看>>
存储器管理(二)
查看>>
开局一张图,学一学项目管理神器Maven!
查看>>
Android中的Binder(二)
查看>>
Framework之View的工作原理(一)
查看>>
Web应用架构
查看>>
设计模式之策略模式
查看>>
深究Java中的RMI底层原理
查看>>
用idea创建一个maven web项目
查看>>
Kafka
查看>>
9.1 为我们的角色划分权限
查看>>
维吉尼亚之加解密及破解
查看>>
DES加解密
查看>>
TCP/IP协议三次握手与四次握手流程解析
查看>>
PHP 扩展开发 : 编写一个hello world !
查看>>
inet_ntoa、 inet_aton、inet_addr
查看>>
用模板写单链表
查看>>