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


  • 批标准化的工作原理是 , 训练过程中在内部保存已读取每批数据均值 和方差的指数移动平均值 。
  • 批标准化的主要效果是 , 它有助于梯度传播(这一点和残差连接很 像) , 因此允许更深的网络 。 对于有些特别深的网络 , 只有包含多个 BatchNormalization 层 时才能进行训练 。 例如 , BatchNormalization 广泛用于Keras 内置的许多高级卷积神经网络 架构 , 比如 ResNet50、Inception V3 和 Xception 。
BatchNormalization 层通常在卷积层或密集连接层之后使用 。
conv_model.add(layers.Conv2D(32,3, activation='relu')) conv_model.add(layers.BatchNormalization) dense_model.add(layers.Dense(32, activation='relu')) dense_model.add(layers.BatchNormalization) BatchNormalization 层接收一个axis 参数 , 它指定应该对哪个特征轴做标准化 。 这 个参数的默认值是-1 , 即输入张量的最后一个轴 。 对于 Dense 层、Conv1D 层、RNN 层和将 data_format 设为 “channels_last”(通道在后)的 Conv2D 层 , 这个默认值都是正确的 。 但有少数人使用将 data_format 设为 “channels_first”(通道在前)的 Conv2D 层 , 这时 特征轴是编号为 1 的轴 , 因此 BatchNormalization 的 axis 参数应该相应地设为 1 。
深度可分离卷积
如果我告诉你 , 有一个层可以替代 Conv2D , 并可以让模型更加轻量(即更少的可训练权 重参数)、速度更快(即更少的浮点数运算) , 还可以让任务性能提高几个百分点 , 你觉得怎么样?我说的正是深度可分离卷积(depthwise separable convolution)层(SeparableConv2D)的作用 。 这个层对输入的每个通道分别执行空间卷积 , 然后通过逐点卷积(1×1 卷积)将输出通道混合 , 如下图 。 这相当于将空间特征学习和通道特征学习分开 , 如果你假设输入的 空间位置高度相关 , 但不同的通道之间相对独立 , 那么这么做是很有意义的 。 它需要的参数要少很多 , 计算量也更小 , 因此可以得到更小、更快的模型 。 因为它是一种执行卷积更高效的方法 ,所以往往能够使用更少的数据学到更好的表示 , 从而得到性能更好的模型 。
CSDN|如何提高模型性能?这几个方法值得尝试 | CSDN 博文精选
本文插图

超参数优化
构建深度学习模型时 , 你必须做出许多看似随意的决定:应该堆叠多少层?每层应该 包含多少个单元或过滤器?激活应该使用 relu 还是其他函数?在某一层之后是否应该使用 BatchNormalization ?应该使用多大的dropout 比率?还有很多 。 这些在架构层面的参数叫作超参数(hyperparameter) , 以便将其与模型参数区分开来 , 后者通过反向传播进行训练 。
在实践中 , 经验丰富的机器学习工程师和研究人员会培养出直觉 , 能够判断上述选择哪些 可行、哪些不可行 。 也就是说 , 他们学会了调节超参数的技巧 。 但是调节超参数并没有正式成 文的规则 。 如果你想要在某项任务上达到最佳性能 , 那么就不能满足于一个容易犯错的人随意 做出的选择 。 即使你拥有很好的直觉 , 最初的选择也几乎不可能是最优的 。 你可以手动调节你 的选择、重新训练模型 , 如此不停重复来改进你的选择 , 这也是机器学习工程师和研究人员大 部分时间都在做的事情 。 但是 , 整天调节超参数不应该是人类的工作 , 最好留给机器去做 。
因此 , 你需要制定一个原则 , 系统性地自动探索可能的决策空间 。 你需要搜索架构空间 ,并根据经验找到性能最佳的架构 。 这正是超参数自动优化领域的内容 。 这个领域是一个完整的 研究领域 , 而且很重要 。
超参数优化的过程通常如下所示 。