Podczas gdy w przeszłości używano wag wiązanych w auto-koderach, obecnie jest on rzadko używany (według mojej najlepszej wiedzy), co moim zdaniem jest powodem, dla którego ten przykład Caffe nie używa powiązanych wag.
jednak Caffe nie funkcji automatycznej koderów wiązanej wag, a to kiedy jest to możliwe za pomocą dwóch funkcji: dzielenie parametr pomiędzy warstwami i flagi transponowania w pełni połączony warstwy (InnerProduct w Caffe). Bardziej szczegółowo, dwa parametry są dzielone w Caffe jeśli ich nazwa jest taka sama, co może zostać określone w dziedzinie param tak:
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
}
}
}
Jeśli inny w pełni połączona warstwa (z dopasowania wymiarów) stosowane nazwy „encode1_matrix "i" encode1_bias ", wtedy te parametry będą zawsze takie same, a Caffe zajmie się agregowaniem gradientów i prawidłową aktualizacją parametrów. Druga część polega na użyciu flagi transpozycji w pełni połączonej warstwy, tak aby współużytkowana macierz była transponowana przed pomnożeniem jej wejścia. Dlatego, rozszerzając w powyższym przykładzie, jeśli chcemy mieć całkowicie połączone warstwy o tej samej macierzy wagowej, co „encode1_matrix” jako część procesu dekodowania, to definiuje się w taki sposób:
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
}
}
}
Zauważ, że parametry obciążenia nie są współużytkowane (nie mogą wynikać z różnych wymiarów wyjściowych), podczas gdy macierze są współużytkowane, a warstwa dekodera używa flagi transpozycji, która uzupełnia powiązaną architekturę autokodera.
Zobacz tutaj, aby uzyskać pełną przykład roboczej równej auto-enkodera przy użyciu Caffe: https://gist.github.com/orsharir/beb479d9ad5d8e389800c47c9ec42840
Dziękuję, że bardzo pomaga – dontloo