首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >流图节点是交换的

流图节点是交换的
EN

Stack Overflow用户
提问于 2020-04-05 14:13:56
回答 1查看 230关注 0票数 6

我已经训练了一个模型与微调预训练的模型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_2018.

在图像的最右端可以看到节点交换。在预先训练的图表中,Postprocess layerconcat_1连接,Squeeezeconcat连接.但经过训练后,图表显示完全相反。就像Prosprocess layerconcat连接,Squeeeze连接concat_1。此外,我还在预先训练过的模型图中发现,Preprocessor接受输入ToFloat,而在训练之后,图形显示为Preprocessor的输入。我已经把输入作为tfrecords输入到模型中。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-14 13:01:24

最可能的区别不是在图中,而是在节点的名称上,即左边的节点concatconcat_1是与resp相同的节点。concat_1concat在右边。

问题是,当您不为节点提供显式的名称时,tensorflow需要给出一个名称,而它的命名约定是相当不具有创造性的。当它第一次需要命名一个节点时,它会使用它的类型来命名。当它再次遇到这种情况时,只需将_ +添加到名称中。

举个例子:

代码语言:javascript
复制
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'

图如下所示:

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

所以图表并没有真正改变--只有名字改变了。这可能是在您的例子中发生的情况:创建了相同的操作,但顺序不同。

更改像concat这样的无状态节点的名称这一事实并不重要,因为在加载保存的模型时,没有任何权重会被错误路由。尽管如此,如果命名稳定性对您很重要,您可以为您的操作指定显式名称,或者将它们放在不同的作用域中:

代码语言:javascript
复制
xy = tf.concat([x, y], axis=0, name='xy')
xz = tf.concat([x, z], axis=0, name='xz')

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61043978

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档