Tensorflow图节点是交换的

2024-04-29 19:00:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经使用微调预训练模型ssd_mobilenet_v2_coco_2018训练了一个模型。在这里,我使用了完全相同的pipeline.config文件进行培训,该文件位于ssd_mobilenet_v2_coco_2018pre-trained文件夹中。 我只删除了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 layer连接concatSqueeeze连接concat_1。 此外,我还发现在预先训练的模型图中,Preprocessor接受输入ToFloat,而在训练后,该图将Cast显示为Preprocessor的输入。 我已经将输入作为tfrecords输入到模型中


Tags: 文件模型图像layer节点pipelinev2ssd
1条回答
网友
1楼 · 发布于 2024-04-29 19:00:51

最有可能的是,差异不在于图形,而在于节点的名称,即左侧的节点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

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

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

如果变量开关名,则问题更大。这就是为什么tf.get_variable在TF2之前的时代,处理变量的首选方法是tf.get_variable,它强制变量具有名称,并在发生名称冲突时引发错误

相关问题 更多 >