私はこのようなテンソルを定義します:
x = tf.get_variable("x", [100])
しかし、テンソルの形状を印刷しようとすると:
print( tf.shape(x) )
Tensor( "Shape:0"、shape =(1、)、dtype = int32)、出力の結果がshape =(100)にならない理由
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 /
明確化:
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
メソッドを使用して読み取ることができます。この形状は、テンソルの作成に使用された操作から推測され、部分的に完了する場合があります。静的な形状が完全に定義されていない場合、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()
を使用して静的な形状を抽出でき、これはどこでも計算できます。
単純に、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)
また、この例は、eval
uatedにできるテンソル用です。
In [33]: tf.shape(tensr).eval().tolist()
Out[33]: [2, 5]