Преобразование конфигурации Caffe в конфигурацию DeepLearning4J

Мне нужно реализовать существующую модель Caffe с помощью DeepLearning4j. Однако я новичок в DL4J, поэтому не знаю, как реализовать. Поиск по документам и примерам мало помог, терминология этих двух очень различна. Как бы вы написали приведенный ниже протокол caffe в dl4j?

Слой 1:

layers {
  name: "myLayer1"
  type: CONVOLUTION
  bottom: "data"
  top: "myLayer1"
  blobs_lr: 1
  blobs_lr: 2
  convolution_param {
    num_output: 20
    kernel_w: 2
    kernel_h: 2
    stride_w: 1
    stride_h: 1
    weight_filler {
    type: "msra"
    variance_norm: AVERAGE
    }
    bias_filler {
       type: "constant"
    }
 }
}

Уровень 2

 layers {
   name: "myLayer1Relu"
   type: RELU
   relu_param {
   negative_slope: 0.3
 }
 bottom: "myLayer1"
 top: "myLayer1"
 }

Уровень 3

  layers {
   name: "myLayer1_dropout"
   type: DROPOUT
   bottom: "myLayer1"
   top: "myLayer1"
   dropout_param {
     dropout_ratio: 0.2
   }
 }

Уровень 4

layers {
  name: "final_class"
  type: INNER_PRODUCT
  bottom: "myLayer4"
  top: "final_class"
  blobs_lr: 1
  blobs_lr: 2
  weight_decay: 1
  weight_decay: 0
  inner_product_param {
    num_output: 10
    weight_filler {
      type: "xavier"
      variance_norm: AVERAGE
    }
    bias_filler {
      type: "constant"
      value: 0
    }
  }
}

person math_law    schedule 07.11.2016    source источник


Ответы (2)


Этот Github репозиторий содержит сравнения одной и той же модели между DL4J, Caffe, Tensorflow, Torch.

  • 1-й слой — DL4J ConvolutionLayer, и вы можете передавать атрибуты, касающиеся nOut, ядра, шага и weightInit. Из быстрого поиска видно, что msra эквивалентна WeightInit.RELU, а variance_norm еще не поддерживается моделью.
  • 2-й слой является частью ConvolutionLayer, который является атрибутом активации; таким образом, установите для слоя атрибут «relu». Отрицательный уклон пока не поддерживается моделью.
  • 3-й слой также является атрибутом ConvolutionLayer, который выпадает, и вы должны пройти в 0.2. Идет работа по созданию конкретного DropOutLayer, но он еще не объединен.
  • 4-й слой был бы DenseLayer, если бы после него был еще один слой, но, поскольку это последний слой, это OutputLayer
  • blobs_lr применяет множитель к весу lr и смещению lr соответственно. Вы можете
  • изменить скорость обучения на слое, установив атрибуты на этом слое для LearningRate иbiasLearningRate
  • weight_decay устанавливает l1 или l2 для слоя, который вы можете установить для каждого слоя с атрибутами l1 или l2. DL4J по умолчанию не применяет l1 или l2 для смещения, поэтому второй weight_decay установлен на 0 в Caffe.
  • заполнитель смещения уже по умолчанию является постоянным и по умолчанию равен 0.

Ниже приведен краткий пример того, как будет переводиться ваш код. Дополнительную информацию можно найти в примерах DL4J:

    int learningRate = 0.1;
    int l2 = 0.005;
    int intputHeight = 28;
    int inputWidth = 28;
    int channels = 1;

    MultiLayerConfiguration conf = new NeuralNetConfiguration.Builder()
        .seed(seed)
        .iterations(iterations)
        .regularization(false).l2(l2)
        .learningRate(learningRate)
        .list()
        .layer(0, new ConvolutionLayer.Builder(new int[]{2,2}, new int[] {1,1})
            .name("myLayer1")
            .activation("relu").dropOut(0.2).nOut(20)
            .biasLearningRate(2*learningRate).weightInit(WeightInit.RELU)
            .build())
        .layer(1, new OutputLayer.Builder()
            .name("myLayer4").nOut(10)
            .activation("softmax").l2(1 * l2).biasLearningRate(2*learningRate)
            .weightInit(WeightInit.XAVIER).build())
        .setInputType(InputType.convolutionalFlat(inputHeight,inputWidth,channels))
        .build();
person nyghtowl    schedule 08.12.2016

нет автоматического способа сделать это, но отображение DSL-строителя только для нескольких слоев не должно быть сложным. Самый минимальный пример здесь: https://github.com/deeplearning4j/dl4j-examples/blob/master/dl4j-examples/src/main/java/org/deeplearning4j/examples/convolution/LenetMnistExample.java

Вы можете видеть одни и те же примитивы, например: stride, padding, xavier,biasInit, все там.

Наш предстоящий импорт keras может помочь вам соединить caffe -> keras -> dl4j.

Редактировать: я не собираюсь строить его для вас. (Я не уверен, что это то, что вы ищете здесь)

Однако в Dl4j уже есть правильные примитивы. У него нет входного слоя для variance_norm: вы используете нормализацию нулевого среднего и единичной дисперсии на входе перед его передачей.

У нас есть смещение Init как часть конфигурации, если вы только что прочитали javadoc: http://deeplearning4j.org/doc

person Adam Gibson    schedule 07.11.2016
comment
Примечание: если вам нужна дополнительная помощь, мы всегда рады видеть людей на нашем канале gitter: gitter.im/deeplearning4j/deeplearning4j< /а> - person Adam Gibson; 07.11.2016
comment
Спасибо, Адам, но только те, которые вы упомянули, просты и легко адаптируются. Когда дело доходит до слоев (выше), есть параметры, которые нелегко сопоставить с DL4J, и я прошу помощи. (т.е.bias_filler, variance_norm... для 1-го слоя) - person math_law; 07.11.2016
comment
Прочтите наш документ по Java deeplearning4j.org/doc в конфигурации нейронной сети. У нас там есть такие вещи, как покрытиеbiaInit - person Adam Gibson; 08.11.2016
comment
Я не собираюсь перепечатывать то, что уже есть в Интернете. Если вы хотите попробовать это сами, пожалуйста, сделайте это — похоже, вы просто пытаетесь заставить меня сделать это за вас, что, откровенно говоря, несправедливо. Если вы не проведете свое собственное исследование, мне не только придется объяснять каждый термин, который вы, возможно, захотите перенести, но я также должен буду показать вам каждый пример вручную. Пожалуйста, постарайтесь приложить некоторые усилия. - person Adam Gibson; 07.12.2016
comment
Кто-то сделает это в конце концов, Адам, если это будет необходимо. Никто не захочет просматривать javadocs или гуглить, чтобы получить одно и то же в разных средах. Рассматривайте это как преобразование программы между двумя разными языками (Java в C#, т.е.). Существуют инструменты, которые выполняют эту задачу (с определенными ограничениями). Многие люди экспериментируют как с Caffee, так и с DL4J. Поэтому, пожалуйста, будьте позитивны и позвольте другим возможным людям прокомментировать. - person math_law; 08.12.2016
comment
Тогда удачи тебе :D. Если вы хотите приложить некоторые усилия, найдите нас здесь: gitter.im/deeplearning4j/deeplearning4j - person Adam Gibson; 08.12.2016