Разница в реализации между TensorFlow Variable и TensorFlow Tensor

Прежде всего, я знаю, что здесь был задан соответствующий вопрос.

Однако этот вопрос о реализации и внутренностях. Я читал газету " Тур по TensorFlow ". Следующие два пункта цитируются оттуда:

1.

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

Это наводит меня на мысль, что Tensor - это объект, который просто хранит указатель на результат операции и, получая результат или значение тензора, просто разыменовывает этот указатель.

2.

Переменные могут быть описаны как постоянные, изменяемые дескрипторы буферов в памяти, хранящих тензоры. Как таковые, переменные характеризуются определенной формой и фиксированным типом.

В этом я запутался, потому что думал, основываясь на предыдущем пункте, что Тензор просто хранит указатель. Если бы они были просто указателями, они также могли бы быть изменяемыми.

Если быть точным, это мои вопросы:

  1. Что означает "буферы в памяти"?
  2. Что означает "ручка"?
  3. Правильно ли мое первоначальное предположение о внутренностях тензора?
  4. Какова существенная внутренняя разница реализации между тензором и переменной? Почему они объявлены по-разному и почему это различие важно для 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 объект.

С учетом этого контекста мы можем ответить на ваши конкретные вопросы:

  1. Что означает "буферы в памяти"?

    Буфер в памяти - это просто непрерывная область памяти, выделенная с помощью распределителя TensorFlow. tensorflow::Tensor объекты содержат указатель на буфер в памяти, который содержит значения этого тензора. Буфер может находиться в памяти хоста (т.е. доступной из ЦП) или памяти устройства (например, доступной только из графического процессора), и TensorFlow имеет операции для перемещения данных между этими областями памяти.

  2. Что означает "ручка"?

    В пояснении к статье слово "дескриптор" используется несколькими различными способами, которые немного отличаются от того, как TensorFlow использует этот термин. В документе используется "символическая ручка" для обозначения tf.Tensor объект и "постоянный, изменяемый дескриптор", чтобы ссылаться на tf.Variable объект. Кодовая база TensorFlow использует "дескриптор" для ссылки на имя объекта с состоянием (например, tf.FIFOQueue или же tf.TensorArray), которые могут быть переданы без копирования всех значений (т. е. вызов по ссылке).

  3. Правильно ли мое первоначальное предположение о внутренности тензора?

    Ваше предположение наиболее близко соответствует определению (C++) tensorflow::Tensor объект. (Питон) tf.Tensor Объект более сложный, потому что он ссылается на функцию для вычисления значения, а не на само значение.

  4. Какова существенная внутренняя разница реализации между тензором и переменной?

    В C++ tensorflow::Tensor а также tensorflow::Var очень похожи; единственное отличие состоит в том, что tensorflow::Var также имеет mutex это может быть использовано для блокировки переменной при ее обновлении.

    В Python существенным отличием является то, что tf.Tensor реализован в виде графа потока данных и доступен только для чтения (т. е. путем вызова tf.Session.run()). tf.Variable может быть как прочитанным (т. е. путем оценки его операции чтения), так и записанным (например, запустив операцию присвоения).

    Почему они объявлены по-разному и почему это различие важно для TensorFlow?

    Тензорные и переменные служат разным целям. Тензоры (tf.Tensor объекты) могут представлять сложные композиции математических выражений, такие как функции потерь в нейронной сети или символические градиенты. Переменные представляют состояние, которое обновляется с течением времени, например, весовые матрицы и сверточные фильтры во время обучения. Хотя в принципе вы могли бы представлять развивающееся состояние модели без переменных, в конечном итоге вы получите очень большое (и повторяющееся) математическое выражение, поэтому переменные обеспечивают удобный способ материализации состояния модели и, например, совместного использования. это с другими машинами для параллельного обучения.

Другие вопросы по тегам