2017-05-25 10 views
1

ので、documentationによると、我々は形状を変更する= validate_shapeと偽をtf.assign使用することができます任意の形状を持つように変数を更新します。これは変数の内容の形を変更しますが、get_shape()から取得できるシェイプは更新されません。たとえば:Tensorflowは、

>>> a = tf.Variable([1, 1, 1, 1]) 
>>> sess.run(tf.global_variables_initializer()) 
>>> tf.assign(a, [[1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1]], validate_shape=False).eval() 
array([[1, 1, 1, 1, 1, 1, 1], 
     [1, 1, 1, 1, 1, 1, 1]], dtype=int32) 
>>> a.get_shape() 
TensorShape([Dimension(4)]) 

これは、ネットワークの後の層は、この変数のget_shape()値にその形状をベースにすることをかなり迷惑なんです。したがって、実際の形状が正しいにもかかわらず、Tensorflowは寸法が一致しないと不平を言うでしょう。だから、どのように各変数の "信じられた"形を更新する上で任意のアイデアですか?要するに

+0

set_shapeそれを設定するのですか? –

+0

'set_shape'は、既存の形状情報に対して検証しようとします。静的形状情報が完全に不明となり、その場合には、変数を、_creating_とき、私は 'validate_shape = false'を設定したい(そして、あなたがしたい場合は、set_shape''でそれを絞り込むことができます)。 –

+0

私はそれを試してみましょう。ありがとう! –

答えて

1

:変数の静的形状を更新するset_shapeを使用します。


あなたはTF FAQを読み取ることによって、何が起こっているかを理解することができます。TensorFlowで

、テンソル静的(推論)形状と ダイナミック(真)形状の両方を持っています。静的形状は tf.Tensor.get_shape方法を使用して読み取ることができる。この形状は、テンソルを作成するために使用された操作 から推論され、部分的に完全であってもよいです。静的形状が完全に定義されていない 場合、テンソルT の動的形状は、tf.shape(t)を評価することによって決定することができます。

静的な形状が適切に推測されなかったので、TFにヒントを与えるべきです。幸運なことに、同じ質問から次の数行が何をすべきかを教えてくれ:

をtf.Tensor.set_shape方法はテンソル オブジェクトの静的な形状を更新し、通常時に追加の形状 情報を提供するために使用されますこれは直接推論することはできません。 テンソルの動的形状を変更しません。

0

validate_shapeがfalseに設定されているため、グラフの変数の静的形状が自動的に更新されません。 wrokaroundは多分(それが知られています)新しい形状でてmanualy

a = tf.Variable([1, 1, 1, 1], validate_shape=False) 
sess.run(tf.global_variables_initializer()) 
new_arr_assign = np.array([[1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1]]) 
tf.assign(a, new_arr_assign, validate_shape=False).eval(session=sess) 
a.set_shape(new_arr_assign.shape) 
a.get_shape() 
# results: TensorShape([Dimension(2), Dimension(7)])