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


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

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

首发于个人博客:fangzh.top,欢迎来访
本周主要讲了深度卷积网络的一些模型: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,也就是在把单张测试图片用数据扩充的形式变成很多张,然后运行分类器,得到的结果进行平均。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值