如何在Tensorflow Object Detection API中初始化卷积层的权重?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在Tensorflow Object Detection API中初始化卷积层的权重?相关的知识,希望对你有一定的参考价值。

我按照这个tutorial实现了Tensorflow Object Detection API。

首选方法是使用预训练模型。

但在某些情况下,我们需要从头开始训练。

为此,我们只需将配置文件中的两行注释为

#fine_tune_checkpoint: "object_detection/data/mobilenet_v1_1.0_224/mobilenet_v1_1.0_224.ckpt"
#from_detection_checkpoint: true 

如果我想用Xavier权重初始化来初始化权重,我该怎么做?

答案

正如您在configuration protobuf definition中看到的,您可以使用3个初始值设定项:

  • TruncatedNormalInitializer truncated_normal_initializer
  • VarianceScalingInitializer variance_scaling_initializer
  • RandomNormalInitializer random_normal_initializer

您正在寻找VarianceScalingInitializer。它是一般的初始化程序,你可以通过设置factor=1.0, mode='FAN_AVG'基本上变成Xavier初始化程序,如the documentation中所述。

因此,通过将初始化器设置为

initializer {
    variance_scaling_initializer {
        factor: 1.0
        uniform: true
        mode: FAN_AVG
    }
}

在您的配置中,您将获得Xavier初始化程序。

而且,即使您需要训练新数据,也可以考虑使用预训练网络作为初始化而不是随机初始化。有关更多详细信息,请参阅this article

另一答案

mobilenet_v1特征提取器从research / slim / nets导入骨干网络:

25:   from nets import mobilenet_v1

mobilenet的代码根据specification实例化层,如下所示:

net = slim.conv2d(net, depth(conv_def.depth), conv_def.kernel, stride=conv_def.stride, scope=end_point)

https://github.com/tensorflow/models/blob/master/research/slim/nets/mobilenet_v1.py#L264

如您所见,没有kwargs传递给conv2d调用,所以使用当前代码,您无法指定将使用哪个weights_initializer

然而,无论如何,by default的初始化程序是Xavier,所以你很幸运。

我必须说,没有在一些辅助任务上预先训练特征提取器的训练和对象检测模型可能会失败。

以上是关于如何在Tensorflow Object Detection API中初始化卷积层的权重?的主要内容,如果未能解决你的问题,请参考以下文章

TensorFlow models - object detection API 安装

目标检测比赛---Google AI Open Images - Object Detection Track

TensorFlow Object Detection API

TensorFlow使用object detection训练并识别自己的模型

TensorFlow object detection API应用一

如何将冻结图转换为 TensorFlow lite