繁体   English   中英

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

[英]What happens when setting reuse=True in tensorflow

我想知道当在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)

在张量流中创建模型进行训练和测试时,我们通常会创建一个模型进行训练; 并假设我们给它起一个名字“ 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”的权重吗?

任何帮助深表感谢!!

首先,一般不建议重用和变量作用域,并将在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调用。

首先,您在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已经存在。 如果reuse = True,则通过。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM