Подтвердить что ты не робот

Tf.shape() получает неправильную форму в тензорном потоке

Я определяю такой тензор:

x = tf.get_variable("x", [100])

Но когда я пытаюсь напечатать форму тензора:

print( tf.shape(x) )

Я получаю Тензор ( "Форма: 0", shape = (1,), dtype = int32), почему результат вывода не должен быть форма = (100)

4b9b3361

Ответ 1

tf.shape(input, name = None) возвращает 1-D целочисленный тензор, представляющий форму ввода.

Вы ищете: x.get_shape(), который возвращает TensorShape переменной x.

Ответ 2

Разъяснение:

tf.shape(x) создает op и возвращает объект, который обозначает вывод сконструированного op, который является тем, что вы сейчас печатаете. Чтобы получить форму, запустите операцию в сеансе:

matA = tf.constant([[7, 8], [9, 10]])
shapeOp = tf.shape(matA) 
print(shapeOp) #Tensor("Shape:0", shape=(2,), dtype=int32)
with tf.Session() as sess:
   print(sess.run(shapeOp)) #[2 2]

credit: Посмотрев на приведенный выше ответ, я увидел ответ на функцию tf.rank в Tensorflow, которую я нашел более полезным, и я попытался перефразировать его здесь.

Ответ 3

Просто быстрый пример, основанный на ответе @Salvador Dali.

a = tf.Variable(tf.zeros(shape=(2, 3, 4)))
print("a v1", tf.shape(a))
print("a v2", a.get_shape())
with tf.Session() as sess:
    print("a v3", sess.run(tf.shape(a)))

Выход будет:

a v1 Tensor("Shape:0", shape=(3,), dtype=int32)
a v2 (2, 3, 4)
a v3 [2 3 4]

Ответ 4

Подобный вопрос хорошо объяснен в Часто задаваемые вопросы TF:

В TensorFlow тензор имеет как статическую (предполагаемую) форму, так и динамическая (истинная) форма. Статическая форма может быть прочитана с помощью tf.Tensor.get_shape: эта форма выводится из операций которые были использованы для создания тензора и могут быть частично завершены. Если статическая форма не полностью определена, динамическая форма тензора t может быть определено путем оценки tf.shape(t).

Итак tf.shape() возвращает вам тензор, всегда будет иметь размер shape=(N,) и может быть рассчитан в сеансе:

a = tf.Variable(tf.zeros(shape=(2, 3, 4)))
with tf.Session() as sess:
    print sess.run(tf.shape(a))

С другой стороны, вы можете извлечь статическую форму с помощью x.get_shape().as_list(), и это можно вычислить где угодно.

Ответ 5

Вы можете получить форму, как в NumPy, с помощью your_tensor.shape, как в следующем примере.

In [11]: tensr = tf.constant([[1, 2, 3, 4, 5], [2, 3, 4, 5, 6]])

In [12]: tensr.shape
Out[12]: TensorShape([Dimension(2), Dimension(5)])

In [13]: list(tensr.shape)
Out[13]: [Dimension(2), Dimension(5)]

In [16]: print(tensr.shape)
(2, 5)

Кроме того, этот пример для тензоров, которые могут быть eval uated.

In [33]: tf.shape(tensr).eval().tolist()
Out[33]: [2, 5]