でTensorFlow に関するよくある質問、それは言う:
TensorFlow では、テンソルには静的 (推測された) 形状と動的 (実際の) 形状の両方があります。静的形状は tf.Tensor.get_shape() メソッドを使用して読み取ることができます。この形状は、テンソルの作成に使用された操作から推測され、部分的に完了している可能性があります。静的形状が完全に定義されていない場合は、tf.shape(t) を評価することで、Tensor t の動的形状を決定できます。
しかし、静的形状と動的形状の関係をまだ完全に理解できていません。それらの違いを示す例はありますか? よろしくお願いします。
ベストアンサー1
テンソルの形状は実行時に計算される値に依存することがあります。次の例を見てみましょう。ここでは、は次x
のように定義されます。tf.placeholder()
4 つの要素を持つベクトル:
x = tf.placeholder(tf.int32, shape=[4])
print x.get_shape()
# ==> '(4,)'
の値はx.get_shape()
の静的形状でありx
、(4,
) は長さ 4 のベクトルであることを意味します。次に、tf.unique()
opにx
y, _ = tf.unique(x)
print y.get_shape()
# ==> '(?,)'
は長さが不明なベクトルである(?,)
ことを意味します。なぜ不明なのでしょうか?y
tf.unique(x)
は から一意の値を返しますが、は であるためx
の値は不明であり、値を入力するまで値は設定されません。2 つの異なる値を入力するとどうなるか見てみましょう。x
tf.placeholder()
sess = tf.Session()
print sess.run(y, feed_dict={x: [0, 1, 2, 3]}).shape
# ==> '(4,)'
print sess.run(y, feed_dict={x: [0, 0, 0, 0]}).shape
# ==> '(1,)'
これで、テンソルが静的および動的に異なる形状を持つことができることが明確になったと思います。動的形状は常に完全に定義されており、?
次元がありませんが、静的形状はそれほど明確ではありません。これが、TensorFlowが次のような操作をサポートできる理由ですtf.unique()
。tf.dynamic_partition()
は、可変サイズの出力が可能で、高度なアプリケーションで使用されます。
最後に、tf.shape()
op はテンソルの動的な形状を取得し、それを TensorFlow 計算で使用するために使用できます。
z = tf.shape(y)
print sess.run(z, feed_dict={x: [0, 1, 2, 3]})
# ==> [4]
print sess.run(z, feed_dict={x: [0, 0, 0, 0]})
# ==> [1]