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