在张量流中设置复用= True时会发生什么

时间:2018-11-29 20:28:33

标签: python tensorflow

我想知道当在tensorflow中将重用设置为True时在后台会发生什么。

基本上,当在张量流中构建模型以进行训练和测试时,我必须首先在方法中创建模型,然后在变量范围内按如下方式调用该模型:

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)

在张量流中创建模型进行训练和测试时,我们通常会创建一个模型进行训练;并假设我们给它起一个名字“ model”;也就是说,我们在tf.variable_scope("model", reuse=False)下创建了整个模型;然后重用该模型进行测试,将重用设置为True。因此,我们使用with tf.variable_scope("model", reuse=True)。现在,如果我查看张量板,则会发现整个模型有两个副本,一个在名称“ model”下,另一个在“ model_1”下。另外,我发现“ model_1”引用了“ model”;即,“ model_1”的权重取自“ model”(这是我的假设;我想知道这是否成立)。另外,我发现“模型”输出进入优化器,“模型_1”不是这种情况。我想知道为什么。换句话说,如果“ model_1”引用“ model”;优化器修改“模型”的权重;它应该修改“ model_1”的权重吗?

非常感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

首先,一般不建议重用和变量作用域,并将在tf2中将其删除。正如您在此处看到的那样,它们可能会非常令人困惑。相反,我们建议您使用tf.keras层来构建模型,只需重用对象即可重用。

tf.get_variable和tf.variable_scope一起可用于创建和重用模型中的变量。在variable_scope内,使用变量名调用get_variable后,使用相同的变量名再次调用它是有问题的,因为TF无法分辨您是要创建新变量还是重用现有变量。如果您将默认选项重用= False传递给我们,则会引发错误。如果您通过了reuse = True,我们将返回相同的旧变量。但是,如果您使用新的变量名称调用get_variable并传递复用= True,则由于没有变量可复用,我们还会引发错误。我们还拥有reuse = tf.AUTO_REUSE,它永远不会引发错误(如果存在变量,则返回变量,如果不存在则创建)。

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

答案 1 :(得分:0)

首先,您在variable_scope上存在名称空间冲突。由于variable_scope“模型”已经存在,因此第二个variable_scope创建必须是唯一的。 Tensorflow会自动将其统一为“ model_1”。如果会创建'model_2'variable_scope,请尝试再次重复定义。

第二,reuse = True不适用于variable_scope名称。它用于tensorflow variable_scope中的tf.Variable。

假设您要在两层中使用tf.Variable。在这种情况下,您将使用2个指向相同TF变量的python变量。

如果没有reuse = True,它将抛出一个错误,说明诸如Variable已经存在。 通过复用= True,它可以通过。