2016-04-14 17 views
28

Mam problemy z odzyskiwaniem tensora po imieniu, nawet nie wiem, czy to możliwe.Tensorflow: Jak uzyskać tensor po imieniu?

Mam funkcję, która tworzy mój wykres:

def create_structure(tf, x, input_size,dropout):  
with tf.variable_scope("scale_1") as scope: 
    W_S1_conv1 = deep_dive.weight_variable_scaling([7,7,3,64], name='W_S1_conv1') 
    b_S1_conv1 = deep_dive.bias_variable([64]) 
    S1_conv1 = tf.nn.relu(deep_dive.conv2d(x_image, W_S1_conv1,strides=[1, 2, 2, 1], padding='SAME') + b_S1_conv1, name="Scale1_first_relu") 
. 
. 
. 
return S3_conv1,regularizer 

Chcę uzyskać dostęp do zmiennej S1_conv1 poza tą funkcją. Próbowałem:

with tf.variable_scope('scale_1') as scope_conv: 
tf.get_variable_scope().reuse_variables() 
ft=tf.get_variable('Scale1_first_relu') 

Ale to daje mi błąd:

ValueError: Under-sharing: Zmienna scale_1/Scale1_first_relu nie istnieje, niedozwolone. Czy chcesz ustawić ponowne użycie = Brak w VarScope?

Ale to działa:

with tf.variable_scope('scale_1') as scope_conv: 
tf.get_variable_scope().reuse_variables() 
ft=tf.get_variable('W_S1_conv1') 

mogę obejść ten problem z

return S3_conv1,regularizer, S1_conv1 

ale nie chcę tego robić.

Myślę, że moim problemem jest to, że S1_conv1 nie jest zmienną, to tylko tensor. Czy istnieje sposób, aby zrobić to, co chcę?

Odpowiedz

37

Istnieje funkcja tf.Graph.get_tensor_by_name(). Na przykład:

import tensorflow as tf 

c = tf.constant([[1.0, 2.0], [3.0, 4.0]]) 
d = tf.constant([[1.0, 1.0], [0.0, 1.0]]) 
e = tf.matmul(c, d, name='example') 

with tf.Session() as sess: 
    test = sess.run(e) 
    print e.name #example:0 
    test = tf.get_default_graph().get_tensor_by_name("example:0") 
    print test #Tensor("example:0", shape=(2, 2), dtype=float32) 
+1

Dla odniesienia, jeśli potrzebujesz PO zamiast tensora: http://stackoverflow.com/questions/42685994/how-to-get-a-tensorflow-op-by-name –

+0

@apfalz Jak dotrzeć "przykład: 0" dla nazwy tensora? – Bosen

+0

Nie jestem pewien, czy dostaję twoje pytanie, ale w powyższym przykładzie, jeśli wydrukujesz 'e.nazwa', będziesz wiedział, że nazwa to' przykład: 0'. Tensorflow dodaje ': 0' do podanej nazwy. – apfalz

21

Wszystkie tensory mają nazwy ciągów, które można zobaczyć w następujący sposób

[tensor.name for tensor in tf.get_default_graph().as_graph_def().node] 

Gdy znasz nazwę można sprowadzić tensor korzystając <name>:0 (0 odnosi się do punktu końcowego, który jest nieco zbędny)

Na przykład jeśli zrobisz to

tf.constant(1)+tf.constant(2) 

mieć następujące nazwy Tensor

[u'Const', u'Const_1', u'add'] 

Więc można pobrać wyjście Ponadto jako

sess.run('add:0') 

Uwaga, jest to część nie jest częścią publicznych API. Automatycznie generowane nazwy tensorów napisów są szczegółami implementacji i mogą ulec zmianie.

+0

Dzięki za pomoc, ale to nie jest mój problem. Mój tensor został wyraźnie nazwany "" Scale1_first_relu ", ale nie mogę uzyskać odniesienia do niego poza funkcją, w której został zadeklarowany, ale mogę uzyskać odniesienie do zmiennej" W_S1_conv1 ". Czy tensory są lokalne? istnieją one poza funkcją, w której są tworzone? – protas

+0

Tensory istnieją na wykresie.Jeśli korzystasz z domyślnego wykresu, jest on dzielony między wszystkie funkcje w tym samym wątku. '' Scale1_first_relu' jest raczej "sugestia" niż rzeczywistą nazwę. Prawdziwa nazwa użytkownika na wykresie może mieć prefiks, jeśli został utworzony wewnątrz zakresu lub może mieć przyrostek dodany automatycznie do dedupowania. Wystarczy wydrukować nazwę tensorów na wykresie używając powyższej receptury i wyszukać tensory zawierające ' Scale1_first_relu' string –

+0

Wypróbowałem to już ... Kompletna nazwa to "scale_1 \ Scale1_first_relu: 0". Wyszukiwanie tego nadal daje mi błąd, ale wyszukuje "scale_1 \ W_S1_conv1" działa tak, jakby tensor już nie istniał. – protas