2017-07-26 4 views
0

私はテンソルフローコードを書いています。ここでは、各更新後に変数ベクトルを正規化したいと考えています。テンソルフロー変数のサイズを正規化する方法

sess = tf.InteractiveSession() 
y = tf.Variable(tf.random_uniform([2], -0.5, 0.5)) 
init = tf.initialize_all_variables() 
sess.run(init) 

a = [2, 3] 

loss = tf.reduce_sum(tf.square(a - y)) 
y = y/tf.sqrt(tf.reduce_sum(tf.square(y))) 

optimizer = tf.train.GradientDescentOptimizer(0.05) 
train = optimizer.minimize(loss) 

for step in range(100): 
    sess.run(train) 
    temp2= sess.run(y) 
    print(temp2)  

及びIは

y = tf.Variable(tf.random_uniform([2], -0.5, 0.5)) 
を変更した場合、ただし[0.55469805 0.83205169]、[2,3]

の方向に正規化ベクトルである所望の答えを与える:次のコードはうまく機能します

y = tf.Variable(tf.random_uniform([2,2], -0.5, 0.5)) 

y[0] = y[0]/tf.sqrt(tf.reduce_sum(tf.square(y[0]))) 

y = y/tf.sqrt(tf.reduce_sum(tf.square(y))) 

それから私は「『変数』オブジェクトは、アイテムの割り当てをサポートしていません」というエラーを取得します。私はまた、誰もが、私はYのようなベクトル列を正規化することができますどのように助けることができます

loss = tf.reduce_sum(tf.square(a - y[0])) 

に損失関数を変更する[0] tensorflowにおける変数の型の?

答えて

0

yはテンソルオブジェクトであるため、テンソルオブジェクトに値を代入することはできません。したがって、あなたはテンソルのアレイ上で動作し、その後、次のように値を割り当てる必要があります。

上記で
yArray = y.eval() 
a = [2, 3] 

loss = tf.reduce_sum(tf.square(a - y.eval()[0][:])) 
yArray[0][:] = yArray[0][:]/tf.sqrt(tf.reduce_sum(tf.square(yArray[0][:]))).eval() 
y.assign(yArray) 

を、eval機能を使ってテンソルの配列を取得します。次に、損失関数と正規化yArrayを計算します。最後に、yyArrayの値を割り当てます。

+0

ありがとうございました。私はこれを試してみる必要があります。私はそれが動作する場合、別のコメントを残します。 –

+0

@SukhoLee動作している場合は、コメントを残す必要はありません。ソリューションを答えとして受け入れるだけです。 – OmG

+0

残念ながら、このコードでは、「任意の変数にグラデーションはありません」 エラーが発生します。 y.eval()[0] [:]は値であり、変数ではないからです。y.eval()[0] [:]の代わりにy [0]を使用すると、答えは [ 1.99994683 2.99990678]であり、これは損失関数に対する非正規化最小化応答である。 機能。 –

関連する問題