【发布时间】:2017-08-27 13:28:20
【问题描述】:
我试图(未成功)在我的模型中引入批量标准化,显示为here。 (从代码中的def LeNet(x) 块开始。这是没有BN 的模型)。
我尝试通过这样做来介绍 BN:
def conv_layer(x, filters, ksize=3, bn=False, train=False):
x = tf.layers.conv2d(x, filters, ksize, padding='same',
kernel_initializer=tf.contrib.layers.xavier_initializer_conv2d())
if bn:
x = tf.layers.batch_normalization(x, training=train)
x = tf.nn.relu(x)
x = tf.layers.max_pooling2d(x,2,2)
return x
对于优化器来说:
with tf.control_dependencies(tf.get_collection(tf.GraphKeys.UPDATE_OPS)):
optimizer = tf.train.AdamOptimizer(learning_rate = rate)
training_operation = optimizer.minimize(loss_operation)
问题是,即使我已经注释掉了批量归一化层和 tf.control_dependencies 部分,并重新运行训练,我的准确率下降到大约 2%(并且仍然存在),而在 70% 区域之前。
我在 tf 版本 1.3.0 的 Jupyter Notebook 上运行它。我知道tf.control_dependencies 部分是必需的,因为 BN 会计算批次之间事物的移动平均值。
所以如果我分解问题:
- 为什么即使我注释掉了 BN 部分,训练也会受到影响。
-
tf.control_dependencies到底在做什么? - 在 tensorflow 中使用 BN 是否需要做任何额外的工作。
参考:
BN 版本为here:
【问题讨论】:
标签: python tensorflow batch-normalization