我试图(不成功地)在我的模型中引入批量标准化,显示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%的区域。
我在一台版本为1.3.0的Jupyter笔记本上运行它。我知道tf.control_dependencies
部分是必需的,因为BN计算批次间事物的移动平均值。
所以如果我分解问题:
tf.control_dependencies
到底在做什么?BN版本为here:
答案 0 :(得分:0)
(1)表示代码中存在错误。
(2)批量标准化在培训时间建立批次统计的移动平均值以在推理时使用。控制依赖性确保正在更新训练移动平均值
(3)没有