2016-05-08 11 views
18

、それは言う:TensorFlowでTensorFlowの静的形状と動的形状を理解するには? <a href="https://www.tensorflow.org/versions/r0.8/resources/faq.html#tensor-shapes">TensorFlow FAQ</a>で

を、テンソルは、静的(推測)形状と 動的(真)形状の両方を有しています。静的形状は、 tf.Tensor.get_shape()メソッドを使用して読み取ることができます。この形状は、テンソルを作成するために使用された 操作から推測され、部分的には になる可能性があります。静的形状が完全に定義されていない場合、tf.shape(t)を評価することによって、テンソルtの動的形状 を求めることができます。

しかし、静的形状と動的形状との関係を完全に理解することはできません。その違いを示す例はありますか?ありがとう。

答えて

27

時々テンソルの形状は、実行時に計算される値に依存します。 xは、4つの要素をtf.placeholder()ベクトルとして定義されるのは、以下の例を見てみましょう:

x = tf.placeholder(tf.int32, shape=[4]) 
print x.get_shape() 
# ==> '(4,)' 

x.get_shape()の値はxの静的な形状であり、(4,)は、長さ4のベクトルであることを意味します。今度はx

y, _ = tf.unique(x) 
print y.get_shape() 
# ==> '(?,)' 

(?,)tf.unique()オペアンプを適用できyが未知の長さのベクトルであることを意味します。なぜそれは不明ですか? tf.unique(x)xからユニークな値を返します。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,)' 

うまくいけば、これはそれが明確なテンソルが異なる静的および動的な形状を持つことができることになり:あなたは2つの異なる値を養うならば何が起こるか見てみましょう。動的形状は常に完全に定義されています— ?の寸法は—ですが、静的形状はあまり具体的ではありません。これは、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] 
+0

Iが学習可能層と動的形状を使用することができますか?より小さい入力を使用すると、ウェイトはどうなりますか? – nouveau

+3

通常、学習可能なパラメータの形状は静的に知る必要がありますが、入力は可変バッチサイズを持つことができます。 – mrry

関連する問題