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