Почему мы называем переменные в Tensorflow?
В некоторых местах я видел синтаксис, где переменные инициализируются именами, иногда без имен. Например:
# With name
var = tf.Variable(0, name="counter")
# Without
one = tf.constant(1)
В чем смысл именования переменной var
"counter"
?
Ответы
Ответ 1
Параметр name
не является обязательным (вы можете создавать переменные и константы с или без него), и переменная, которую вы используете в вашей программе, не зависит от нее. Имена могут быть полезны в нескольких местах:
Если вы хотите сохранить или восстановить переменные (вы можете сохранить их в двоичном файле после вычисления). Из docs:
По умолчанию используется значение свойства Variable.name для каждого Переменная
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()
Тем не менее у вас есть переменные matrix_1
, matrix_2
они сохраняются как v1
, v2
в файле.
Также имена используются в TensorBoard, чтобы хорошо отображать имена ребер. Вы можете даже группировать их, используя ту же область:
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')
Ответ 2
Вы можете представить пространство имен Python и пространство имен TensorFlow как две параллельные юниверсы. Имена в пространстве TensorFlow фактически являются "реальными" атрибутами, принадлежащими к любым переменным TensorFlow, тогда как имена в пространстве Python являются лишь временными указателями, указывающими на переменные TensorFlow во время этого запуска вашего script. Именно поэтому при сохранении и восстановлении переменных используются только имена TensorFlow, поскольку пространство имен Python больше не существует после завершения script, но пространство имен Tensorflow все еще присутствует в ваших сохраненных файлах.
Ответ 3
Другой вариант использования может быть:
рассмотрим следующий код и его вывод
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()
выход:
[0.10108799]
NameError Traceback (последний последний вызов)
в() 10 print (sess123.run(fetches = [a])) 11
--- > 12 run123()
в run123() 8 sess123.run(init) 9 print (sess123.run(fetches = ['test123: 0']))
--- > 10 print (sess123.run(fetches = [a])) 11 12 run123()
NameError: имя 'a' не определено
"a", как определено в области f(), недоступно вне его области видимости, т.е. в run123(), но граф по умолчанию должен ссылаться на них с чем-то, чтобы можно было ссылаться на график по умолчанию по мере необходимости, в разных областях, и именно тогда его "имя" оказывается удобным