Я новичок в TensorFlow. Пока я читаю документы. Я нашел термин tensor
действительно запутанным.
Какая связь между tensor
и Variable
, tensor
vs tf.constant
, 'тензор' vs tf.placeholder
? Являются ли они все типы тензоров?
Как понять термин "тензор" в TensorFlow?
Ответ 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
, которые могут быть выбраны индивидуально.
Ответ 2
Из glossary:
A Тензор - это типизированный многомерный массив. Например, 4-мерный массив чисел с плавающей запятой, представляющий мини-пакет изображений с размерами [партия, высота, ширина, канал].
В принципе, каждый datastrong > является тензором в TensorFlow (отсюда и название):
- заполнителями являются тензоры, к которым вы можете подать значение (с аргументом
feed_dict
вsess.run()
) - Переменные - это тензоры, которые вы можете обновить (с помощью
var.assign()
). С технической точки зрения,tf.Variable
не является подклассомtf.Tensor
, хотя -
tf.constant
- это самый простой тензор, который содержит фиксированное значение, указанное при его создании.
Однако на графике каждая node является операцией, которая может иметь тензоры в качестве входов или выходов.
Ответ 3
Как уже упоминалось другими, да, это все тензоры.
То, как я это понимал, - это сначала визуализировать и понять тензоры 1D, 2D, 3D, 4D, 5D и 6D, как на рисунке ниже. (источник: knoldus)
Теперь, в контексте TensorFlow, вы можете представить граф вычислений, как тот, который приведен ниже.
Здесь здесь принимают два тензора a
и b
; умножает тензоры на себя и затем добавляет результат этих умножений для получения тензора результатов t3
. И эти умножения и сложение Op
происходят в узлах графа вычислений.
И эти тензоры a
и b
могут быть постоянными тензорами, переменными тензорами или заполнителями. Это не имеет значения, если они имеют одинаковый тип данных и совместимые формы (или broadcast
, способные к нему) для выполнения операций.