Deep Learning with Python
这篇文章是我学习《Deep Learning with Python》(第二版,François Chollet 著) 时写的系列笔记之一。文章的内容是从 Jupyter notebooks 转成 Markdown 的,你可以去 GitHub 或 Gitee 找到原始的 .ipynb
笔记本。
你可以去这个网站在线阅读这本书的正版原文(英文)。这本书的作者也给出了配套的 Jupyter notebooks。
本文为 第7章 高级的深度学习最佳实践 (Chapter 7. Advanced deep-learning best practices) 的笔记之一。
文章目录
7.3 Getting the most out of your models
让模型性能发挥到极致
如果你只是想搞出个还不错的模型,无脑随便尝试各种网络架构基本就可以了。但如果你要开发出性能卓越、做到极致的模型,你就需要考虑一下后文给出的技巧。
高级架构模式
想要构架卓越的模型,你应该认识「残差连接」、「标准化」和「深度可分离卷积」这几个常用的“设计模式”。
残差连接
注:这一段是在 7.1 里写的,这里只是复制过来让这一部分更加完整。
残差连接(residual connection) 是一种现在很常用的组件,它解决了大规模深度学习模型梯度消失和表示瓶颈问题。通常,向任何多于 10 层的模型中添加残差连接,都可能会有所帮助。
- 梯度消失:就是经过的层多了,之前学到的表示变得模糊,甚至完全丢失,导致网络无法训练。
- 表示瓶颈:堆叠起来层,后一层只能访问到前一层学到的东西。如果某一层太小(激活中能够塞入的信息少)就把信息卡下来,出现瓶颈了。
残差连接是让前面某层的输出作为后面某层的输入(在网络中创造捷径)。前面层的输出并没有与后面层的激活连接在一起,而是与后面层的激活相加(若形状不同,用线性变换将前面层的激活改变成目标形状)。
注:线性变换可以用不带激活的 Dense 层,或着在 CNN 中用不带激活 1×1 卷积。
from keras import layers
x = ...
y = layers.Conv2D(128, 3, activation='relu', padding='same')(x)
y = layers.Conv2D(128, 3, activation='relu', padding='same')(y)
y = layers.MaxPooling2D(2, strides=2)(y)
# 形状不同,要做线性变换:
residual = layers.Conv2D(