如何从 TensorFlow 图中删除节点?

How to remove nodes from TensorFlow graph?

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

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

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

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

有一些解决方法。

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

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

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

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

希望对您有所帮助!