因此,我正在使用OpenAI 基准中的一堆函数进行强化学习。在这些功能中,策略网使用以下语句初始化:
with tf.variable_scope('deepq', reuse=True):
...
return output
Run Code Online (Sandbox Code Playgroud)
问题在于,那些网络输出的指针仍在作用域内时被返回,这意味着从另一个.py文件访问那些函数时,我仍在这些作用域内。
基本上,我想运行一个train_policy(output_dir)训练网络并使用将检查点转储到磁盘的第一个功能tf.Saver()。接下来,我运行一个函数run_policy(output_dir)来重新初始化同一tf Graph并使用检查点dir加载其预训练值。
现在,当我尝试,我得到一个ValueError:
"Variable deepq/... already exists, disallowed. Did you mean to set reuse=True or reuse=tf.AUTO_REUSE in VarScope?"因为在运行第二个功能点,我仍然在第一所界定的范围。我检查了代码从OpenAI基线(非常嵌套的代码,很难查看正在发生的一切),并且重用已经设置为True。
所以我尝试做类似的事情:
tf.get_default_session().close() 其次是:
tf.reset_default_graph()
在第一个函数调用之后。(因为我将所有内容都转储到磁盘,所以我不需要会话保持活动状态)
但这给了我错误,因为我仍然在嵌套图作用域内,因此我无法重置默认图...(例如,参见此处)
另外,我尝试了类似的事情:
tf.get_default_graph().as_graph_def().__exit__()
Run Code Online (Sandbox Code Playgroud)
要么
tf.name_scope('deepq').__exit__()
Run Code Online (Sandbox Code Playgroud)
但是exit()函数需要一堆我不知道如何获取的args(而且我找不到如何使用此函数的良好文档)。
我当前的解决方案是在Python的单独子进程中运行这些功能(并让垃圾收集器完成所有工作),但这感觉并不令人满意。
有关如何处理此问题的任何想法?理想情况下,我需要类似:tf.clear_all_graphs_and_sessions()