python教程—“没有,freeze”tensorflow中的一些变量/作用域:stop_gradient vs .传递变量以最小化-Python实用宝典

python教程—“没有,freeze”tensorflow中的一些变量/作用域:stop_gradient vs .传递变量以最小化

我正在尝试实现对抗性NN,它要求在交替训练小批量时“冻结”图的一个或另一个部分。即存在两个子网络:G和D。

我正在尝试实现对位NN,它要求在交替的训练小批量期间'冻结'图形的一个或另一个部分。即存在两个子网络:G和D。

    G( Z ) -> Xz D( X ) -> Y

其中G的损失函数依赖于D[G(Z)], D[X]。

首先我需要在D中训练所有G参数固定的参数,然后在G中训练所有D参数固定的参数。第一种情况下的损耗函数为负损耗函数,无论第一子网还是第二子网的参数都必须进行更新。

我看到tensorflow有tf。stop_gradient函数。为了训练D(下游)子网,我可以使用这个函数来阻止梯度流到

    Z -> [ G ] -> tf.stop_gradient(Xz) -> [ D ] -> Y

特遣部队。stop_gradient非常简洁,没有内联示例(示例seq2seq.py太长,不太容易阅读),但是看起来必须在创建图的过程中调用它。是否意味着如果我想在交替批次中阻塞/取消阻塞梯度流,我需要重新创建和初始化图形模型?

此外,似乎不能通过tf阻止梯度通过G(上游)网络。stop_gradient ? < /强>

作为一种替代方法,我发现可以将变量列表作为opt_op = opt. minimum (cost, < list of variables >)传递给优化器调用,如果能够获得每个子网域中的所有变量,这将是一个简单的解决方案。强>可以得到一个变量列表>tf.scope ? < /强>

回答

正如您在问题中提到的,实现这一点的最简单方法是使用opt. minimum (cost,…)的单独调用创建两个优化器操作。默认情况下,优化器将使用tf.trainable_variables()中的所有变量。如果希望将变量过滤到特定范围,可以使用可选的范围参数tf.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)

​Python实用宝典 (pythondict.com)
不只是一个宝典
欢迎关注公众号:Python实用宝典

本文由 Python实用宝典 作者:Python实用宝典 发表,其版权均为 Python实用宝典 所有,文章内容系作者个人观点,不代表 Python实用宝典 对观点赞同或支持。如需转载,请注明文章来源。
0

发表评论