我想使用Ryan的VGG转换张量流模型。
https://github.com/ry/tensorflow-vgg16
现在我想调整图层并添加另一个图层或更改完全连接的图层。但我不知道如何从graphDef
中获取单层/权重或如何调整图表。
答案 0 :(得分:1)
简短回答:你无法调整图表,但可能有办法获得你想要的成就。
答案很长:TensorFlow Graph对象在结构上是不可变的。您可以修改它们的某些方面(例如,流入节点的张量的形状),但是您无法删除节点或在两个现有节点之间添加节点。但是,有几种方法可以达到同样的效果:
如果您的更改仅限于添加 ,那么执行此操作就没有问题。例如,如果您想在网络末端添加一个图层,请选择它。同样,你可以"替换"最后一层只需添加一个新的图层,该图层将倒数第二层作为输入,而忽略现有的最后一层。当您运行图表时,如果您从未要求输出原始的最后一层,TensorFlow将永远不会计算它。
如果需要进行修改,一种方法是逐个节点慢慢构建图形的副本。因此,请阅读原始图形定义,然后通过迭代原始图形并将类似节点添加到新副本来构建自己的新图形。这有点单调乏味且容易出错。此外...
...您可能不需要"调整"这个图表。如果您想要类似于VGG-16的实现,您可以直接处理python code。不喜欢fc6的宽度?只需编辑生成它的代码。
但这将我们带到真正的问题。如果您的目标是修改网络并能够重新使用权重,则2.和3.无法正常工作。实际上,在很多情况下这是不可能的。例如,如果我想在VGG-16中间添加或删除一个图层(例如,添加另一个卷积图层),则预先训练的权重将不再有效。您可能能够挽救在您的更改上游的任何预先训练的权重,但下游的所有内容基本上都是错误的。无论如何,您都需要重新培训网络。 (也许你可以使用预先训练好的网络作为初始化,但你仍然需要重新训练。)即使你只是添加到网络(如1.),你仍然会需要训练网络。
答案 1 :(得分:0)
谢谢!我重新创建了图形,然后通过获取图形定义的值来加载每一个权重。
这是通过graph.get_tensor_by_name(' import /...')完成的,其中...是权重的名称
https://www.tensorflow.org/versions/r0.9/how_tos/tool_developers/index.html