Tensorflow - Hold" parent"优化过程中的张量常数

时间:2017-08-09 20:25:08

标签: tensorflow

在Python中使用TensorFlow,我希望有一个"父母"张量T3,由两个" child"的一些组合(和操作)组成。张量,T1和T2(事实上,T1和T2也是其他张量的/操作的组合)。

我想在"父母"的损失函数上运行优化器。张力T3,同时持有一个孩子&#34 ;,比如,T1(及其所有可能的"孙子"张量),不变。

值得注意的是T3从函数返回,并且在该函数内创建T1和T2。优化程序在返回的T1值上运行。因此,我担心的一个问题是T1和T2可能(?)超出范围,并且它们的变量名可能不适用于主脚本(?)。以下是我如何初始化张量的缩写形式:

def make_T3():
    T1 = foo_1(name='T1')
    T2 = foo_2(name='T2')
    T3 = foo_3(T1,T2, name='T3')
    return T3

this问题和this问题非常相似;但是,由于张贴声明的方式,我不确定相同的方法是否有效,原因有两个:(1。)我不知道是否在所有变量上运行优化器,除了名称为" T1" (因此优化器中的var_list将包括"孙子" T1中包含的张量)将优化"孙子" T1内是否包含张量。 (2.)我不确定变量范围是否是一个问题。

那么,如何在保持其子T1不变的情况下正确优化T3的损失函数?

1 个答案:

答案 0 :(得分:1)

  

我的一个担忧是T1和T2可能(?)超出范围,并且它们的变量名可能不适用于主脚本(?)。

如果T1和T2是tensorflow变量/ ops,它们将不会超出范围,这些将在主脚本中可用。

  

第一个问题

现在,是T1,T2变量还是操作?

如果T1是一个依赖于其他变量的变量,那么在除T1之外的所有变量上运行优化器会优化它的孙子变量。 如果要排除它的大子变量,也可以排除它们。

如果T1不是变量,而是op,则只需要排除那些生成op的变量。

  

第二个问题

虽然排除了特定变量,但您必须注意变量名称。

所以解决方案提出了here would work

train_t3 = tf.train.GradientDescentOptimizer(0.1).minimize(loss_T3, var_list=[T1vars_names])

第二个解决方案:

# here you don't  need to explicitly exclude any variables, `stop_gradient` will takeacre that.

def make_T3():
    T1 = tf.stop_gradient(foo_1(name='T1'))
    T2 = foo_2(name='T2')
    T3 = foo_3(T1,T2, name='T3')
return T3