2017-03-09 32 views
6

Używam tf.slim do implementacji autoencodera. I to całkowicie splotowego z poniższej architekturze:Ponowne użycie grubości warstwy w Tensorflow

[conv, outputs = 1] => [conv, outputs = 15] => [conv, outputs = 25] => 
=> [conv_transpose, outputs = 25] => [conv_transpose, outputs = 15] => 
[conv_transpose, outputs = 1] 

To musi być w pełni splotowy i nie mogę zrobić łączenie (ograniczenia większego problemu). Chcę korzystać z usług ciężary, więc

encoder_W_3 = decoder_W_1_Transposed 

(tak ciężary pierwszej warstwy dekodera są te warstwy ostatni enkodera, transponowane).

Gdybym ponowne ciężarów regularny sposób tfslim pozwala na ich ponowne wykorzystanie, czyli ponowne = True, a potem po prostu podać nazwę zakresu warstwie chcesz użyć ponownie, mam problem rozmiar:

ValueError: Trying to share variable cnn_block_3/weights, but specified shape (21, 11, 25, 25) and found shape (21, 11, 15, 25). 

To sprawia, sens, jeśli nie dokonasz transpozycji wag poprzedniego modelu. Czy ktoś ma pomysł, w jaki sposób mogę przetransponować te wagi?

PS: Wiem, że jest to bardzo abstrakcyjne i ręczne machanie, ale pracuję z niestandardowym API, na górze tfslim, więc nie mogę tutaj zamieszczać przykładów kodu.

+0

Jak wiem, wagi w Tensorflow mają kształt jako "[wysokość_filtrów, szerokość_filtrów, w_kanałach, kanały_wyjściowe]". Przypuszczam, że masz taki sam rozmiar filtra dla każdej warstwy, więc kiedy przenosisz wagi, powinna istnieć odpowiednia dla dekoderów i koderów? np. '[output = 1] => [outputs = 15]' może być użyte tylko przez '[output = 15] => [outputs = 1]'. Z komunikatu o błędzie, przypuszczam, że '15 => 25' zostało przypisane do' 25 => 25'. Ale kiedy liczby wag tych dwóch warstw są różne, w jaki sposób mogą być udostępniane? – Seven

Odpowiedz

2

Czy ktoś ma pomysł, w jaki sposób mogę przetransponować te ciężary?

Transpozycja jest prosta:

new_weights = tf.transpose(weights, perm=[0, 1, 3, 2]) 

będzie zamienić ostatnie dwie osie.

Jednak, jak wspomniała @Sven, to nie wystarczyłoby do rozwiązania problemu, ponieważ zmieniła się całkowita liczba wag.

+0

Działa to dobrze w przypadku transpozycji istniejącej zmiennej. Jednak w przypadku tf.slim wagi jądra są ukryte za abstrakcją - więc ponowne wykorzystanie (i przeniesienie) powinno odbyć się za pomocą innej, jeszcze nieznanej metody ... –