代码之家  ›  专栏  ›  技术社区  ›  I. A Ziang Yan

在TensorFlow中设置Reuse=true时会发生什么?

  •  0
  • I. A Ziang Yan  · 技术社区  · 6 年前

    我想知道在TensorFlow中将重用设置为true时,后台会发生什么。

    基本上,在TensorFlow中构建用于培训和测试的模型时,我必须首先在方法中创建模型,然后在变量范围内调用它,如下所示:

    def model(inputs, return_top=True):
        #.... Here I have several conv layers
    
        if return_top:
            output = tf.layers.dense(output, units=8, name='outputs')
    
        return output
    
    with tf.variable_scope('model'):
        output_train = model(inputs_train)
        mse_train = cal_loss(output_train, labels_train) # This is a function that calculates the loss
        train_step = optimize(mse_train)    # This is a function that implements the optimizer
    
    with tf.variable_scope('model', reuse=True):
        output_validation = model(inputs_validation)
        mse_validation = cal_loss(output_validation, labels_validation)
    

    在TensorFlow中创建用于培训和测试的模型时,我们通常创建一个用于培训的模型;假设我们给它命名为“模型”;即,我们在 tf.variable_scope("model", reuse=False) ;然后我们重用模型进行测试,将重用设置为true。因此,我们使用 with tf.variable_scope("model", reuse=True) . 现在,如果我研究一下Tensorboard,我发现整个模型有两个副本,一个在“模型”下,另一个在“模型1”下。此外,我发现“模型1”引用了“模型”;即“模型1”的权重取自“模型”(这是我的假设;我想知道这是否正确)。此外,我发现“模型”输出进入优化器,而“模型_1”则不是这样。我不知道为什么。换句话说,如果“model_1”引用了“model”;优化器修改了“model”的权重;它应该修改“model_1”的权重吗?

    非常感谢您的帮助!!

    2 回复  |  直到 6 年前
        1
  •  1
  •   Alexandre Passos    6 年前

    首先,一般来说,重用和变量作用域是不推荐使用的,将在TF2中删除。正如你在这里看到的,它们可能非常混乱。我们建议您使用tf.keras层来构建您的模型,只需重用对象就可以重用模型。

    tf.get_variable和tf.variable_scope可以一起用于创建和重用模型中的变量。在变量范围内,一旦用变量名调用了get变量,用相同的变量名再次调用它是有问题的,因为tf无法判断您是要创建新变量还是要重用现有变量。如果传递reuse=false(默认选项),则会引发错误。如果传递reuse=true,我们将返回相同的旧变量。但是,如果您使用新的变量名调用get_variable并传递reuse=true,那么由于没有可重用的变量,我们也会引发错误。我们还有reuse=tf.auto_重用,它从不引发错误(如果变量存在则返回变量,如果不存在则创建变量)。

    您还可以将重用作为参数传递给变量作用域,这意味着您将隐式地传递给该作用域中的所有get变量调用。

        2
  •  0
  •   solver149    6 年前

    首先,变量范围的名称空间冲突。由于变量“model”已经存在,所以第二个变量“scope creation”必须是唯一的。TensorFlow自动将其统一为“Model_1”。再次尝试重复定义,如果将创建“model_2”变量_scope。

    其次,reuse=true不适用于变量范围名称。它用于TensorFlow变量_范围内的tf.变量。

    假设您想在两层之间使用tf.变量。在这种情况下,您将使用2个python变量指向同一个tf变量。

    如果没有reuse=true,它将抛出一个错误,说明变量之类的东西已经存在。 当Reuse=true时,它给出了一个通行证。