2016-06-16 3 views
22

Я новичок в TensorFlow. Пока я читаю документы. Я нашел термин tensor действительно запутанным. Какая связь между tensor и Variable, tensor vs tf.constant, 'tensor' vs tf.placeholder? Являются ли они все типы тензоров?Как понять термин «тензор» в TensorFlow?

+0

Да, тензор подобен объекту, он может быть строкой переменной и т. Д. –

+0

Я думаю, что понимание того, что ** данные ** и ** операции ** находятся в TensorFlow, было бы полезно для этого вопроса , – zhy

ответ

42

TensorFlow не имеет первоклассных объектов тензора, что означает отсутствие понятия Tensor в базовом графе, который выполняется во время выполнения. Вместо этого граф состоит из узлов op, связанных друг с другом, представляющих операции. Операция выделяет память для своих выходов, которые доступны в конечных точках :0, :1 и т. Д., И вы можете думать о каждой из этих конечных точек как Tensor. Если у вас есть tensor, соответствующий nodename:0, вы можете получить его значение как sess.run(tensor) или sess.run('nodename:0'). Гранулярность выполнения происходит на уровне операции, поэтому метод run будет выполнять op, который будет вычислять все конечные точки, а не только конечную точку :0. Возможно иметь узел Op без выходов (например, tf.group), и в этом случае нет связанных с ним тензоров. Невозможно иметь тензоры без базового узла Op.

Вы можете проверить, что происходит в основной графике, делая что-то вроде этого

tf.reset_default_graph() 
value = tf.constant(1) 
print(tf.get_default_graph().as_graph_def()) 

Так с tf.constant вы получаете единый узел операции, и вы можете получить его с помощью sess.run("Const:0") или sess.run(value)

Аналогично, value=tf.placeholder(tf.int32) создает регулярный узел с именем Placeholder, и вы можете его подавать как feed_dict={"Placeholder:0":2} или feed_dict={value:2}. Вы не можете подавать и извлекать местозаполнитель в том же session.run вызове, но вы можете увидеть результат, добавив узел tf.identity сверху и извлекая его.

Для переменной

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 в зависимости от того, нужна ли мутация. Поскольку большинство операционных систем имеют только 1 конечную точку, :0 отбрасывается. Другой пример: Queue - close() метод создаст новый узел Close op, который подключится к Queue op. Подводя итог - операции с объектами python, такие как Variable и Queue, отображают различные базовые узлы TensorFlow op в зависимости от использования.

Для опс как tf.split или tf.nn.top_k, которые создают узлы с несколькими конечными точками, session.run вызов Python автоматически завершает выход в tuple или collections.namedtuple из Tensor объектов, которые могут быть выбраны индивидуально.

+0

Что вы подразумеваете под «первоклассными тензорными объектами»? Существует класс под названием «tf.Tensor». Мог бы объяснить пример, если это возможно. –

+0

нет тензоров в базовом графике, просто операторы, связанные с другими операциями –

+0

, как вы получаете доступ к операции? Вы можете напрямую обращаться к входам и выходам операции? –

9

От glossary:

Тензор типизированная многомерный массив. Например, 4-мерный массив чисел с плавающей запятой, представляющий мини-пакет изображений с размерами [партия, высота, ширина, канал].

В принципе, каждый данных является Tensor в TensorFlow (отсюда и название):

  • заполнителей тензоры, к которому вы можете кормить значение (с feed_dict аргументом в sess.run())
  • Переменные - это тензоры, которые вы можете обновить (с var.assign()). Технически говоря, tf.Variable не подкласс tf.Tensor хотя
  • tf.constant только самый основной Tensor, который содержит фиксированное значение, заданное при создании его

Однако, в графе, каждый узел операция, которая может иметь тензоры в качестве входов или выходов.

+3

Я не согласен. Если вы посмотрите на раздел 2 белой бумаги tensorflow: «В графе TensorFlow каждый узел имеет ноль или более входов и ноль или более выходов и представляет собой экземпляр операции». Переменные, константы и заполнители - это узлы, ака, экземпляр ОПЕРАЦИЙ точно так же, как tf.mul или tf.add. Я думаю, что они производят тензоры в качестве выхода, но сами они не являются тензорами. – ZijunLost

+0

Ну да, график состоит из операций, которые проходят Тензоры между собой.Я обновлю свой тензор, чтобы объяснить операции, связанные с 'tf.constant' и' tf.placeholder' –

+2

, спасибо, но я по-прежнему считаю, что лучше назвать заполнители или константы «операциями», которые производят тензоры, вместо того, чтобы говорить «заполнители» тензоры». Если вы прочитали документ: «TensorFlow предоставляет операцию создания заполнителя, которая должна быть загружена с данными. Для получения дополнительной информации см. Раздел« Подача данных ». – ZijunLost

1

Как уже было сказано другими, да, они все являются тензорами.

Как я понял, это сначала визуализировать и понять тензоры 1D, 2D, 3D, 4D, 5D и 6D, как на рисунке ниже. (Источник: knoldus)

tensor-definition

Теперь, в контексте TensorFlow, вы можете представить себе вычислительный график, как показано ниже.

computation-graph

Здесь, она принимает два тензора a и b как вход; умножает тензоры с самим собой, а затем добавляет результат этих умножений для получения тензора результатов t3. И эти умножения и дополнениеOp s происходит в узлах графа вычислений.

И эти тензоры a и b могут быть постоянными тензорами, переменными тензорами или заполнителями. Это не имеет значения, если они имеют один и тот же тип данных и совместимые формы (или broadcast, способные к нему) для достижения операций.

Смежные вопросы