2017-04-08 22 views
0

テンソルフローのmy(loss)関数に2つのパラメータを渡しています。これは、異なるステップで変化するため、プレースホルダの形にする必要があります。私は訓練中にそれらを食べる。 私のプログラム概要は以下の通りです。 私の質問は、彼らが効果的にそれらを養う価値を取ることですか? 次のスニペットを見て、私が正しくやっていることを伝えたらどうでしょう? 私は途中で何かエラーや何かを得ることはありません。関数パラメータとしてテンソルフロープレースホルダを渡す

tetha1_placeholder, tetha2_placeholder = tf.placeholder(tf.float32, name='tetha1plh'), tf.placeholder(tf.float32, name='tetha2plh') 
hyperparams = {'tetha1': tetha1_placeholder,'tetha2':tetha2_placeholder} 
[getting embeddings1,embeddings2, embeddings3 from my model] 
loss = loss_function (embeddings1,embeddings1,embeddings3, hyperparams) 

with sess.as_default(): 

    while true: 
     step = sess.run(global_step, feed_dict=None) 
     t1, t2 = calculate_params(step) 
     feed_dict = {tetha1_placeholder:t1, tetha2_placeholder:t2}    
     error=sess.run([loss], feed_dict=feed_dict) 

def loss_function (embeddings1,embeddings2,embeddings3, hyperparams): 
     pos_dist =hyperparams['tetha1'] * tf.reduce_sum(tf.square(tf.subtract(embeddings1, embeddings2)), 1) 
     neg_dist = hyperparams['tetha2'] *tf.reduce_sum(tf.square(tf.subtract(embeddings1, embeddings3)), 1) 
     loss = tf.reduce_mean(tf.add(pos_dist,neg_dist)) 
     return loss 

答えて

1

プログラムが正しく表示されます。 sess.run([loss], feed_dict=feed_dict)を呼び出すと、テンソルhyperparams['tetha1']loss_function()になり、テンソルhyperparams['tetha2']loss_function()の値はt2になります。余談として

t1が常に同じ形状をしている場合、私はあなたがtf.placeholder()tetha1_placeholderのための(と同様にt2tetha2_placeholder用)を構築する際にその形状を渡すことをお勧めしたいです。

+0

ありがとう@mrry 私は最後の部分を取得しませんでした。 t1とt2は2つのスカラ浮動小数点数です。あなたは、shape =(1)としてtetha1_placeholderの形を明示的に指定する方が良いでしょうか? – Hamid

+0

ああ、両方のスカラーであれば、それらを 'tetha1_placeholder = tf.placeholder(tf.float32、shape = []、name'tetha1plh ')'と定義することができます(他のプレースホルダーについても同様です)。これにより、正確な計算に応じて、パフォーマンスとエラーメッセージが少し改善されます。 – mrry

関連する問題