Как использовать слой "BatchNorm" в кофе?

Я немного запутался в том, как использовать/вставлять слой "BatchNorm" в свои модели.
Я вижу несколько разных подходов, например:

ResNets: "BatchNorm" + "Scale" (без совместного использования параметров)

"BatchNorm" сразу следует слой "Scale":

layer {
    bottom: "res2a_branch1"
    top: "res2a_branch1"
    name: "bn2a_branch1"
    type: "BatchNorm"
    batch_norm_param {
        use_global_stats: true
    }
}

layer {
    bottom: "res2a_branch1"
    top: "res2a_branch1"
    name: "scale2a_branch1"
    type: "Scale"
    scale_param {
        bias_term: true
    }
}

Пример cifar10: только "BatchNorm"

В примере cifar10, представленном caffe, "BatchNorm" используется без "BatchNorm" "Scale" следующего за ним:

layer {
  name: "bn1"
  type: "BatchNorm"
  bottom: "pool1"
  top: "bn1"
  param {
    lr_mult: 0
  }
  param {
    lr_mult: 0
  }
  param {
    lr_mult: 0
  }
}

cifar10 Различные batch_norm_param для TRAIN и TEST

batch_norm_param: use_global_scale изменяется между batch_norm_param: use_global_scale TRAIN и TEST:

layer {
  name: "bn1"
  type: "BatchNorm"
  bottom: "pool1"
  top: "bn1"
  batch_norm_param {
    use_global_stats: false
  }
  param {
    lr_mult: 0
  }
  param {
    lr_mult: 0
  }
  param {
    lr_mult: 0
  }
  include {
    phase: TRAIN
  }
}
layer {
  name: "bn1"
  type: "BatchNorm"
  bottom: "pool1"
  top: "bn1"
  batch_norm_param {
    use_global_stats: true
  }
  param {
    lr_mult: 0
  }
  param {
    lr_mult: 0
  }
  param {
    lr_mult: 0
  }
  include {
    phase: TEST
  }
}

Так что это должно быть?

Как использовать слой "BatchNorm" в кофе?

Ответы

Ответ 1

Если вы следуете оригинальной бумаге, нормализация партии должна сопровождаться слоями Scale и Bias (смещение может быть включено через шкалу, хотя это делает параметры смещения недоступными). use_global_stats также следует изменить с обучения (False) на тестирование/развертывание (True) - это поведение по умолчанию. Обратите внимание, что первый пример, который вы даете, представляет собой прототип для развертывания, поэтому для него нужно установить значение "Истина".

Я не уверен в общих параметрах.

Я сделал запрос на растяжение, чтобы улучшить документы по нормализации партии, но затем закрыл его, потому что я хотел его изменить. И тогда я так и не вернулся.

Обратите внимание, что я думаю, что lr_mult: 0 для "BatchNorm" больше не требуется (возможно, не разрешено?), Хотя я не нахожу соответствующий PR сейчас.