2016-08-25 35 views
13

根據我的理解,通常情況下,自動編碼器在編碼和解碼網絡中使用相關的權重?在Caffe中綁定權重的自動編碼器

我看了一眼Caffe's auto-encoder example,但我沒有看到權重是如何相關的。我注意到編碼和解碼網絡共享相同的斑點,但是它如何保證權重正確更新?

如何在Caffe中實現綁定權重自動編碼器?

回答

5

雖然沒有在自動編碼器使用捆綁權重的歷史,現在天很少使用(據我所知),我相信這是爲什麼這個來自Caffe例如不使用捆綁的權重。

然而,來自Caffe 確實支持自動編碼器捆綁帶權重,並且它是使用兩個特徵possilbe:參數層和轉置標誌全連接層的(內積在來自Caffe)之間共享。更具體地,兩個參數在來自Caffe共享,如果他們的名字是相同的,其可以在PARAM字段下指定像這樣:如果另一個全連接層(具有匹配的尺寸)中使用的名稱

layer { 
    name: "encode1" 
    type: "InnerProduct" 
    bottom: "data" 
    top: "encode1" 
    param { 
    name: "encode1_matrix" 
    lr_mult: 1 
    decay_mult: 1 
    } 
    param { 
    name: "encode1_bias" 
    lr_mult: 1 
    decay_mult: 0 
    } 
    inner_product_param { 
    num_output: 128 
    weight_filler { 
     type: "gaussian" 
     std: 1 
     sparse: 15 
    } 
    bias_filler { 
     type: "constant" 
     value: 0 
    } 
    } 
} 

「encode1_matrix 「和」encode1_bias「,那麼這些參數將始終相同,Caffe將負責彙總漸變並正確更新參數。第二部分是使用完全連接層的轉置標誌,以便共享矩陣在其輸入乘法之前進行轉置。所以,延長了上面的例子,如果我們想有一個具有相同的權重矩陣爲「encode1_matrix」全連接層作爲解碼處理的一部分,那麼我們將定義它像這樣:

layer { 
    name: "decode1" 
    type: "InnerProduct" 
    bottom: "encode1" 
    top: "decode1" 
    param { 
    name: "encode1_matrix" 
    lr_mult: 1 
    decay_mult: 1 
    } 
    param { 
    name: "decode1_bias" 
    lr_mult: 1 
    decay_mult: 0 
    } 
    inner_product_param { 
    num_output: 784 
    transpose: true 
    weight_filler { 
     type: "gaussian" 
     std: 1 
     sparse: 15 
    } 
    bias_filler { 
     type: "constant" 
     value: 0 
    } 
    } 
} 

注意偏置參數不共享(不能由於不同的輸出尺寸),而矩陣是共享的,並且解碼器層使用完成綁定自動編碼器架構的轉置標誌。

看到這裏使用來自Caffe一個綁自動編碼器的完整工作示例:https://gist.github.com/orsharir/beb479d9ad5d8e389800c47c9ec42840

+0

感謝你,這有很大幫助 – dontloo

相關問題