Я новичок в 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, способные к нему) для выполнения операций.

