首页 文章

我可以在Tensorflow的现有图表中将Inv操作更改为Reciprocal吗?

提问于
浏览
1

我正在研究张量流的图像分类问题 . 对于不同的任务和AWS(亚马逊)机器,我有2个不同的CNN单独训练(实际上总共3个,但我将处理后面的第三个) . 一个告诉图像中是否有文本,另一个告诉图像是否可以安全工作 . 现在我想在我的计算机上的一个脚本中使用它们,这样我就可以将图像作为输入并将两个网络的结果作为输出 .

我使用 import_meta_graph API和import_scope参数在单个tensorflow会话中加载两个图,并将每个子图放在一个单独的范围内 . 然后我只使用创建的saver的 restore 方法,给它作为参数的公共Session .

然后,为了运行推理,我在 sess.run 中使用它之前使用 graph=tf.get_default_graph()my_var=graph.get_operation_by_name('name').outputs[0] 检索占位符和最终输出(我想我可以将'name'放在 sess.run 而不是获取输出张量并将其放入变量中,但是这样不是我的问题) .

My problem is 文本CNN工作得很好,但nsfw检测器总是给我相同的输出,无论输入(甚至 np.zeros() ) . 我已经尝试了单独和相同的故事:文本工作但不nsfw . 所以我不认为问题来自于同时使用两个网络 .

我也尝试过我训练过的原始AWS机器,这次nsfw CNN工作得很好 .

两个网络非常相似 . 我查了Tensorboard如果一切都很好,我认为没问题 . 差异在于隐藏单元的数量以及我在nsfw模型中使用批量规范化而不在文本中使用批量规范化的事实 . 现在 why this title ?我发现在运行nsfw模型时我发出警告,当我只使用文本模型时,我没有这个模型:

W tensorflow / core / framework / op_def_util.cc:332]不推荐使用Op Inv . 它将停止在GraphDef版本17中工作 . 使用Reciprocal .

也许我认为这就是原因,其他一切都是平等的 . 我检查了我的GraphDef版本,它似乎是11,所以Inv应该仍然在理论上工作 . 顺便说一句,AWS机器使用的是tensroflow版本0.10,而我使用的是版本0.12 .

我注意到文本网络只有一个Inv操作(通过对 graph.get_operations() 给出的操作名称进行过滤),并且由于批量规范化层,nsfw模型具有相同的操作加上多个Inv操作 . 正如在release notes中预先确定的那样, tf.inv 已被简单地重命名为 tf.reciprocal ,因此我尝试使用 tf.group() 将操作的名称更改为Reciprocal,如建议here,但它不起作用 . 我已经看到使用 tf.identity() 并更改名称也可以工作,但从我的理解,张量流图是一个仅附加结构,所以我们不能真正修改它的操作(这似乎是不可变的) .

The thing is

_999_正如我所说,Inv操作应该仍然可以在我的GraphDef版本中使用;

  • 这只是一个警告;

  • Inv操作仅出现在以'gradients'开头的名称范围下,因此,根据我的理解,这不应该用于推理;

  • 文本模型也有Inv操作 .

由于这些原因,我对我的诊断存在很大疑问 . 所以 my final questions are

  • 你有另一个诊断吗?

  • 如果我的是正确的,是否可以用互惠操作替换Inv操作,或者你有其他任何解决方案吗?

1 回答

  • 0

    在彻底检查相关节点的输出之后,在Tensorboard的帮助下,我现在非常肯定将Inv重命名为Reciprocal与我的问题无关 .

    当输入变化时,最后一批归一化层似乎消除了其输出的几乎任何变化 . 我会问其他地方的原因 .

相关问题