Tensorflow图节点是可交换的。

6

我用微调预训练模型ssd_mobilenet_v2_coco_2018训练了一个模型。在此过程中,我使用了与ssd_mobilenet_v2_coco_2018预训练文件夹中可用的pipeline.config文件完全相同的文件进行训练。 我只删除了batch_norm_trainable: true标志并更改了类别数(4)。 在使用我的自定义数据集和4个类别训练模型后,我发现concatconcat_1节点互换了。 预训练模型具有 | concat | 1x1917x1x4 | 训练后变为 | concat | 1x1917x5 | 我附上了两张tensorboard图形可视化图片。第一张图片是预训练图ssd_mobilenet_v2_coco_2018enter image description here enter image description here 节点之间的交换可以在图片的最右侧看到。与预先训练的图表一样,Postprocess layerconcat_1 相连,Squeezeconcat 相连。但是经过训练后,图表完全相反。例如,Prosprocess layerconcat 相连,Squeezeconcat_1 相连。 此外,我还发现在预先训练的模型图表中,Preprocessor 采用 ToFloat 作为输入,而在训练后,图表显示 Cast 作为输入到 Preprocessor。 我已将输入馈送到模型中使用 tfrecords
1个回答

1
很可能,两者的区别不在于图形,而仅仅在于节点的名称,即左边的concatconcat_1节点与右边的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

如果变量改变名称,这将会更加麻烦。这是为什么在TF2之前,强制变量具有名称并在名称冲突时引发错误的tf.get_variable成为处理变量的首选方式之一的原因之一。


嗨,@P-Gn,我同意你对TF中节点名称更改的解释,但由于我正在使用预训练模型训练我的模型,因此随着名称的更改,输出形状也会发生变化。例如:预训练模型在训练之后变成 | concat | 1x1917x5 |,而在之前是 | concat | 1x1917x1x4 |。或许你可以看看这个详细的解释(https://github.com/tensorflow/models/issues/8362)。 - Sanjay
concat_1怎么样?之前/之后的大小是多少? - P-Gn
concat_1也发生了同样的事情,预训练模型在训练后变成了| concat_1 |1x1917x1x4 |,而之前是| concat_1 | 1x1917x91 |。有关形状的更多信息可以在以下链接中查看(https://github.com/tensorflow/models/issues/8356)。我理解图形已经改变了节点名称以及形状。 - Sanjay
这可能是因为您修改了训练模型。您是如何做到的? - P-Gn
你对类数量的更改与concat_1形状的更改是一致的(从1x1917x91变为1x1917x5)。这证实了你提出的想法。 - P-Gn
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接