【问题标题】:Tensorflow - Hold "parent" tensor constant during optimizationTensorflow - 在优化期间保持“父”张量不变
【发布时间】:2017-08-09 20:25:08
【问题描述】:

在 Python 中使用 TensorFlow,我想要一个“父”张量 T3,它由两个“子”张量 T1 和 T2 的某种组合(和操作)组成(实际上,T1 和 T2 也是组合of / 对其他张量的操作)。

我想在“父”张量 T3 的损失函数上运行优化器,同时保持其中一个“子”,例如 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 question 和 this question 非常相似;但是,由于张量的声明方式,我不确定相同的方法是否有效,原因有两个:(1.)我不知道是否对除名为“T1”的变量之外的所有变量运行优化器(因此,优化器中的var_list 将包含 T1 中包含的“孙子”张量)将优化 T1 中包含的“孙子”张量与否。 (2.) 我不确定变量范围是否有问题。

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

【问题讨论】:

    标签: tensorflow


    【解决方案1】:

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

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

    第一个问题

    现在,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
    

    【讨论】:

    • 所以你是说在你的第二个解决方案的上下文中使用stop_gradient 将完全阻止 T1 的所有孙张量被更新?也就是在优化T3的损失时,T1内的所有梯度流都会完全停止?
    猜你喜欢
    • 2016-04-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-16
    • 1970-01-01
    • 2019-08-28
    • 2017-09-01
    • 1970-01-01
    • 2016-02-16
    相关资源
    最近更新 更多