我想在张量流中复制一个用千层面库建立的网络。我在批量标准化方面遇到了一些麻烦。这是关于使用的批处理规范化的千层面文档:http://lasagne.readthedocs.io/en/latest/modules/layers/normalization.html?highlight=batchNorm
在tensorflow中,我发现了两个可以标准化的函数:
第一个比较简单,但不允许我从千层面中选择α参数(批量平均指数移动平均系数和训练期间计算的标准差)。我尝试使用第二个函数,它有更多的选项,但是有两件事我不理解:
在培训时,需要更新moving_mean和moving_variance。默认情况下,更新操作放在tf.GraphKeys.UPDATE_OPS中,因此需要将它们作为依赖项添加到train_op中。例如:
update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS)
with tf.control_dependencies(update_ops):
train_op = optimizer.minimize(loss)我真的不明白这里发生了什么,我需要在代码中放一些类似的东西。我能先把这个放在某个地方吗?这段代码的哪些部分不应该照本宣科,而应该根据我的代码进行更改?
发布于 2018-03-28 09:35:50
tf.nn.batch_normalization和tf.layers.batch_normalization有很大的区别。见我在这里的回答。因此,通过使用layers版本,您已经做出了正确的选择。现在,关于你们的问题:
renorm_momentum只具有一种效果,就是通过将renorm参数设置为True来使用True。如果使用默认批处理规范化,则可以忽略这一点。optimizer.minimize的地方。批量标准化有两种“模式”:训练和推理。在训练过程中,使用当前小型批次的均值和方差。在推断过程中,这是不可取的(例如,您甚至可能不使用批处理作为输入,因此不会有小型批处理统计数据)。由于这个原因,在培训期间保持小批均值/差异的移动平均数。然后使用这些移动平均线进行推断。
默认情况下,Tensorflow只执行它需要执行的内容。这些移动平均线不需要用于培训,因此它们通常不会被执行/更新。tf.control_dependencies上下文管理器强制Tensorflow在每次计算代码块中的任何内容(在本例中是成本)时执行更新。由于每个训练步骤都需要精确地计算成本,所以这是确保移动平均值被更新的好方法。
代码示例看起来有点神秘,但在上下文中,它实际上只是(作为一个例子):
loss = ...
train_step = SomeOptimizer().minimize(loss)
with tf.Session() as sess:
....变成了
loss = ...
with tf.control_dependencies(tf.get_collection(tf.GraphKeys.UPDATE_OPS)):
train_step = SomeOptimizer().minimize(loss)
with tf.Session() as sess:
....最后,记住要使用正确的training参数进行批处理规范化,以便按照预期使用小型批处理统计数据或移动平均值。
https://stackoverflow.com/questions/49528440
复制相似问题