時々テンソルの形状は、実行時に計算される値に依存します。 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]
Iが学習可能層と動的形状を使用することができますか?より小さい入力を使用すると、ウェイトはどうなりますか? – nouveau
通常、学習可能なパラメータの形状は静的に知る必要がありますが、入力は可変バッチサイズを持つことができます。 – mrry