Как инициализировать вес для слоев свертки в Tensorflow Object Detection API?

#tensorflow #object-detection-api

#tensorflow #object-detection-api

Вопрос:

Я следовал этому руководству по реализации 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, как я могу это сделать?

Ответ №1:

Как вы можете видеть в определении конфигурации protobuf, вы можете использовать 3 инициализатора:

  • TruncatedNormalInitializer truncated_normal_initializer
  • VarianceScalingInitializer отклонение_scaling_initializer
  • random_normalinitializer random_normal_initializer

Инициализатор variancescaling — это то, что вы ищете. Это общий инициализатор, который вы можете в принципе превратить в инициализатор Xavier, установив factor=1.0, mode='FAN_AVG' , как указано в документации.

Итак, установив инициализаторы как

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

в вашей конфигурации вы получаете инициализатор Xavier.

Но также, даже если вам нужно потренироваться на новых данных, рассмотрите возможность использования предварительно обученной сети в качестве инициализации вместо случайной инициализации. Более подробную информацию смотрите в этой статье.

Ответ №2:

Средство извлечения функций mobilenet_v1 импортирует магистральную сеть из research / slim /nets:

 25:   from nets import mobilenet_v1
  

Код mobilenet создает экземпляры слоев в соответствии со спецификацией следующим образом:

 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 из них будет использоваться.

Однако, по умолчанию инициализатором в любом случае является Xavier, так что вам повезло.

Я должен сказать, что модель обучения и обнаружения объектов без предварительной подготовки feature extractor к какой-либо вспомогательной задаче может просто завершиться неудачей.

Комментарии:

1. Боюсь, он хочет использовать Object Detection API, а не напрямую mobilenet, и там параметры обучения не задаются с использованием исходного кода.

2. Да, мое обучение с нуля не удалось. Но я сделал то же самое, инициализация с помощью Xavier с использованием Caffe дала хорошие результаты.