programing

tf.shape ()가 tensorflow에서 잘못된 모양을 얻습니다.

nasanasas 2021. 1. 10. 17:24
반응형

tf.shape ()가 tensorflow에서 잘못된 모양을 얻습니다.


나는 다음과 같이 텐서를 정의합니다.

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

그러나 텐서의 모양을 인쇄하려고 할 때 :

print( tf.shape(x) )

내가 할 텐서를 ( "모양 : 0", 모양 = (1), DTYPE = INT32) , 왜 출력의 결과가 = 모양 안 (100)


tf.shape (input, name = None) 은 입력의 모양을 나타내는 1 차원 정수 텐서를 반환합니다.

: 당신이 찾고있는 x.get_shape()그 반환 TensorShapex변수입니다.

업데이트 :이 답변으로 인해 Tensorflow의 동적 / 정적 모양을 명확히하기 위해 기사를 작성했습니다. https://pgaleone.eu/tensorflow/2018/07/28/understanding-tensorflow-tensors-shape-static-dynamic/


설명:

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]

신용 : 위의 답변을 살펴본 후 Tensorflow의 tf.rank 함수에 대한 답변을 보았고 더 도움이되었으며 여기에서 다시 표현해 보았습니다.


간단한 예를 들어 명확하게 설명합니다.

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

출력은 다음과 같습니다.

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

또한 이것은 도움이 될 것입니다 : TensorFlow에서 정적 모양과 동적 모양을 이해하는 방법?


비슷한 질문이 TF FAQ에 잘 설명되어 있습니다 .

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()할 수 있으며 이는 어디에서나 계산할 수 있습니다.


간단히을 사용 tensor.shape하여 정적 모양 을 얻습니다 .

In [102]: a = tf.placeholder(tf.float32, [None, 128])

# returns [None, 128]
In [103]: a.shape.as_list()
Out[103]: [None, 128]

동적 모양 을 얻으려면 다음을 사용하십시오 tf.shape().

dynamic_shape = tf.shape(a)

You can also get the shape as you'd in NumPy with your_tensor.shape as in the following example.

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)

Also, this example, for tensors which can be evaluated.

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

ReferenceURL : https://stackoverflow.com/questions/37085430/tf-shape-get-wrong-shape-in-tensorflow

반응형