2016-06-25 40 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

变量范围允许创建新的变量,同时通过 事故提供检查,不能创建或共享已共享 创建的。

这似乎可以帮助保持两个范围分开。