簡體   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