在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的损失函数?
答案 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