2016-12-08 77 views
4

我想修改ImageNet朱古力模型描述如下:如何修改Imagenet Caffe模型?

As the input channel number for temporal nets is different from that of spatial nets (20 vs. 3), we average the ImageNet model filters of first layer across the channel, and then copy the average results 20 times as the initialization of temporal nets.

我的問題是我怎麼能achive上面的結果?我怎樣才能打開咖啡模型,以便能夠對其進行更改?

我看了網絡手術教程,但沒有包括所需的程序。

謝謝您的協助!

AMayer

回答

3

Net Surgery tutorial應該給你你需要覆蓋這個基礎。我來解釋一下,你需要更詳細地做的步驟:

  1. 準備.prototxt網絡架構:您需要兩個文件:現有ImageNet .prototxt文件,而新時空網絡架構。你應該使所有層除了兩個網絡中的第一個卷積層相同,包括層的名稱。這樣,您可以使用ImageNet .caffemodel文件自動初始化權重。

    由於第一個conv層的大小不同,因此您必須在文件中爲其指定一個與ImageNet文件中不同的名稱。否則,Caffe會嘗試使用現有的權重來初始化此圖層,這會因爲它們具有不同的形狀而失敗。 (這是編輯你的問題時發生的情況。) conv1b並相應地更改對該圖層的所有引用。

  2. 裝入ImageNet網絡進行測試,這樣你就可以提取模型文件中的參數:

    net = caffe.Net('imagenet.prototxt', 'imagenet.caffemodel', caffe.TEST) 
    
  3. 從這個加載的模型提取的權重。

    conv_1_weights = old_net.params['conv1'][0].data 
    conv_1_biases = old_net.params['conv1'][1].data 
    
  4. 平均跨渠道的權重:

    conv_av_weights = np.mean(conv_1_weights, axis=1, keepdims=True) 
    
  5. 與老.caffemodel文件一起裝入新的網絡,因爲除了第一層直接使用權從ImageNet所有層:

    new_net = caffe.Net('new_network.prototxt', 'imagenet.caffemodel', caffe.TEST) 
    
  6. 將計算出的平均權重分配給新網絡

    new_net.params['conv1b'][0].data[...] = conv_av_weights 
    new_net.params['conv1b'][1].data[...] = conv_1_biases 
    
  7. 保存的權重到一個新的.caffemodel文件:

    new_net.save('new_weights.caffemodel') 
    
+0

謝謝你分享你的知識。我正在測試它。我會盡快告訴你它是如何發展的。我很感激幫助。 – AMayer

+0

我發現了一個錯誤。我已根據您的建議更新了主要帖子,並提供了用於更好地查看問題的代碼。稍後我會刪除代碼,以免混淆新讀者。我在那裏做錯了什麼?謝謝! – AMayer

+0

我已經設法通過了這個錯誤,但是又遇到了另一個錯誤。我更新了主帖。謝謝! – AMayer