Предположим, у меня есть тензор, созданный с помощью Python API Tensorflow, как показано ниже:
x = tf.placeholder("float", shape=[None, inputLen])
Я хотел бы создать эквивалент tenorflow :: Tensor этого в C ++, чтобы я мог запустить обученный граф, который принимает x в качестве входных данных. Что мне делать с первым измерением входной формы, которая в C ++ имеет тип tenorflow :: TensorShape?
Если я сделаю:
tensorflow::TensorShape inputShape;
inputShape.AddDim(0);
inputShape.AddDim(inputLen);
похоже, что это не работает, потому что num_elements становится 0, что не является ожидаемым значением inputLen.
Обновить: Теперь есть tensorflow::PartialTensorShape
класс, который может представлять фигуры с неизвестными размерами или неизвестного ранга. Значение -1
используется для представления неизвестного значения (т.е. что None
представляет в Python). Он используется в коде вывода формы C ++ и может быть указан в атрибуте формы с типом или tf.TensorShape
прото.
TL; DR: В C ++ нет эквивалента, потому что часть C ++ в TensorFlow проверяет фигуры только во время выполнения, когда они полностью определены; в то время как часть Python проверяет фигуры во время построения графа, когда они могут быть не полностью определены.
Там нет эквивалента tf.Dimension(None)
(то есть неизвестное измерение) в C ++ tensorflow::TensorShape
учебный класс. Это потому что (C ++) tensorflow::TensorShape
класс описывает форму (C ++) tensorflow::Tensor
, который представляет собой бетон значение для тензора и, следовательно, должно иметь полностью определенную форму. Питон tf.Tensor
класс представляет собой символический тензор, представляющий выходные данные операции, которую еще предстоит выполнить, и поэтому он может иметь форму, неизвестную в одном или нескольких измерениях.
Если вы используете C ++ API чтобы накормить заполнитель, вы должны просто создать новый tensorflow::Tensor
с полностью определенной формой для каждого отдельного значения, которое вы передаете заполнителю (в Session::Run()
вызов). Однако обратите внимание, что API C ++ не проверяет формы заполнителей, поэтому вы должны вручную убедиться, что форма соответствует ожидаемой форме для заполнителя.
Если вы строите график с использованием API C ++, и вы хотите определять заполнитель с неизвестным размером в одном или нескольких измерениях, вы должны определить узел заполнителя с его shape
атрибут установлен на tensorflow::TensorShape({})
, Несмотря на то, что это эквивалентно скаляру, по историческим причинам это рассматривается как форма, полностью не ограниченная.
Других решений пока нет …