我试图(未成功)在我的模型中引入批量标准化,如下所示。(从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 版本在这里: