1

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

第一层:

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

2 回答 2

2

这个Github存储库包含 DL4J、Caffe、Tensorflow、Torch 之间相同模型的比较。

  • 第一层是 DL4J ConvolutionLayer,您可以传入有关 nOut、kernel、stride 和 weightInit 的属性。从快速搜索来看,msra 似乎等同于 WeightInit.RELU,并且 variance_norm 不是模型支持的功能。
  • 第 2 层是 ConvolutionLayer 的一部分,它是激活属性;因此,将图层的属性设置为“relu”。负斜率不是模型支持的功能。
  • 第 3 层也是 ConvolutionLayer 的一个属性,它是 dropOut,您将传入 0.2。正在进行创建特定 DropOutLayer 的工作,但尚未合并。
  • 如果在它之后还有另一层,则第 4 层将是 DenseLayer,但由于它是最后一层,它是 OutputLayer
  • blobs_lr 将乘数分别应用于权重 lr 和偏置 lr。你可以
  • 通过在该层上设置 learningRate 和 biasLearningRate 的属性来更改该层的学习率
  • weight_decay 在层上设置 l1 或 l2,您可以使用属性 l1 或 l2 为每个层设置。DL4J 默认不应用 l1 或 l2 来偏置,因此在 Caffe 中第二个 weight_decay 设置为 0。
  • 偏置填充器已经默认为常量,默认为 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();
于 2016-12-08T16:34:15.523 回答
1

没有自动化的方法可以做到这一点,但只为几层映射构建器 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,我们将偏置初始化作为配置的一部分:http: //deeplearning4j.org/doc

于 2016-11-07T12:45:00.050 回答