最近,我读了很多关于keras批处理规范化的文章。
答案说:
如果通过训练= True启用批次归一化,则将开始对其内部的批次进行归一化,并收集每个批次的均值和方差的移动平均值。现在是棘手的部分。移动平均值是指数移动平均值,tf.layers.batch_normalization()的默认动量为0.99。平均值从0开始,方差再次从1开始。但是,由于每次更新都以(1-动量)的权重应用,因此它将渐近地达到无穷大的实际均值和方差。例如,由于0.99100为0.366,它将以100步达到实际值的73.4%。如果数值较大,则差异可能会很大。
由于我的批次很小,这意味着需要采取更多的步骤,而培训和测试之间的差异可能会很大,从而在预测时会导致不良结果。
因此,我必须在training=False
中设置call
,再次从上面的链接说:
当您将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)中获得的值对其进行初始化
不确定我上面提到的任何问题是否正确,请纠正我。
我不确定人们通常如何处理该问题?我建议的工作方式是这样吗?
谢谢!
答案 0 :(得分:0)
我做了一些测试,训练后,
我将所有批生产层的移动平均值和移动方差设置为零。
结果很糟糕。
我相信在推理模式下,keras会使用移动均值和移动方差。
还有零件训练标志,无论您将True
或False
设置为什么,两者之间的唯一区别是
是否会更新移动方差和移动均值。