深度学习笔记(四)(2)深度卷积网络:实例探究

深度学习笔记(四)(2)深度卷积网络:实例探究

返回目录

2.1 为什么要进行实例探究?(Why look at case studies?)

事实上,过去几年计算机视觉研究中的大量研究都集中在如何把这些基本构件组合起来,形成有效的卷积神经网络。最直观的方式之一就是去看一些案例,就像很多人通过看别人的代码来学习编程一样,通过研究别人构建有效组件的案例是个不错的办法。
这节课最主要的是培养阅读论文的思维能力。

几个经典的神经网络

LeNet-5 网络,我记得应该是 1980 年代的,经常被引用的 AlexNet,还有 VGG 网络。这些都是非常有效的神经网络范例,当中的一些思路为现代计算机视觉技术的发展奠定了基础。论文中的这些想法可能对你大有裨益,对你的工作也可能有所帮助。
ResNet网络,又称残差网络。神经网络正在不断加深,对此你可能有所了解。ResNet神经网络训练了一个深达 152 层的神经网络,并且在如何有效训练方面,总结出了一些有趣的想法和窍门。

2.2 经典网络(Classic networks)

这里只给出图片,不再分析了,仔细学的话这个能看懂,前面有讲的。
在这里插入图片描述
这个神经网络中还有一种模式至今仍然经常用到,就是一个或多个卷积层后面跟着一个池化层,然后又是若干个卷积层再接一个池化层,然后是全连接层,最后是输出,这种排列方式很常用。
AlexNet网络:
在这里插入图片描述
在这里插入图片描述
实际上,这种神经网络与 LeNet 有很多相似之处,不过 AlexNet 要大得多。LeNet 或 LeNet-5 大约有 6 万个参数,而 AlexNet 包含约 6000 万个参数。
论文还提到,经典的 AlexNet 结构还有另一种类型的层,叫作“局部响应归一层”(Local
Response Normalization),即 LRN 层,这类层应用得并不多,所以我并没有专门讲。局部响应归一层的基本思路是,假如这是网络的一块,比如是 13×13×256,LRN 要做的就是选取一个位置,比如说这样一个位置,从这个位置穿过整个通道,能得到 256 个数字,并进行归一化。

VGG,也叫作 VGG-16 网络
在这里插入图片描述
VGG-16 的这个数字 16,就是指在这个网络中包含 16 个卷积层和全连接
层。确实是个很大的网络,总共包含约 1.38 亿个参数,即便以现在的标准来看都算是非常大的网络,但是结构却并不复杂。
.有些文章还介绍了 VGG-19 网络,它甚至比 VGG-16 还要大,由于VGG-16 的表现几乎和 VGG-19 不分高下,所以很多人还是会使用 VGG-16。

2.3 残差网络(ResNets)(Residual Networks (ResNets))

跳跃连接(Skip connection),它可以从某一层网络层获取激活,然后迅速反馈给另外一层,甚至是神经网络的更深层。我们可以利用跳跃连接构建能够训练深度网络的 ResNets,有时深度能够超过 100 层。
ResNets 是由残差块(Residual block)构建的,在这里插入图片描述
图中的捷径是在进行 ReLU非线性激活函数之前加上的,而这里的每一个节点都执行了线性函数和 ReLU 激活函数。所以𝑎[𝑙]插入的时机是在线性激活之后,ReLU 激活之前。除了捷径,你还会听到另一个术语“跳跃连接”,就是指𝑎[𝑙]跳过一层或者好几层,从而将信息传递到神经网络的更深层。
在这里插入图片描述
如果没有残差,没有这些捷径或者跳跃连接,凭经验你会发现随着网络深度的加深,
训练错误会先减少,然后增多。而理论上,随着网络深度的加深,应该训练得越来越好才对。但实际上,如果没有残差网络,对于一个普通网络来说,深度越深意味着用优化算法越难训练,训练错误会越来越多。
但有了 ResNets 就不一样了,即使网络再深,训练的表现却不错。这种方式确实有助于解决梯度消失和梯度爆炸问题,让我们在训练更深网络的同时,又能保证良好的性能。也许从另外一个角度来看,随着网络越来深,网络连接会变得臃肿,但是 ResNet 确实在训练深度网络方面非常有效。

2.4 残差网络为什么有用?(Why ResNets work?)

如何构建更深层次的 ResNets 网络的同时还不降低它们在训练集上的效率(一个网络深度越深,它在训练集上训练的效率就会
有所减弱,这也是有时候我们不希望加深网络的原因。
)?
举一个例子:
在这里插入图片描述在这里插入图片描述在这里插入图片描述
当然,我们的目标不仅仅是保持网络的效率,还要提升它的效率。残差网络起作用的主要原因就是这些残差块学习恒等函数非常容易,你能确定网络性能不会受到影响,很多时候甚至可以提高效率,或者说至少不会降低网络的效率,因此创建类似残差网络可以提升网络性能。
关于神经网络的一个细节:在这里插入图片描述
下图,普通网络转换为ResNet网络:在这里插入图片描述
在这里插入图片描述

2.5 网络中的网络以及 1×1 卷积(Network in Network and 1×1 convolutions)

在这里插入图片描述
这个 1×1×32 过滤器中的 32 个数字可以这样理解,一个神经元的输入是 32 个数字,即相同高度和宽度上某一切片上的 32 个数字
在这里插入图片描述
举个例子:
假设这是一个 28×28×192 的输入层,你可以使用池化层压缩它的高度和宽度但如果通道数量很大,想把它压缩为28 * 28 * 32维度的层,你可以用 32
个大小为 1×1 的过滤器,严格来讲每个过滤器大小都是 1×1×192 维,因为过滤器中通道数量必须与输入层中通道的数量保持一致。但是你使用了 32 个过滤器,输出层为 28×28×32。
1×1 卷积层就是这样实现了一些重要功能的(doing something pretty non-trivial),它给神经网络添加了一个非线性函数,从而减少或保持输入层中的通道数量不变,当然如果你愿意,也可以增加通道数量。

2.6 谷歌 Inception 网络简介(Inception network motivation)

构建卷积层时,你要决定过滤器的大小究竟是 1×1(原来是 1×3,猜测为口误),3×3 还 是 5×5,或者要不要添加池化层。而 Inception 网络的作用就是代替你来决定,虽然网络架构因此变得更加复杂,但网络表现却非常好。

例子:在这里插入图片描述在这里插入图片描述
Inception 层有一个问题,就是计算成本
对于上图中的5 * 5 * 192的32个过滤器,这要计算1.2亿次!
这时就有了1 * 1 卷积的一个应用:使用另一种架构,先通过1 * 1卷积把输入值的通道从192减少到16然后对这个较小层进行5 * 5的卷积得到最终输出。请注意,输入和输出的维度依然相同!但只是减少了通道数。在这里插入图片描述
而第二层的卷积次数为1000万,一共为1204万。

总结一下,如果你在构建神经网络层的时候,不想决定池化层是使用 1×1,3×3 还是 5×5的过滤器,那么 Inception 模块就是最好的选择。
只要合理构建瓶颈层,你既可以显著缩小表示层规模,又不会降低网络性能,从而节省了计算。

2.7 Inception 网络(Inception network)

在这里插入图片描述
上图为只有一层的结构,上面的方块只是把上一节的给抽象了。在这里插入图片描述
上图为一个完整的网络结构。
Inception 网络只是很多这些你学过的模块在不同的位置重复组成的网络,所以如果你理解了之前所学的 Inception 模块,你就也能理解 Inception 网络。在这里插入图片描述
上图是增加了一些论文中的细节,确保了即便是隐藏单元和中间层(编号
5)也参与了特征计算,它们也能预测图片的分类。它在 Inception 网络中起到一种调整的效果,并且能防止网络发生过拟合。

2.8 使 用 开 源 的 实 现 方 案 ( Using open-source implementations)

开始使用别人的模型去调轮子咯。
书的整理者注:ResNets 实现的 GitHub 地址https://github.com/KaimingHe/deep-residualnetworks

2.9 迁移学习(Transfer Learning)

迁移学习把公共的数据集的知识迁移到你自己的问题上。
例如你想做一个猫咪分类器,分类结果为是Tigger,或者是Misty,或者都不是。但是你的图片训练集很少,这时
建议你从网上下载一些神经网络开源的实现,不仅把代码下载下来,也把权重下载下来。
可以去掉这个网络的 Softmax 层,创建你自己的 Softmax 单元,用来输出 Tigger、Misty 和neither 三个类别。就网络而言,我建议你把所有的层看作是冻结的,你冻结网络中所有层的参数,你只需要训练和你的 Softmax 层有关的参数。这个 Softmax 层有三种可能的输出,Tigger、Misty 或者都不是。.通过使用其他人预训练的权重,你很可能得到很好的性能,即使只有一个小的数据集。
另一个技巧,也许对一些情况有用,由于前面的层都冻结了,相当于一个固定的函数,不需要改变。在这里插入图片描述
上述做法适用于小的训练集,但是若有一个大的训练集呢?
如果你的输出层的类别不同,那么你需要构建自己的输出单元,Tigger、Misty 或
者两者都不是三个类别。有很多方式可以实现,你可以取后面几层的权重,用作初始化,然后从这里开始梯度下降。这种或者你可以直接去掉这几层,换成你自己的隐藏单元和你自己的 softmax 输出层,这些方法值得一试。情况,你应该冻结更少的层,然后训练后面的层。但是有一个规律,如果你有越来越多的数据,你需要冻结的层数越少,你能够训练的层数就越多。
这么理解,因为你有的数据多,所以你可以去训练一个中等规模的神经网络。最后,如果你有大量数据,你应该做的就是用开源的网络和它的权重,把这、所有的权重当作初始化,然后训练整个网络。在这里插入图片描述

2.10 数据增强(Data augmentation)

就是想办法多弄点数据的意思。

最简单的数据增强方法就是垂直镜像对称,另一个经常使用的技巧是随机裁剪。
第二种经常使用的方法是彩色转换,有这样一张图片,然后给 R、G 和 B 三个通道上加上不同的失真值。
在这里插入图片描述
这么做的理由是因为灯光等会对图片效果造成影响,这也可以增加鲁棒性。
PCA 颜色增强的大概含义是,比如说,如果你的图片呈现紫色,即主要含有红色和蓝色,绿色很少,然后 PCA 颜色强算法就会对红色和蓝色增减很多,绿色变化相对少一点,所以使总体的颜色保持一致。不懂也行,百度一下会用就行,主要是主成分分析法。
对于你若有存储好的数据,存在硬盘上,若有大量数据,可以使用 CPU
线程,然后它不停的从硬盘中读取数据,并用CPU 线程来实现这些失真变形,可以是随机裁剪、颜色变化,或者是镜像。常用的实现数据增强的方法是使用一个线程或者是多线程,这些可以用来加载数据,实现变形失真,然后传给其他的线程或者其他进程,来训练这个(编号 2)和这个(编号 1),可以并行实现。在这里插入图片描述
在数据增强过程中也有一些超参数

2.11 计算机视觉现状(The state of computer vision)

计算机视觉是在试图学习一个非常复杂的功能,我们经常感觉我们没有足够
的数据,即使获得了更多数据,我们还是经常觉得还是没有足够的数据来满足需求。手工工程对一个项目来说贡献就很大。当你有很多数据的时候我就不会花时间去做手工工程,我会花时间去建立学习系统。但历史上都大量手工,因为数据少。
Benchmark 基准测试,Benchmark 是一个评价方式,在整个计算机领域有
着长期的应用。许多人致力于这些基准上,把它做得很好。
有助于在基准测试中表现出色的小技巧:
其中一个是集成,这就意味着在你想好了你想要的神经网络之后,可以独立训练几个神经网络,并平均它们的输出。比如说随机初始化三个、五个或者七个神经网络,然后训练所有这些网络,然后平均它们的输出。
对进准测试有帮助的另一个技巧就是 Multi-crop at test time,我的意思是你已经看到了如何进行数据增强,Multi-crop 是一种将数据增强应用到你的测试图像中的一种形式。crop是裁剪的意思

返回目录

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

瞲_大河弯弯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值