В Tensorflow C ++ TensorShape API, что эквивалентно Python’s None?

Предположим, у меня есть тензор, созданный с помощью 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.

2

Решение

Обновить: Теперь есть 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({}), Несмотря на то, что это эквивалентно скаляру, по историческим причинам это рассматривается как форма, полностью не ограниченная.

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]