2017-07-28 11 views
6

Chcę narysować ciężary tf.layers.dense w histogramie tensorboardu, ale nie pokazuje się w parametrze, jak mogłem to zrobić?Jak uzyskać wagi w pliku tf.layers.dense?

+1

Witamy w Stackoverflow! Poświęć trochę czasu na przeczytanie [stron pomocy] (http://stackoverflow.com/help), szczególnie w sekcjach o nazwie ["Jakie tematy mogę tu zadać?"] (Http://stackoverflow.com/help/ na temat) i ["Jakiego rodzaju pytań należy unikać?"] (http://stackoverflow.com/help/dont-ask). Proszę również wziąć udział w [trasie] (http://stackoverflow.com/tour) i przeczytać o [jak zadawać dobre pytania] (http://stackoverflow.com/help/how-to-ask). Na koniec, dowiedz się, jak utworzyć [Minimalny, kompletny i sprawdzalny przykład] (http://stackoverflow.com/help/mcve). – Markus

Odpowiedz

11

Ciężary są dodawane jako zmiennej o nazwie kernel, więc można użyć

x = tf.dense(...) 
weights = tf.get_default_graph().get_tensor_by_name(
    os.path.split(x.name)[0] + '/kernel:0')) 

można oczywiście zastąpić tf.get_default_graph() przez inny wykres, na którym pracujemy w.

+0

Świetnie! Rozwiązuje moje pytanie. DZIĘKI – user8381550

+3

I aby uzyskać uprzedzenia wystarczy użyć 'bias = tf.get_default_graph(). get_tensor_by_name ( os.path.split (x.name) [0] + '/ bias: 0') ' – collector

+0

Wygląda na to, że powinno być oznaczone jako rozwiązane. –

2

Najnowszy warstwy tensorflow api tworzy wszystko zmienne za pomocą wywołania tf.get_variable. Zapewnia to, że jeśli chcesz ponownie użyć zmiennej, możesz po prostu użyć funkcji tf.get_variable i podać nazwę zmiennej, którą chcesz uzyskać.

W przypadku tf.layers.dense zmienna jest tworzona jako: layer_name/kernel. Tak, można uzyskać zmienną mówiąc:

weights = tf.get_variable("layer_name/kernel") # do not specify 
# the shape here or it will confuse tensorflow into creating a new one. 

[Edit]: Nowa wersja Tensorflow ma teraz zarówno funkcjonalne i obiektowego interfejsy API warstw. Jeśli potrzebujesz warstw tylko do celów obliczeniowych, to używanie funkcjonalnego API to dobry wybór. Nazwy funkcji zaczynają się od małych liter, na przykład ->tf.layers.dense(...). Obiekty warstwy można utworzyć za pomocą pierwszej wielkiej litery, np. ->tf.layers.Dense(...). Po uzyskaniu dojścia do tego obiektu warstwy można korzystać ze wszystkich jego funkcji. Aby uzyskać wagi, po prostu użyj obj.trainable_weights, która zwraca listę wszystkich możliwych do wyszukania zmiennych znajdujących się w zasięgu tej warstwy.

2

Natknąłem się na ten problem i po prostu go rozwiązałem. Nazwa tf.layers.dense nie musi być taka sama z prefiksem nazwy jądra. Mój tensor to "gęste_2/xxx", ale jego jądro to "gęsty_1/jądro: 0". Aby upewnić się, że działa tf.get_variable, lepiej ustawić funkcję name=xxx w funkcji tf.layers.dense, aby dwie nazwy miały ten sam prefiks. Działa jako demonstracja poniżej:

l=tf.layers.dense(input_tf_xxx,300,name='ip1') 
with tf.variable_scope('ip1', reuse=True): 
    w = tf.get_variable('kernel') 

Przy okazji, moja wersja tf to 1.3.

0

Szaleję z tensorflow.

biegnę to:

sess.run(x.kernel)

po treningu, a ja się ciężary.

Pochodzi z właściwości opisanych: here.

Mówię, że zwariowałem, ponieważ wydaje się, że istnieje milion nieco różnych sposobów zrobienia czegoś w tf, a to odciąga samouczki.