将 Caffe 配置转换为 DeepLearning4J 配置

Convert Caffe configuration to DeepLearning4J configuration

我需要使用 DeepLearning4j 实现现有的 Caffe 模型。但是我是 DL4J 的新手,所以不知道如何实现。搜索文档和示例几乎没有帮助,这两者的术语非常不同。 你会如何在 dl4j 中编写下面的 caffe prototxt?

第 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
    }
  }
}

没有自动执行此操作的方法,但仅为几个图层映射构建器 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 的输入层:您在输入之前对输入使用零均值和单位方差归一化。

如果您只阅读 javadoc,我们会将 bias Init 作为配置的一部分: http://deeplearning4j.org/doc

Github repo 包含 DL4J、Caffe、Tensorflow、Torch 之间同一模型的比较。

  • 第1层是DL4J ConvolutionLayer,可以传入nOut、kernel、stride、weightInit等属性。从快速搜索看来,msra 等同于 WeightInit.RELU 并且 variance_norm 不是该模型支持的功能。
  • 第2层是激活的ConvolutionLayer的一部分 属性;因此,将层的属性设置为 "relu"。负斜率不是该模型支持的功能。
  • 第三层也是ConvolutionLayer的一个属性,就是dropOut 你会传入 0.2。正在开展工作以创建一个 特定的 DropOutLayer 但尚未合并。
  • 第 4 层将是 DenseLayer,如果它后面有另一层的话 但因为它是最后一层,所以它是一个 OutputLayer
  • blobs_lr 分别对权重 lr 和偏差 lr 应用乘数。你可以
  • 通过在该层上设置属性来更改该层的学习率 learningRate 和 biasLearningRate
  • weight_decay在你可以设置的图层上设置l1或l2 对于具有属性 l1 或 l2 的每一层。 DL4J 默认为不 将 l1 或 l2 应用于偏置,因此第二个 weight_decay 设置为 0 咖啡。
  • bias filler 已经默认为常量并且默认为 0。

下面是一个快速示例,说明您的代码将如何翻译。可以在 DL4J examples:

中找到更多信息
    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();