我正在阅读Ioffe和Szegedy关于批量标准化的文章,我想知道如果批量大小设置为1会发生什么。 mini-Batch平均值(基本上是激活本身的值)和方差(应该是零加常数epsilon)的计算将导致归一化的零维度。
然而,张量流中的这个小例子表明发生了不同的事情:
test_img = np.array([[[[50],[100]],
[[150],[200]]]], np.float32)
gt_img = np.array([[[[60],[130]],
[[180],[225]]]], np.float32)
test_img_op = tf.convert_to_tensor(test_img, tf.float32)
norm_op = tf.layers.batch_normalization(test_img_op)
loss_op = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels = gt_img,
logits = norm_op))
update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS)
with tf.control_dependencies(update_ops):
optimizer_obj = tf.train.AdamOptimizer(0.01).minimize(loss_op)
with tf.Session() as sess:
sess.run(tf.group(tf.global_variables_initializer(),
tf.local_variables_initializer()))
print(test_img)
while True:
new_img, op, lossy, trainable = sess.run([norm_op, optimizer_obj, loss_op, tf.trainable_variables()])
print(trainable)
print(new_img)
那么TensorFlow的做法是什么(移动平均线?!)?
谢谢!
答案 0 :(得分:0)
由于beta是默认启用的可学习翻译参数,因此标准化输出不一定为零。
输入均值和方差的移动平均值将在训练期间计算,并可用于测试(如果您相应地设置is_training
)。