2016-08-23 17 views
10

My TensorFlowモデルでは、変数を初期化するためにtf.random_uniformを使用します。トレーニングを開始するときの範囲を指定したいので、初期化値のプレースホルダを作成しました。TensorFlowフィード辞書を使用してスカラーを渡す方法

init = tf.placeholder(tf.float32, name="init") 
v = tf.Variable(tf.random_uniform((100, 300), -init, init), dtype=tf.float32) 
initialize = tf.initialize_all_variables() 

訓練の開始時に変数を初期化します。

session.run(initialize, feed_dict={init: 0.5}) 

これは私に次のエラーを与える:

ValueError: initial_value must have a shape specified: Tensor("Embedding/random_uniform:0", dtype=float32) 

私はtf.placeholderに渡す正しいshapeパラメータを把握することはできません。私はinit = tf.placeholder(tf.float32, shape=0, name="init")を行う必要があり、スカラーのために思うだろうが、これは次のエラーを与える:

ValueError: Incompatible shapes for broadcasting: (100, 300) and (0,) 

私はそれが動作tf.random_uniformへの呼び出しでリテラル値0.5initを交換する場合。

このスカラー初期値をフィード辞書から渡すにはどうすればよいですか?

答えて

19

TL; DR:次のようにスカラー形状とinitの定義は:

init = tf.placeholder(tf.float32, shape=(), name="init") 

これはtf.random_uniform()の不幸な実装の詳細のように見える:それは現在【からランダムな値を再スケールするtf.add()tf.multiply()を使用 - 1、+1]〜[,maxval]であるが、形がminvalまたはmaxvalであれば、およびは、放送が含まれている可能性があるため、適切な形状を推測することができない。

既知の形状(スカラーが()[]ある場合、ない0)でinitを定義することにより、TensorFlowはtf.random_uniform()の結果の形状についての適切な推論を引き出すことができ、かつ意図したとおりに、あなたのプログラムが動作するはずです。

+2

あなたとEugene Brevdoがこれらの質問にあなたのフルタイムの仕事に答えることができますか? :-) –

+3

7週間のうち1週間、それは私のフルタイムの仕事です - 私は楽しむためにそれを行う他の週! :-) – mrry

+0

@mrryこの質問をご覧ください。http://stackoverflow.com/questions/41930725/tensorflow-pass-an-integer-to-graphありがとうございました! – void

関連する問題