2016-08-25 55 views
13

Zwykle auto-koder wykorzystuje właściwe wagi w sieciach kodowania i dekodowania, prawda?Auto-kodery z powiązanymi obciążnikami w Caffe

Spojrzałem na Caffe's auto-encoder example, ale nie widziałem, jak są związane wagi. Zauważyłem, że sieci kodowania i dekodowania dzielą te same bloby, ale w jaki sposób gwarantuje się, że wagi są poprawnie aktualizowane?

Jak zaimplementować powiązane ciężary auto-koderów w Caffe?

Odpowiedz

5

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

+0

Dziękuję, że bardzo pomaga – dontloo