CSDN|如何提高模型性能?这几个方法值得尝试 | CSDN 博文精选


CSDN|如何提高模型性能?这几个方法值得尝试 | CSDN 博文精选
本文插图
责编 | 屠敏 出品 | CSDN 博客 封图 | CSDN 付费下载自东方 IC
写在前面
在我们进行模型训练时 , 如果你只是想要让模型具有不错的性能 , 那么盲目地尝试网络架构足以达到目的 。 而在本文中 ,我们将为你提供一套用于构建最先进深度学习模型的必备技术的快速指南 , 从而让模型由“具有不错的性能”上升到“性能卓越且满足我们的一些需要” 。 本文的叙述以及代码的编写时基于TensorFlow中Keras来进行表述的 。
高级架构模式
残差连接
残差连接(residual connection)是一种常见的类图网络组件 , 在 2015 年之后的许多网络架构 (包括Xception)中都可以见到 。 2015 年末 , 来自微软的何恺明等人在ILSVRC ImageNet 挑战赛 中获胜 , 其中引入了这一方法 。 残差连接解决了困扰所有大规模深度学习模型的两个共性问题:梯度消失和表示瓶颈 。
通常来说 , 向任何多于 10 层的模型中添加残差连接 , 都可能会有所帮助 。 残差连接是让前面某层的输出作为后面某层的输入 , 从而在序列网络中有效地创造了一条 捷径 。 前面层的输出没有与后面层的激活连接在一起 , 而是与后面层的激活相加(这里假设两 个激活的形状相同) 。
如果它们的形状不同 , 我们可以用一个线性变换将前面层的激活改变成目标形状(例如 , 这个线性变换可以是不带激活的 Dense 层;对于卷积特征图 , 可以是不带激活 1×1 卷积) 。 如果特征图的尺寸相同 , 在 Keras 中实现残差连接的方法如下 , 用的是恒等残差连接(identity residual connection) 。 这个例子假设我们有一个四维输入张量 x 。
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.add([y, x])如果特征图的尺寸不同 , 实现残差连接的方法如下 , 用的是线性残差连接(linear residual connection) 。 同样 , 假设我们有一个四维输入张量 x 。
fromkerasimportlayers 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(128,1, strides=2, padding='same')(x) y = layers.add([y, residual])
CSDN|如何提高模型性能?这几个方法值得尝试 | CSDN 博文精选
本文插图
批标准化
标准化(normalization)是一大类方法 , 用于让机器学习模型看到的不同样本彼此之间更加 相似 , 这有助于模型的学习与对新数据的泛化 。 最常见的数据标准化形式就是你已经在本书中 多次见到的那种形式:将数据减去其平均值使其中心为0 , 然后将数据除以其标准差使其标准 差为 1 。 实际上 , 这种做法假设数据服从正态分布(也叫高斯分布) , 并确保让该分布的中心为 0 ,同时缩放到方差为 1 。
normalized_data = http://news.hoteastday.com/a/(data- np.mean(data, axis=...)) / np.std(data, axis=...)前面的示例都是在将数据输入模型之前对数据做标准化 。 但在网络的每一次变换之后都应该考虑数据标准化 。 即使输入 Dense 或 Conv2D 网络的数据均值为0、方差为1 , 也没有理由 假定网络输出的数据也是这样 。
批标准化(batch normalization)是Ioffe 和 Szegedy 在 2015 年提出的一种层的类型 a(在 Keras 中是 BatchNormalization) , 即使在训练过程中均值和方差随时间发生变化 , 它也可以 适应性地将数据标准化 。


推荐阅读