Tensorflow 图节点是交换的

Posted

技术标签:

【中文标题】Tensorflow 图节点是交换的【英文标题】:Tensorflow graph nodes are exchange 【发布时间】:2020-07-17 12:24:56 【问题描述】:

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

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

【问题讨论】:

【参考方案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'

图表如下所示:

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

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

对于像concat 这样的无状态节点的名称更改这一事实并不重要,因为例如在加载保存的模型时不会错误路由权重。尽管如此,如果命名稳定性对您很重要,您可以为您的操作提供明确的名称或将它们放在不同的范围内:

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

如果variables 换个名字,问题就大了。这就是为什么tf.get_variable(强制变量命名并在发生名称冲突时引发错误)是 TF2 之前的时代处理变量的首选方式的原因之一。

【讨论】:

嗨@P-Gn,我同意你对 TF 中节点名称更改的解释,但由于我正在使用预训练模型训练我的模型,因此它的名称也会改变输出形状。例如:预训练模型有| concat | 1x1917x1x4 |,训练后它变成| concat | 1x1917x5 |。大概你可以看看详细解释(github.com/tensorflow/models/issues/8362) concat_1 怎么样?之前/之后的尺寸是多少? concat_1 发生同样的事情,预训练模型有| concat_1 | 1x1917x91 |,训练后它变成| concat_1 |1x1917x1x4 |。有关形状的更多信息,您可以在下面的链接 (github.com/tensorflow/models/issues/8356) 中看到。什么,我知道图形更改了节点名称以及形状。 这可能是因为您修改了训练好的模型。你是怎么做到的? 不,我没有更改训练网络中的任何内容,除了:类数(90 to 4)以及输入和评估 tf 记录和标签映射。我使用的所有默认设置,tensorflow modelsssd_mobilenet_v2_coco.config 文件。

以上是关于Tensorflow 图节点是交换的的主要内容,如果未能解决你的问题,请参考以下文章

TensorBoard的使用(结合线性模型)

Tensorflow 会自动使用多个 CPU 吗?

TensorFlow计算模型—计算图

tensorflow入门

第3章 TensorFlow入门

tensorflow:Googletensorflow入门