Ответ 1
Прежде чем объяснять различие между тензорами и переменными, мы должны быть точными в отношении слова "тензор" в контексте TensorFlow:
-
В API Python объект
tf.Tensor
представляет собой символический результат операции TensorFlow. Например, в выраженииt = tf.matmul(x, y)
t
- объектtf.Tensor
представляющий результат умноженияx
иy
(которые сами могут быть символическими результатами других операций, конкретные значения, такие как массивы NumPy, или переменные).В этом контексте "символический результат" более сложный, чем указатель на результат операции. Он более аналогичен объекту функции, который при вызове (т.
tf.Session.run()
) запускает необходимое вычисление для получения результата этой операции и возвращает его вам как конкретное значение (например, NumPy массив). -
В API C++ объект
tensorflow::Tensor
представляет конкретное значение многомерного массива. Например, ядроMatMul
принимает два двумерныхtensorflow::Tensor
objects в качестве входных данных и создает в качестве вывода один двумерныйtensorflow::Tensor
object.
Это различие немного запутанно, и мы можем выбрать разные имена, если мы начнем (в API других языков мы предпочитаем имя Output
для символического результата и Tensor
для конкретного значения).
Аналогичное различие существует для переменных. В API Python tf.Variable
является символическим представлением переменной, которая имеет методы для создания операций, которые считывают текущее значение переменной и присваивают ей значения. В реализации C++ объект tensorflow::Var
является оберткой вокруг общего, изменяемого tensorflow::Tensor
.
Исходя из этого контекста, мы можем решить ваши конкретные вопросы:
-
В чем смысл "буферов в памяти"?
Буфер в памяти - это просто смежная область памяти, которая была распределена с помощью распределителя TensorFlow.
tensorflow::Tensor
Объектыtensorflow::Tensor
содержат указатель на буфер памяти, в котором хранятся значения этого тензора. Буфер может находиться в памяти хоста (т.е. Доступен из ЦП) или памяти устройства (например, доступен только с графического процессора), а TensorFlow имеет операции перемещения данных между этими ячейками памяти. -
В чем смысл "ручки"?
В объяснении в документе слово "дескриптор" используется несколькими разными способами, которые немного отличаются от того, как TensorFlow использует этот термин. В документе используется "символический дескриптор" для ссылки на объект
tf.Tensor
и "постоянный, изменяемый дескриптор" для ссылки на объектtf.Variable
. Кодовая база TensorFlow использует "дескриптор" для обозначения имени объекта с сохранением состояния (например,tf.FIFOQueue
илиtf.TensorArray
), который может передаваться без копирования всех значений (т.tf.FIFOQueue
tf.TensorArray
по ссылке). -
Верно ли мое первоначальное предположение о внутреннем тензоре?
Ваше предположение наиболее близко соответствует определению тензорного потока (C++)
tensorflow::Tensor
. Объектtf.Tensor
(Python) более сложный, поскольку он относится к функции вычисления значения, а не к самому значению. -
Какова существенная внутренняя разница в реализации между тензором и переменной?
В C++
tensorflow::Tensor
иtensorflow::Tensor
tensorflow::Var
очень похожи; единственное отличие заключается в том, что уtensorflow::Var
также естьmutex
который можно использовать для блокировки переменной при ее обновлении.В Python существенное различие заключается в том, что
tf.Tensor
реализуется как граф потока данных, и онtf.Session.run()
только для чтения (т.tf.Session.run()
).tf.Variable
может считываться (т.tf.Variable
его операцию чтения) и записывать (например, путем выполнения операции присваивания).Почему они заявлены по-разному, и почему эта разница важна для TensorFlow?
Тензоры и переменные служат различным целям.
tf.Tensor
(tf.Tensor
objects) могут представлять собой сложные композиции математических выражений, такие как функции потерь в нейронной сети или символические градиенты. Переменные представляют состояние, которое обновляется со временем, например, весовые матрицы и сверточные фильтры во время обучения. Хотя в принципе вы могли бы представить эволюционирующее состояние модели без переменных, вы получили бы очень большое (и повторяющееся) математическое выражение, поэтому переменные предоставляют удобный способ материализовать состояние модели и, например, долю это с другими машинами для параллельного обучения.