根據我的理解,通常情況下,自動編碼器在編碼和解碼網絡中使用相關的權重?在Caffe中綁定權重的自動編碼器
我看了一眼Caffe's auto-encoder example,但我沒有看到權重是如何相關的。我注意到編碼和解碼網絡共享相同的斑點,但是它如何保證權重正確更新?
如何在Caffe中實現綁定權重自動編碼器?
根據我的理解,通常情況下,自動編碼器在編碼和解碼網絡中使用相關的權重?在Caffe中綁定權重的自動編碼器
我看了一眼Caffe's auto-encoder example,但我沒有看到權重是如何相關的。我注意到編碼和解碼網絡共享相同的斑點,但是它如何保證權重正確更新?
如何在Caffe中實現綁定權重自動編碼器?
雖然沒有在自動編碼器使用捆綁權重的歷史,現在天很少使用(據我所知),我相信這是爲什麼這個來自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
感謝你,這有很大幫助 – dontloo