web-dev-qa-db-ja.com

tf.shape()テンソルフローで間違った形状を取得

私はこのようなテンソルを定義します:

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

しかし、テンソルの形状を印刷しようとすると:

print( tf.shape(x) )

Tensor( "Shape:0"、shape =(1、)、dtype = int32)、出力の結果がshape =(100)にならない理由

51
Nils Cao

tf.shape(input、name = None) は、入力の形状を表す1次元整数テンソルを返します。

探しているのは、TensorShape変数のxを返すx.get_shape()です。

更新:この回答により、Tensorflowの動的/静的な形状を明確にする記事を書きました: https://pgaleone.eu/tensorflow/2018/07/28/understanding-tensorflow-tensors-shape-static- dynamic /

106
nessuno

明確化:

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関数 に対する答えが見つかりました。

10
Lazar Valkov

わかりやすくするための簡単な例:

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の静的形状と動的形状を理解する方法?

6
mrgloom

同様の質問は TF FAQ でうまく説明されています:

TensorFlowでは、テンソルは静的(推定)形状と動的(真)形状の両方を持ちます。静的な形状は、tf.Tensor.get_shapeメソッドを使用して読み取ることができます。この形状は、テンソルの作成に使用された操作から推測され、部分的に完了する場合があります。静的な形状が完全に定義されていない場合、Tensor 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()を使用して静的な形状を抽出でき、これはどこでも計算できます。

3
Salvador Dali

単純に、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)

次の例のように、your_tensor.shapeを使用して、NumPyで作成したとおりの形状を取得することもできます。

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)

また、この例は、evaluatedにできるテンソル用です。

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