假设我正在训练一个模型来仅从 MNIST 数据集中对 8 号图像进行分类。在这种情况下使用批量标准化是一个好习惯吗?
当图像是异构的,即属于不同的类别,例如鸟、狗、猫等时,也许它会很好用。换句话说,如果样本最初属于同一类,那么网络将适应每一层的隐藏分布,因为它们不会有太大变化(可能在开始时网络正在训练),但后来,权重会学习。但是给一个不同类别的网络图像,那么隐藏分布会从一个图像到另一个图像(即从一个类到另一个)有很大差异是有道理的。
我之所以问这个问题,是因为我试图训练一个一次启用批量标准化并在另一次禁用的模型。而且由于该模型已经在属于同一类的图像上进行了训练,因此该模型似乎需要更多的时间来进行批量归一化的训练。
PS 我正在使用 tensorflow 构建我的模型,这是我正在使用的Batch Norm层(来自: https ://r2rt.com/implementing-batch-normalization-in-tensorflow.html ):
def batch_norm_wrapper(inputs, is_training, convlayer, decay = 0.999):
scale = tf.Variable(tf.ones([inputs.get_shape()[-1]]))
beta = tf.Variable(tf.zeros([inputs.get_shape()[-1]]))
pop_mean = tf.Variable(tf.zeros([inputs.get_shape()[-1]]), trainable=False)
pop_var = tf.Variable(tf.ones([inputs.get_shape()[-1]]), trainable=False)
if is_training:
if convlayer:
batch_mean, batch_var = tf.nn.moments(inputs, [0, 1, 2])
else:
batch_mean, batch_var = tf.nn.moments(inputs, [0])
train_mean = tf.assign(pop_mean,
pop_mean * decay + batch_mean * (1 - decay))
train_var = tf.assign(pop_var,
pop_var * decay + batch_var * (1 - decay))
with tf.control_dependencies([train_mean, train_var]):
return tf.nn.batch_normalization(inputs,
batch_mean, batch_var, beta, scale, epsilon)
else:
return tf.nn.batch_normalization(inputs,
pop_mean, pop_var, beta, scale, epsilon)
也许这一层有错误。没有把握。
任何帮助深表感谢!!