Я определяю такой тензор:
x = tf.get_variable("x", [100])
Но когда я пытаюсь напечатать форму тензора:
print( tf.shape(x) )
Я получаю Тензор ( "Форма: 0", shape = (1,), dtype = int32), почему результат вывода не должен быть форма = (100)
Я определяю такой тензор:
x = tf.get_variable("x", [100])
Но когда я пытаюсь напечатать форму тензора:
print( tf.shape(x) )
Я получаю Тензор ( "Форма: 0", shape = (1,), dtype = int32), почему результат вывода не должен быть форма = (100)
tf.shape(input, name = None) возвращает 1-D целочисленный тензор, представляющий форму ввода.
Вы ищете: x.get_shape()
, который возвращает TensorShape
переменной x
.
Разъяснение:
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, которую я нашел более полезным, и я попытался перефразировать его здесь.
Просто быстрый пример, основанный на ответе @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]
Подобный вопрос хорошо объяснен в Часто задаваемые вопросы 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()
, и это можно вычислить где угодно.
Вы можете получить форму, как в 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]