Ответ 1
TensorFlow не имеет первоклассных объектов Tensor, что означает, что в базовом графе, который выполняется средой выполнения, нет понятия Tensor
. Вместо этого граф состоит из узлов op, связанных друг с другом, представляющих операции. Операция выделяет память для своих выходов, которые доступны в конечных точках :0
, :1
и т.д., И вы можете думать о каждой из этих конечных точек как Tensor
. Если у вас Tensor
соответствует nodename:0
, вы можете получить его значение как sess.run(tensor)
или sess.run('nodename:0')
. Гранулярность выполнения происходит на уровне операции, поэтому метод run
будет выполнять op, который будет вычислять все конечные точки, а не только конечную точку :0
. Возможно иметь Op node без выходов (например, tf.group
), и в этом случае нет связанных с ним тензоров. Невозможно иметь тензоры без базовой Op node.
Вы можете проверить, что происходит в базовом графе, сделав что-то вроде этого
tf.reset_default_graph()
value = tf.constant(1)
print(tf.get_default_graph().as_graph_def())
Итак, с tf.constant
вы получаете одну операцию node, и вы можете ее извлечь, используя sess.run("Const:0")
или sess.run(value)
Аналогично, value=tf.placeholder(tf.int32)
создает регулярный node с именем Placeholder
, и вы можете его подавать как feed_dict={"Placeholder:0":2}
или feed_dict={value:2}
. Вы не можете подавать и извлекать заполнитель в том же самом вызове session.run
, но вы можете увидеть результат, добавив tf.identity
node сверху и извлекая его.
Для переменной
tf.reset_default_graph()
value = tf.Variable(tf.ones_initializer()(()))
value2 = value+3
print(tf.get_default_graph().as_graph_def())
Вы увидите, что он создает два узла Variable
и Variable/read
, конечная точка :0
является допустимым значением для извлечения на обоих этих узлах. Однако Variable:0
имеет специальный тип ref
, означающий, что он может использоваться как вход для мутирующих операций. Результатом вызова Python tf.Variable
является объект Python Variable
, и есть какая-то магия Python для замены Variable/read:0
или Variable:0
в зависимости от того, нужна ли мутация. Поскольку большинство операционных систем имеют только одну конечную точку, :0
отбрасывается. Другой пример: Queue
- close()
метод создаст новый Close
op node, который подключится к Queue
op. Суммировать - операции с объектами python, такими как Variable
и Queue
, сопоставляются с различными базовыми узлами TensorFlow op в зависимости от использования.
Для ops, таких как tf.split
или tf.nn.top_k
, которые создают узлы с несколькими конечными точками, вызов Python session.run
автоматически завершает вывод в tuple
или collections.namedtuple
объектов Tensor
, которые могут быть выбраны индивидуально.