【问题标题】:How to initialize weight for convolution layers in Tensorflow Object Detection API?如何在 Tensorflow 对象检测 API 中初始化卷积层的权重?
【发布时间】:2019-03-15 09:01:25
【问题描述】:

我遵循了这个tutorial 来实现 Tensorflow 对象检测 API。

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

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

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

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

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

【问题讨论】:

    标签: tensorflow object-detection-api


    【解决方案1】:

    正如您在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

    【讨论】:

      【解决方案2】:

      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,所以你很幸运。

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

      【讨论】:

      • 恐怕他是想使用Object Detection API,而不是直接使用mobilenet,而且训练参数没有使用源代码设置。
      • 是的,我从头开始的训练失败了。但是我使用 Caffe 对 Xavier 进行了同样的初始化,结果很好。
      猜你喜欢
      • 1970-01-01
      • 2018-06-16
      • 1970-01-01
      • 2019-05-28
      • 2018-10-11
      • 1970-01-01
      • 1970-01-01
      • 2018-01-26
      • 2017-09-15
      相关资源
      最近更新 更多