在另一个模块的for循环内重用Tensorflow模型

时间:2019-04-23 09:17:25

标签: python tensorflow

我正在尝试从另一个模块中运行tf程序。 tf程序将deep deblurring应用于图像,并且如果我使用存储库中提供的参数从控制台将其应用于单个文件夹,则可以正常工作(我使用的是python3,但这似乎不是问题):

python3 run_model.py --input_path=./testing_set --output_path=./testing_res --height=720 --width=1280 --gpu=0

问题是,当我尝试多次运行deblur模块时,它抱怨说:

  

ValueError:变量g_net / enc1_1 / weights已经存在,不允许使用。   您是要在VarScope中设置“ reuse = True”还是“ reuse = tf.AUTO_REUSE”?

引起麻烦的行是这个one

outputs = self.generator(inputs, reuse=False)

尽管该模块在第一个文件夹中运行正常,但抱怨下一个文件夹。

由于我基本上将推理应用于我分别拥有的每个文件夹(至少是这样做的目的),我猜想可以尝试reuse=True。但这似乎会引起另一个问题:

  

ValueError:变量g_net / enc1_1 / weights不存在或不存在   使用tf.get_variable()创建。你是说定   在VarScope中重用= tf.AUTO_REUSE?

如果我将其设置为可重用,似乎再也找不到此变量。这似乎很奇怪。

this answer来看,似乎将tf设置为reuse时会假定该变量已存在,因此找不到该变量时会抱怨。

我找不到应该检查其存在性的实际变量(也许全部在模型中?),所以我对整个with tf.variable_scope(scope, reuse=False):子句应用了try...except子句。这似乎适用于多个文件夹,但它在第5个文件夹中抱怨:

  

ValueError:尺寸必须相等,但对于46和45   输入形状为[1,46,80,64]的“ g_net_6 / add”(操作:“添加”),   [1,45,80,64]。

该文件夹包含不同输入大小的图像,所以这就是我抱怨的原因。

作为最后的尝试,我什至尝试通过每次调用模型构造函数来为每个文件夹(例如,在for循环内)创建一个新的去模糊模型:

deblur = model.DEBLUR(args)
...
deblur.test(h, w, input_path, output_path)

由于某种原因,这似乎也不起作用。我当然在这里想念一些东西。

deblur.test()内声明了一个新会话,因此据我所知它应该可以正常工作。

因此,出现了一些问题:

  1. 尽管try..except子句似乎有效,但我无法弄清楚哪个变量受到影响,或者(如果我怀疑多个变量受到影响)在哪里发生。我看到模型权重在slim.arg_scope()中初始化。这是否意味着reuse参数在此处传递并以不同的方式对待变量?
  2. 为什么在脚本中重新初始化模型无法按预期进行? Tensorflow似乎记得这些变量,并且出于某种原因一遍又一遍地使用同一会话。为什么会发生这种情况,我该如何预防呢?我尝试在循环结束时定义deblur = None或在with tf.Session...中使用deblur.test(),但似乎没有任何改变。
  3. 我的第一选择(我认为是更有效的选择)可以重用tf模型,而不在需要时不重新初始化它,但我不确定在我的情况下是否可行,以及如何做到这一点。

0 个答案:

没有答案