我已经使用微调预训练模型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
输入到模型中
最有可能的是,差异不在于图形,而在于节点的名称,即左侧的节点
concat
和concat_1
与resp是相同的节点concat_1
和concat
在右边问题是,当您没有为节点提供显式名称时,tensorflow需要提供一个名称,并且它的命名约定相当缺乏创造性。第一次需要命名节点时,它会使用其类型来命名。当它再次遇到这种情况时,只需在名称中添加
_
+一个递增的数字举个例子:
图表如下所示:
现在,如果我们构造相同的图,但是这次在
xy
之前创建xz
,我们得到以下图:因此,图表并没有真正改变,只有名字改变了。在您的案例中可能就是这样:创建了相同的操作,但顺序不同
更改像
concat
这样的无状态节点的名称这一事实并不重要,因为在加载保存的模型时,权重不会被错误路由。尽管如此,如果命名稳定性对您很重要,您可以为您的操作指定明确的名称,或者将它们放在不同的作用域中:如果变量开关名,则问题更大。这就是为什么
tf.get_variable
在TF2之前的时代,处理变量的首选方法是tf.get_variable
,它强制变量具有名称,并在发生名称冲突时引发错误相关问题 更多 >
编程相关推荐