2016-11-07 104 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 –