2017-05-03 66 views
2

這是關於如何在訓練之前將現有權重添加到模型的問題here的擴展。更改caffe中的最後一層

我想使用現有的權重,但我的最終圖層輸出50而不是1000(因爲網絡被訓練爲分類1000項)。從前一篇文章中,通過更改輸出圖層的名稱,我可以添加權重。但後來我意識到還有其他層依賴於最後一層。下面是從VGG網絡的一個片段:

layer { 
    name: "loss3/classifier" 
    type: "InnerProduct" 
    bottom: "pool5/7x7_s1" 
    top: "loss3/classifier" 
    param { 
    lr_mult: 1 
    decay_mult: 1 
    } 
    param { 
    lr_mult: 2 
    decay_mult: 0 
    } 
    inner_product_param { 
    num_output: 50 
    weight_filler { 
     type: "xavier" 
    } 
    bias_filler { 
     type: "constant" 
     value: 0 
    } 
    } 
} 
layer { 
    name: "loss3/loss3" 
    type: "SoftmaxWithLoss" 
    bottom: "loss3/classifier" 
    bottom: "label" 
    top: "loss3/loss3" 
    loss_weight: 1 
} 
layer { 
    name: "loss3/top-1" 
    type: "Accuracy" 
    bottom: "loss3/classifier" 
    bottom: "label" 
    top: "loss3/top-1" 
    include { 
    phase: TEST 
    } 
} 
layer { 
    name: "loss3/top-5" 
    type: "Accuracy" 
    bottom: "loss3/classifier" 
    bottom: "label" 
    top: "loss3/top-5" 
    include { 
    phase: TEST 
    } 
    accuracy_param { 
    top_k: 5 
    } 
} 

我的問題是:

  1. 究竟什麼是底部和頂部的論點?

  2. 我是否需要在後續兩層中更改「loss3/classifier」的名稱?

回答

1

這是一個相當基本的問題。我強烈建議您閱讀一些文檔和基本咖啡教程,以獲取caffe的基礎知識。 This tutorial可以是一個很好的起點。


深網絡具有描述從網到預測輸出的輸入數據的「流」的底層圖形。你在你的問題中附加的片段描述了一個這樣的圖。
每層代表沿「數據路徑」的「處理單元」:其輸入是"bottom" blob(s),並且該層輸出其處理的數據作爲"top" blob。
所以,如果有一個層

layer { 
    name: "loss3/classifier" 
    type: "InnerProduct" 
    bottom: "pool5/7x7_s1" 
    top: "loss3/classifier" 
    ... 
} 

的該層執行"InnerProduct"操作(通過層type定義)。它在輸入數據塊"pool5/7x7_s1"(定義爲bottom)上執行操作,並將結果輸出到數據塊"loss3/classifier"(定義爲top數據塊)。該圖層的可學習參數(權重和偏差)由caffe使用圖層名稱"loss3/classifier"進行存儲和訪問。
因此,如果您更改layyer的"loss3/classifier_50"改變top,你會得到想要的效果:朱古力不會複製他的權重這一層的,但將保持連接到其他層這一層的輸出。


BTW,
你確定你使用的是VGG網呢?這個原型文件看起來像GoogLeNet架構...
請注意,AlexNet,VGG和GoogLeNet是三個完全不同的網絡。

+1

啊是的。你是對的。這是googlenet。我對這樣的基本問題表示歉意。我一定會瀏覽教程。謝謝! – MoneyBall