San*_*jay 6 python python-3.x tensorflow tensorboard object-detection-api
我已经用微调预训练模型训练了一个模型ssd_mobilenet_v2_coco_2018。在这里,我使用了完全相同的 pipeline.config 文件进行训练,该文件在ssd_mobilenet_v2_coco_2018预训练文件夹中可用。我只删除了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同时培养铸造作为输入到图显示之后Preprocessor。我已将输入作为tfrecords.
最有可能的是,差异不在图中,而仅仅在于节点的名称,即左侧的节点concat和concat_1左侧的节点是相同的节点。concat_1和concat在右边。
问题是,当您没有为节点提供明确的名称时,张量流需要提供一个名称,而它的命名约定相当不具有创造性。第一次需要命名节点时,它会使用其类型来命名。当它再次遇到这种情况时,它只需_在名称中添加 + 一个递增的数字即可。
举个例子:
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'
Run Code Online (Sandbox Code Playgroud)
该图如下所示:
现在,如果我们构建相同的图,但这次创建xzbefore xy,我们会得到以下图:
所以图表并没有真正改变——只是名字发生了变化。这可能就是您的情况所发生的情况:创建了相同的操作,但顺序不同。
对于无状态节点来说,名称更改这一事实concat并不重要,因为例如在加载保存的模型时,权重不会被错误路由。尽管如此,如果命名稳定性对您很重要,您可以为操作指定明确的名称或将它们放在不同的范围中:
xy = tf.concat([x, y], axis=0, name='xy')
xz = tf.concat([x, z], axis=0, name='xz')
Run Code Online (Sandbox Code Playgroud)
如果变量改变名称,问题就更大了。tf.get_variable这就是为什么强制变量具有名称并在发生名称冲突时引发错误成为 TF2 之前时代处理变量的首选方式的原因之一。
| 归档时间: |
|
| 查看次数: |
191 次 |
| 最近记录: |