【发布时间】:2019-03-21 14:29:30
【问题描述】:
最近,我读了很多关于 keras 批量标准化的文章。
答案说:
如果您使用 training = True 打开批量归一化,这将开始对它们内部的批次进行归一化并收集每个批次的均值和方差的移动平均值。现在这是棘手的部分。移动平均线是指数移动平均线,tf.layers.batch_normalization() 的默认动量为 0.99。均值从 0 开始,方差再次从 1 开始。但是由于每次更新都应用了(1 - 动量)的权重,它将渐近地达到实际的均值和无穷大的方差。例如,在 100 步中,它将达到实际值的 73.4% 左右,因为 0.99100 是 0.366。如果数值较大,则差异可能很大。
由于我的批量很小,这意味着要采取更多步骤,并且训练和测试之间的差异可能很大,这会导致预测时出现错误的结果。
所以,我必须在call 中设置training=False,上面的链接又说:
当您设置 training = False 时,这意味着批归一化层将使用其内部存储的均值和方差的平均值来归一化批次,而不是批次自身的均值和方差。
而且我知道在测试期间我们应该使用训练时的移动均值和移动方差。而且我知道 可以设置moving_mean_initializer。
keras.layers.BatchNormalization(axis=-1, momentum=0.99, epsilon=0.001, center=True, scale=True, beta_initializer='zeros', gamma_initializer='ones', moving_mean_initializer='zeros', moving_variance_initializer='ones', beta_regularizer=None, gamma_regularizer=None, beta_constraint=None, gamma_constraint=None)
我不确定我的意见是否正确:
(1) 测试时设置训练=False,训练时设置training=True
(2)使用hsitory_weight = ModelCheckpoint(filepath="weights.{epoch:02d}.hdf5",save_weights_only=True,save_best_only=False)存储归一化权重(包括gomma和beta的移动平均和方差)
(3) 使用我们从步骤 (2) 中获得的内容对其进行初始化
不知道我上面提到的有没有错,如果是,请纠正我。
我不确定人们通常如何处理这个问题?我建议的那个有效吗?
提前致谢!
【问题讨论】: