【问题标题】:How to remove nodes from TensorFlow graph?如何从 TensorFlow 图中删除节点?
【发布时间】:2016-06-03 09:30:43
【问题描述】:

我需要编写一个程序,其中一部分 TensorFlow 节点需要保持在那里存储一些全局信息(主要是变量和摘要),而另一部分需要在程序运行时进行更改/重组。

我现在的做法是在每次迭代中重建整个图。但是,我必须在每次迭代中从检查点文件或 numpy 数组手动存储和加载这些信息,这使得我的代码非常混乱且容易出错。

我想知道是否有办法删除/修改我的计算图的一部分而不是重置整个图?

【问题讨论】:

  • 很遗憾,TensorFlow 图的结构在创建后无法修改。在某种程度上,属性可以,但这似乎还不够。有一些变通方法,但很难说在你的场景中什么会起作用。你能告诉我们更多关于你想要做什么的信息吗?
  • 当然,我正在尝试实现递归神经网络,不同样本的树结构会有所不同。
  • 我想知道是否可以设置它,以便将所有可能的树结构编码到图中,并且您可以使用条件语句来确定在每次迭代中评估哪些边。
  • 感谢您提供额外信息。我在下面添加了一些建议。祝你好运!

标签: neural-network tensorflow


【解决方案1】:

改变 TensorFlow 图的结构是不可能的。具体来说,没有一种干净的方法可以从图中删除节点,因此删除子图并添加另一个子图是不切实际的。 (我已经尝试过,它涉及内部手术。最终,这比它的价值要多得多,而且你要求维护令人头疼。)

有一些解决方法。

您的重建就是其中之一。您似乎对这种方法有很好的处理,所以我不会对它竖起大拇指,但为了其他偶然发现这一点的人的利益,一个非常相似的方法是图的过滤深层副本。也就是说,您在某些条件下迭代元素并将它们添加进去。如果将图表提供给您(即您没有首先构建它的功能)或者更改相当小,这是最可行的。您仍然要为重建图形付出代价,但有时加载和存储可以是透明的。但是,鉴于您的情况,这可能不是一个很好的匹配。

另一种选择是将问题重铸为您尝试评估并依赖数据流行为的所有可能图表的超集。换句话说,构建一个图表,其中包含您输入的每种类型的输入,并且只询问您需要的输出。这可能会起作用的好迹象是:您的网络是参数化的(也许您只是增加/减少宽度或层数),变化很小(可能包括/排除输入),并且您的操作可以处理可变输入(减少一个维度,例如)。在您的情况下,如果您只有少量有限数量的树结构,这可能会很好。您可能只需要为您的全局信息添加一些聚合或重新规范化。

第三种选择是将网络视为物理拆分。因此,不要考虑一个具有可变组件的网络,而是将固定部分和变化部分之间的边界视为两个独立网络的输入和输出。这确实使一些事情变得更加困难:例如,两者之间的反向传播现在很丑陋(听起来可能对您来说是个问题)。但如果你能避免这种情况,那么两个网络就可以很好地工作。最终感觉就像处理一个单独的预训练阶段,很多人已经习惯了。

这些变通办法中的大多数都可以解决的问题范围相当狭窄,因此它们可能对您的情况没有帮助。也就是说,您不必孤注一掷。如果部分拆分网络或仅针对某些更改创建超图有效,那么您可能只需要担心少数情况下的保存/恢复,这可能会减轻您的麻烦。

希望这会有所帮助!

【讨论】:

  • 您好,感谢您的回答。我正在做的是一个 NLP 任务,其中树结构由句子的句法树决定,这意味着树结构的可能性是无限的,因此第一种和第二种方法似乎并不真正有效,不是吗?顺便说一句,对于重建的方法,我一直想知道以前构建的图是否会被正确地垃圾收集?谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-31
  • 1970-01-01
  • 2019-04-12
  • 2010-09-05
  • 2011-02-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多