【发布时间】:2016-05-19 19:24:30
【问题描述】:
我正在尝试实现Adversarial NN,这需要在交替训练小批量期间“冻结”图表的一个或另一部分。 IE。有两个子网络:G 和 D。
G( Z ) -> Xz
D( X ) -> Y
G 的损失函数取决于D[G(Z)], D[X]。
首先我需要在所有 G 参数固定的情况下训练 D 中的参数,然后在 D 中的参数固定的情况下训练 G 中的参数。第一种情况下的损失函数将是第二种情况下的负损失函数,并且更新必须适用于第一个或第二个子网的参数。
我看到 tensorflow 有tf.stop_gradient 功能。为了训练 D(下游)子网络,我可以使用这个函数来阻止梯度流到
Z -> [ G ] -> tf.stop_gradient(Xz) -> [ D ] -> Y
tf.stop_gradient 的注释非常简洁,没有内嵌示例(示例seq2seq.py 太长且不易阅读),但看起来必须在图形创建期间调用它。 是否意味着如果我想分批阻塞/解除阻塞梯度流,我需要重新创建和重新初始化图模型?
另外,似乎无法通过tf.stop_gradient 阻止流经G(上游)网络的梯度,对吧?
作为替代方案,我看到可以将变量列表作为opt_op = opt.minimize(cost, <list of variables>) 传递给优化器调用,如果可以获取每个子网范围内的所有变量,这将是一个简单的解决方案。 可以为 tf.scope 获得 <list of variables> 吗?
【问题讨论】:
标签: python tensorflow