我正在尝试实施对抗性神经网络 http://arxiv.org/abs/1406.2661,这需要在交替训练小批量期间“冻结”图的一个或另一部分。 IE。有两个子网:G 和 D。
G( Z ) -> Xz
D( X ) -> Y
其中损失函数G
依赖于取决于D[G(Z)], D[X]
.
首先,我需要在固定所有 G 参数的情况下训练 D 中的参数,然后在固定 D 中的参数的情况下训练 G 中的参数。第一种情况下的损失函数在第二种情况下将是负损失函数,并且更新必须应用于第一子网还是第二子网的参数。
我看到张量流有tf.stop_gradient
功能。为了训练 D(下游)子网络,我可以使用此函数来阻止梯度流
Z -> [ G ] -> tf.stop_gradient(Xz) -> [ D ] -> Y
The tf.stop_gradient
注释非常简洁,没有内联示例(并且示例seq2seq.py
太长而且不太容易阅读),但看起来必须在图形创建过程中调用它。这是否意味着如果我想以交替批次阻止/解除阻止梯度流,我需要重新创建并重新初始化图模型?
似乎还有无法通过以下方式阻止梯度流经 G(上游)网络:tf.stop_gradient
, right?
作为一种替代方案,我看到可以将变量列表传递给优化器调用,如下所示opt_op = opt.minimize(cost, <list of variables>)
,如果可以获取每个子网范围内的所有变量,这将是一个简单的解决方案。一个人可以得到一个<list of variables>
对于 tf.scope?
正如您在问题中提到的,实现此目的的最简单方法是使用单独的调用创建两个优化器操作opt.minimize(cost, ...)
。默认情况下,优化器将使用中的所有变量tf.trainable_variables() https://www.tensorflow.org/versions/master/api_docs/python/state_ops.html#trainable_variables。如果你想将变量过滤到特定的范围,你可以使用可选的scope
论证tf.get_collection() https://www.tensorflow.org/versions/master/api_docs/python/framework.html#get_collection如下:
optimizer = tf.train.AdagradOptimzer(0.01)
first_train_vars = tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES,
"scope/prefix/for/first/vars")
first_train_op = optimizer.minimize(cost, var_list=first_train_vars)
second_train_vars = tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES,
"scope/prefix/for/second/vars")
second_train_op = optimizer.minimize(cost, var_list=second_train_vars)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)