【问题标题】:Tensorflow: How to give variables scopeTensorflow:如何赋予变量范围
【发布时间】:2016-06-25 17:32:36
【问题描述】:

我必须先对网络进行预训练,然后再对其进行训练。我使用带有自己会话的单独文件中的代码来执行此操作,但是第一个会话中的变量仍然会被转移并导致问题(因为我在一个“主”文件中运行这两个文件)。

我可以通过简单地运行我的预训练文件来保存训练的层,然后运行我的训练文件来加载保存的层来解决这个问题。但是能够一步完成这两件事会很好。如何“断开链接”并避免具有全局范围的不需要的变量?

“主”文件如下所示:

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()

【问题讨论】:

  • 如果没有代码 sn-p,我对“变量显示在不同的脚本中”的最初反应是假设您正在执行 from pretrain import *
  • 添加了示例代码,虽然我不明白你想要表达什么观点。 * 将导入所有模块,它与函数中的 python 变量无关。
  • 就像我说的,这是一个盲目的猜测,没有看到代码。我想要说明的一点是,如果“GLOBAL_COUNTER”是util 中的一个变量,那么from util import * 会将“GLOBAL_COUNTER”导入main_file.py。但是,显然,这不适用于这里。感谢您提供样品。

标签: python tensorflow


【解决方案1】:

变量的生命周期隐含地与 TensorFlow 图相关联,默认情况下,您的两个计算都将添加到同一个(全局)图中。您可以在每个子计算周围使用 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()

【讨论】:

  • 是否可以通过简单地重置图表来进行范围界定?在 tensorflow API 中有一个函数 tf.Graph().__init__() 似乎可以做到这一点,但是当我尝试使用时,我仍然会收到有关 uninit 的错误。正在使用的值。 (这样做的好处是我不必总是为添加上下文管理器而烦恼,它会隐藏在我的 pretrain_nn 函数和 Network 类后面)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-18
  • 1970-01-01
  • 2016-03-17
  • 2016-11-27
相关资源
最近更新 更多