0

我试图(未成功)在我的模型中引入批量标准化,如下所示。(从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 计算批次之间事物的移动平均值。

因此,如果我分解问题:

  1. 为什么即使我注释掉了 BN 部分,训练也会受到影响。
  2. 究竟在tf.control_dependencies做什么?
  3. 在 tensorflow 中使用 BN 有什么额外的事情要做吗?

参考:

BN 版本在这里

4

1 回答 1

0

(1) 表示您的代码中某处存在错误。

(2) 批量归一化在训练时建立批量统计的移动平均值以在推理时使用。控制依赖关系确保训练移动平均值被更新

(3) 没有

于 2017-08-28T17:04:20.870 回答