重构Tensorflow FLAGS

时间:2016-08-11 13:56:41

标签: python tensorflow

在使用许多具有相同Tensorflow FLAGS的python脚本之后,我厌倦了为每个更改更新多个标志,因此决定将tf.app.flags重构为一个单独的类,我可以在脚本之间重用它。

然而,由于一些奇怪的原因,每当我在不同的方法中使用self.flags时,它都无法识别先前设置的标志。例如,以下类对于标记project_dir2可以正常工作,但对于标记project_dir3

将失败
`class MyClass():
   def __init__(self):
     self.flags = tf.app.flags
     self.FLAGS = self.flags.FLAGS

     #test code that works here
     self.flags.DEFINE_string("project_dir2", "aValue", "project directory")
     print("This will print correctly: "+self.FLAGS.project_dir2)
     self.my_function()

  def my_function(self):
     #test code that fails
     self.flags.DEFINE_string("project_dir3", "aValue", "project directory")
     print("This will fail: "+self.FLAGS.project_dir3)`

我得到以下异常:

AttributeError: project_dir2 Exception TypeError: TypeError("'NoneType' object is not callable",) in <function _remove at 0x7fd4c3090668> ignored

有什么明显我做错了吗?或者这是Tensorflow标志无法做到的事情?这是否意味着无法跨脚本重构常用的标志设置?

1 个答案:

答案 0 :(得分:0)

似乎有一个名为_parse_flags()的内部方法叫做on first access。您可以在更新后手动调用它

IE

  def my_function(self):
    #test code that fails
    self.flags.DEFINE_string("project_dir3", "aValue", "project directory")
    self.flags.FLAGS._parse_flags()

关于tf.flags的背景 - 这是Google gflags库的部分重新实现,因此它缺少功能/文档。插入官方gflags(issue 1258)可以做更聪明的事情。这允许控制详细日志记录(需要重新编译right now