2016-06-25 76 views
1

我必須在訓練之前首先預訓練網絡。我用自己的會話在單獨的文件中使用代碼,但是第一次會話的變量仍然繼續存在並導致問題(因爲我在一個「主」文件中運行這兩個文件)。Tensorflow:如何給變量範圍

我可以通過簡單地運行我的pretrain文件來解決這個問題,該文件保存經過訓練的圖層,然後運行加載保存的圖層的訓練文件。但是,能夠在一個步驟中完成這兩件事情。我怎樣才能'斷開鏈接'並避免具有全局範圍的不需要的變量?

「主」文件看起來是這樣的:

from util import pretrain_nn 
from NN import Network 

shape = [...] 
layer_save_file = '' 
data = get_data() 

# Trains and saves layers 
pretrain_nn(shape, data, layer_save_file) 

# If I were to print all variables (using tf.all_variables) 
# variables only used in pretrain_nn show up 
# (the printing would be done inside `Network`) 
NN = Network(shape, pretrain=True, layer_save_file) 

NN.train(data) 

# Doesn't work because apparently some variables haven't been initialized. 
NN.save() 
+1

沒有一個代碼片段,我最初的反應「變量顯示不同的腳本了」將假定您從做' pretrain導入*'。 –

+0

添加了示例代碼,儘管我沒有看到您想要創建的內容。 '*'會導入所有模塊,它與函數中的python變量無關。 – Nimitz14

+1

就像我說的,這是一個盲目的猜測,沒有看到代碼。我試圖做的是如果「** GLOBAL_COUNTER **」是_util_中的變量,那麼'from util import *'會將「** GLOBAL_COUNTER **」導入_main_file.py_。顯然,這並不適用於此。感謝您提供樣品。 –

回答

1

變量的生命期與TensorFlow圖隱含關聯,默認情況下,兩個計算都將添加到同一個(全局)圖中。你可以範圍予以適當使用圍繞每個subcomputations的with tf.Graph().as_default():塊:

with tf.Graph().as_default(): 
    # Trains and saves layers 
    pretrain_nn(shape, data, layer_save_file) 

with tf.Graph().as_default(): 
    NN = Network(shape, pretrain=True, layer_save_file) 

    NN.train(data) 

    NN.save() 
+0

是否可以通過簡單重新設置圖形來進行範圍界定?在tensorflow API中有一個'tf.Graph().__ init __()'函數似乎這樣做,但是當我嘗試使用時,我仍然得到關於uninit的錯誤。正在使用的值。 (這樣做的好處是我不必總是添加上下文管理器,它會隱藏在我的'pretrain_nn'函數和'Network'類後面) – Nimitz14

0

從我所收集,pretrain_nn被初始化的變量TF(這是pretrain_nn和網絡共享)。據tf.variable_scope() from the documentation

變量範圍允許創建新的變量,同時通過 事故提供檢查,不能創建或共享已共享 創建的。

這似乎可以幫助保持兩個範圍分開。