2015-11-11 12 views
15

W niektórych miejscach zobaczyłem składnię, w której zmienne są inicjowane nazwami, czasami bez nazw. Na przykład:Dlaczego nazywamy zmienne w Tensorflow?

# With name 
var = tf.Variable(0, name="counter") 

# Without 
one = tf.constant(1) 

Jaki jest sens nazywania zmiennych var"counter"?

Odpowiedz

27

Parametr name jest opcjonalny (można tworzyć zmienne i stałe z lub bez niego), a zmienna używana w programie nie jest od niego zależna. Nazwy mogą być pomocne w kilku miejscach:

Gdy chcesz zapisać lub przywrócić zmienne (po wyliczeniu można save them to a binary file). Od docs:

By default, it uses the value of the Variable.name property for each variable

matrix_1 = tf.Variable([[1, 2], [2, 3]], name="v1") 
matrix_2 = tf.Variable([[3, 4], [5, 6]], name="v2") 
init = tf.initialize_all_variables() 

saver = tf.train.Saver() 

sess = tf.Session() 
sess.run(init) 
save_path = saver.save(sess, "/model.ckpt") 
sess.close() 

Niemniej masz zmienne matrix_1, matrix_2 są one zapisywane jako v1, v2 w pliku.

Również nazwy są używane w TensorBoard, aby ładnie wyświetlać nazwy krawędzi. Można nawet group them by using the same scope:

import tensorflow as tf 

with tf.name_scope('hidden') as scope: 
    a = tf.constant(5, name='alpha') 
    W = tf.Variable(tf.random_uniform([1, 2], -1.0, 1.0), name='weights') 
    b = tf.Variable(tf.zeros([1]), name='biases') 
7

Można sobie wyobrazić, Python nazw i nazw TensorFlow postaci dwóch równoległych wszechświatów. Nazwy w przestrzeni TensorFlow są w rzeczywistości "prawdziwymi" atrybutami należącymi do dowolnych zmiennych TensorFlow, podczas gdy nazwy w przestrzeni Python są jedynie tymczasowymi wskaźnikami wskazującymi zmienne TensorFlow podczas tego uruchomienia skryptu. Z tego powodu przy zapisywaniu i przywracaniu zmiennych używane są tylko nazwy TensorFlow, ponieważ przestrzenie nazw Pythona już nie istnieją po skasowaniu skryptu, ale przestrzeń nazw Tensorflow nadal znajduje się w zapisanych plikach.

0

Kolejny przypadek użycia może być:

rozważyć następujący kod, a jego produkcja

def f(): 
a = tf.Variable(np.random.normal(), dtype = tf.float32, name = 'test123') 

def run123(): 
    f() 
    init = tf.global_variables_initializer() 
    with tf.Session() as sess123: 
     sess123.run(init) 
     print(sess123.run(fetches = ['test123:0'])) 
     print(sess123.run(fetches = [a])) 

run123() 

wyjściowa:

[0,10108799]

NameError Traceback (najnowsza rozmowę ostatni) in() 10 print (sess123.run (fetches = [a])) ---> 12 run123()

w run123() 8 sess123.run (startowych) 9 druku (sess123.run (pobiera = [ 'test123: 0'])) ---> 10 druku (sess123.run (pobiera = [a])) run123 (12)

NameError: nazwa 'a' nie definiuje

'a', zgodnie z definicją w zakresie f(), niedostępne poza jego zakresem, tj. w run123(), ale domyślny wykres musi się do nich odwoływać z czymś, tak, że domyślny wykres może odnosić się do, w razie potrzeby, w różnych zakresach i to jest, gdy jego "na mnie "przychodzi poręcznie

Powiązane problemy