Caffe Копирует предварительно обученные веса AlexNet в пользовательскую сеть с двумя серверами AlexNets.

Я пытаюсь построить сеть, которая содержит два входа изображения. Каждое изображение будет проходить через сеть одновременно с поздним слиянием, которое объединится и даст один выход. Я использую диаграмму ниже, чтобы показать, что мне нужно (ps: извините, мой английский не так хорош)

введите описание изображения здесь

Моя сеть определена в файле определения модели прототипа caffe, который содержит точную AlexNet, определенную дважды до пула 5. Для первой сети слои имеют то же имя, что и в AlexNet, в то время как для второй сети я добавил суффикс "_1" к каждому имени слоя. У меня вопрос, как я могу скопировать сохраненный вес?

Например, мой сверточный слой 1 каждой сети выглядит следующим образом. Обратите внимание, что для conv1 предварительно подготовленные веса можно легко скопировать, поскольку имя слоя совпадает с именем в предварительно подготовленной модели. Однако из conv1_1 то же самое отличается, так что я боюсь, я не могу скопировать предварительно подготовленные веса? Или есть способ сделать это, даже если имена слоев отличаются?

layer {
  name: "conv1"
  type: "Convolution"
  bottom: "data1"
  top: "conv1"
  param {
    lr_mult: 0
    decay_mult: 1
  }
  param {
    lr_mult: 0
    decay_mult: 0
  }
  convolution_param {
    num_output: 96
    kernel_size: 11
    stride: 4
    weight_filler {
      type: "gaussian"
      std: 0.01
    }
    bias_filler {
      type: "constant"
      value: 0
    }
  }
}


layer {
  name: "conv1_1"
  type: "Convolution"
  bottom: "data2"
  top: "conv1_1"
  param {
    lr_mult: 0
    decay_mult: 1
  }
  param {
    lr_mult: 0
    decay_mult: 0
  }
  convolution_param {
    num_output: 96
    kernel_size: 11
    stride: 4
    weight_filler {
      type: "gaussian"
      std: 0.01
    }
    bias_filler {
      type: "constant"
      value: 0
    }
  }
}

2 ответа

Решение

Я предполагаю, что вы пытаетесь настроить всю сеть после инициализации, иначе вы можете просто использовать функции, извлеченные из AlexNet, и начать обучение на уровне FC. Для тонкой настройки вам необходимо скопировать весовые коэффициенты в первой сети (с одинаковыми именами), а вторая сеть должна разделить весовые коэффициенты с первой. Посмотрите на эту тему. Вернее, этот ответ от Эвана Шелмара.

Я сделал нечто подобное, здесь вы можете увидеть Сиамскую сеть с идентичным AlexNet. Идентичный AlexNet для сиамской сети. Вот файл прототипа

Другие вопросы по тегам