Почему мы называем переменные в 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(), но граф по умолчанию должен ссылаться на них с чем-то, чтобы можно было ссылаться на график по умолчанию по мере необходимости, в разных областях, и именно тогда его "имя" оказывается удобным