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 个类的自定义数据集训练模型后,我发现 concat
和 concat_1
节点可以相互交换。
预训练模型有
| concat | 1x1917x1x4 |
训练后变成
| concat | 1x1917x5 |
我附上了两个张量板图形可视化图像。第一张图片是预训练图ssd_mobilenet_v2_coco_2018
。
节点交换可以在图像的最右角看到。与预训练图中一样,Postprocess layer
与 concat_1
连接,Squeeeze
与 concat
连接。但是在训练之后,图表显示完全相反。就像Prosprocess layer
连接到concat
和Squeeeze
连接到concat_1
。
此外,我还在预训练模型图中发现Preprocessor
接受输入ToFloat
,而在训练后,该图显示 Cast 作为Preprocessor
的输入。
我已将模型输入为tfrecords
。
【问题讨论】:
【参考方案1】:很可能,区别不在于图表,而只是节点的名称,即左侧的节点concat
和concat_1
分别与相同的节点。 concat_1
和 concat
在右侧。
问题是,当您不为节点提供明确的名称时,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 图节点是交换的的主要内容,如果未能解决你的问题,请参考以下文章