当前位置: 首页 > 面试题库 >

“冻结”张量流中的一些变量/作用域:stop_gradient与传递变量以最小化

姚培
2023-03-14
问题内容

我正在尝试实现Adversarial
NN
,它需要在交替训练小批处理中“冻结”图形的另一部分。即有两个子网:G和D。

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

的损失函数G取决于D[G(Z)], D[X]

首先,我需要在固定所有G参数的情况下训练D中的参数,然后在固定D中的参数的情况下训练G中的参数。在第一种情况下的损耗函数将在第二种情况下为负损耗函数,并且更新将必须应用于第一子网或第二子网的参数。

我看到了tensorflowtf.stop_gradient起作用。为了训练D(下游)子网,我可以使用此功能来阻止梯度流向

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

tf.stop_gradient注释非常简洁,没有任何内联示例(示例seq2seq.py太长且不易阅读),但是看起来必须在图形创建期间调用它。
这是否意味着如果我要交替交替阻止/取消阻止梯度流,就需要重新创建并重新初始化图形模型?

而且似乎 还不能通过来阻止流经G(上游)网络的梯度tf.stop_gradient,对吗?

作为一种替代方案,我看到可以将变量列表作为传递给优化器调用opt_op = opt.minimize(cost, <list of variables>),如果可以获取每个子网范围内的所有变量,这将是一个简单的解决方案。 可以<list of variables>给一个tf.scope买一个吗?


问题答案:

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


 类似资料:
  • 为了使Playbook更灵活、通用性更强,允许用户在执行的时候传入变量的值,这个时候就需要用到“额外变量”。 定义命令行变量 在release.yml文件里,hosts和user都定义为变量,需要从命令行传递变量值。 --- - hosts: '{{ hosts }}' remote_user: '{{ user }}' tasks: - ... 使用命令行变量 在命令行里面传值

  • 问题内容: 我有一个Angular作用域变量streetName。 如何在此控制器(添加)作用域下定义的javascript中访问streetName。请帮忙。 问题答案: 这种方法很长,但是有效: 更具可读性: 如果使用jQuery,它会更短: 链接到jsfiddle演示

  • 变量作用域 变量的作用域值的是变量的生命周期和作用范围(全局与局部作用域的区别)。 作用域介绍 静态作用域 静态作用域有称为词法作用域,即指其在编译的阶段就可以决定变量的引用。静态作用域只更变量定义的位置有关与代码执行的顺序无关。 var x = 0; function foo() { alert(x); } function bar() { var x = 20; foo(); }

  • 任何编程中的范围都是程序的一个区域,其中定义的变量可以存在,并且超出该变量无法访问。 有三个地方,其中变量可以用Pascal编程语言声明 - 在子程序或块中,称为局部变量 在所有子程序之外,称为全局变量 在子程序参数的定义中称为形式参数 让我们解释什么是local和global变量和形式参数。 局部变量 (Local Variables) 在子程序或块内声明的变量称为局部变量。 它们只能由子程序或

  • 如果你之前用过像Python或者Ruby之类的动态语言,现在你可能已经熟悉了Vim脚本的变量。你会发现Vim变量的大部分内容跟你想的一样,不过有一个东西可能会不同,那就是变量的作用域。 在两个分隔的窗口中分别打开两个不同的文件,然后在其中一个窗口中执行下面的命令: :::vim :let b:hello = "world" :echo b:hello 如你所愿,Vim会显示world。现在切换到

  • 主要内容:Python局部变量,Python全局变量,获取指定作用域范围中的变量所谓 作用域(Scope),就是变量的有效范围,就是变量可以在哪个范围以内使用。有些变量可以在整段代码的任意位置使用,有些变量只能在函数内部使用,有些变量只能在 for 循环内部使用。 变量的作用域由变量的定义位置决定,在不同位置定义的变量,它的作用域是不一样的。本节我们只讲解两种变量, 局部变量和 全局变量。 Python局部变量 在函数内部定义的变量,它的作用域也仅限于函数内部,出了函数就不能