交换Tensorflow图节点

问题描述 投票:5回答:1

我已经用微调的预训练模型ssd_mobilenet_v2_coco_2018训练了模型。在这里,我使用了完全相同的pipeline.config文件进行培训,该文件位于ssd_mobilenet_v2_coco_2018预培训文件夹中。我只删除了batch_norm_trainable: true标志并更改了类数(4)。在使用4类自定义数据集训练模型后,我发现concatconcat_1节点可以互相交换。预训练模型有| concat | 1x1917x1x4 |训练后变成| concat | 1x1917x5 |我已经附上了两个张量图图形可视化图像。第一幅图像是预训练图ssd_mobilenet_v2_coco_2018enter image description hereenter image description here

可以在图像的最右角看到节点交换。与预训练图中一样,Postprocess layerconcat_1连接,Squeeezeconcat连接。但是经过训练后,该图显示完全相反。像Prosprocess layerconcat连接,Squeeezeconcat_1连接。此外,我还在预训练模型图中发现Preprocessor接受输入ToFloat,而在训练后该图显示Cast作为Preprocessor的输入。我已将输入作为tfrecords输入到模型。

python python-3.x tensorflow tensorboard object-detection-api
1个回答
0
投票

[最有可能的是,差异不是在图中,而是在节点名称中,即左侧的节点concatconcat_1与resp相同。右侧的concat_1concat

事实是,当您不为节点提供显式名称时,tensorflow需要提出一个名称,并且它的命名约定不是很简单。第一次需要命名节点时,会使用其类型来命名。当再次遇到这种情况时,只需在名称中添加_ +一个递增的数字。

举这个例子:

import tensorflow as tf

x = tf.placeholder(tf.float32, (1,), name='x')
y = tf.placeholder(tf.float32, (1,), name='y')
z = tf.placeholder(tf.float32, (1,), name='z')

xy = tf.concat([x, y], axis=0)  # named 'concat'
xz = tf.concat([x, z], axis=0)  # named 'concat_1'

图形看起来像这样:

enter image description here

现在,如果我们构造same图,但是这次在xz之前创建xy,我们得到以下图:

enter image description here

所以图形并没有真正改变-只有名称改变了。这可能是您遇到的情况:创建了相同的操作,但顺序不同。

对于诸如concat之类的无状态节点更改名称的事实并不重要,因为例如在加载保存的模型时不会发生权重分配错误的情况。但是,如果命名稳定性对您很重要,则可以为操作指定明确的名称,也可以将它们放在不同的范围内:

xy = tf.concat([x, y], axis=0, name='xy')
xz = tf.concat([x, z], axis=0, name='xz')

enter image description here

如果variables开关名称,则问题更大。这就是tf.get_variable的原因之一-在TF2之前的时代中,这种方法会优先处理变量。

© www.soinside.com 2019 - 2024. All rights reserved.