2016-11-07 153 views
1

我需要使用DeepLearning4j实现现有的Caffe模型。不过,我是DL4J的新手,所以不知道如何实施。通过搜索文档和示例搜索没有多大帮助,这两者的术语非常不同。 你会如何在dl4j中编写下面的caffe原型文件?将Caffe配置转换为DeepLearning4J配置

Layer1的

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

二层

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

三层

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

回答

2

Github repo包含DL4J,Caffe,Tensorflow,火炬之间的同一模型比较。

  • 第一层是DL4J的ConvolutionLayer,你可以传入关于nOut,kernel,stride和weightInit的属性。从快速搜索看来,msra等同于WeightInit.RELU,而且variance_norm不是该模型支持的功能。
  • 第二层是ConvolutionLayer的派对,它是激活 属性;因此,将图层的属性设置为“relu”。负斜率不是该模型支持的功能。
  • 第三层也是ConvolutionLayer上的一个属性,它是dropOut ,您可以通过0.2。正在进行中的工作是创建一个 特定的DropOutLayer,但它尚未合并。如果有后 另一层但由于它的最后一层是一个OutputLayer
  • blobs_lr分别应用于乘法器重量LR和偏压LR
  • 第四层将是一个DenseLayer。您可以
  • 变化由 层为learningRate和biasLearningRate上设置属性层上的学习速度
  • weight_decay的设置,你可以设置 每一层的层上的L1或L2与属性L1或L2 。 DL4J默认为不应用 应用l1或l2来偏向,因此第二个weight_decay在 Caffe中设置为0。
  • 偏置填充物已经被默认为常数,缺省值为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(); 
+0

太好了,谢谢。这是一个很好的先发。 –

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

+0

旁注:如果你想有更多的帮助,我们随时欢迎在我们的小胶质通道乡亲:https://gitter.im/deeplearning4j/deeplearning4j –

+0

THX亚当但只有那些你提到的很简单,容易适应。当涉及到图层(上图)时,有些参数不易与DL4J相匹配,我需要帮助。 (即第一层的bias_filler,variance_norm ...) –

+0

在神经网络配置中通读我们的java文档http://deeplearning4j.org/doc。我们有东西在那里,像覆盖biasInit –

相关问题