[英]Auto-encoders with tied weights in Caffe
根據我的理解,通常自動編碼器在編碼和解碼網絡中使用綁定權重嗎?
我看了一下Caffe的自動編碼器示例 ,但我沒看到權重是如何綁定的。 我注意到編碼和解碼網絡共享相同的blob,但是如何保證權重正確更新?
如何在Caffe中實現捆綁重量自動編碼器?
雖然在自動編碼器中有使用綁定權重的歷史,但現在很少使用(據我所知),我相信這就是為什么這個Caffe示例不使用綁定權重。
盡管如此,Caffe 確實支持具有綁定權重的自動編碼器,並且可以使用兩個功能:層之間的參數共享和完全連接層的轉置標志 (Caffe中的InnerProduct)。 更具體地說,如果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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.