2016-08-23 49 views
10

我的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) 

我想不出正确shape参数传递给tf.placeholder。我觉得对于一个标我应该做的init = tf.placeholder(tf.float32, shape=0, name="init")但这提供了以下错误:

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

如果我与呼叫字面值0.5tf.random_uniform它的工作原理更换init

如何通过Feed字典传递此标量初始值?

回答

19

TL; DR:定义init一个标量形状如下:

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

这看起来像的tf.random_uniform()一个不幸的实现细节:它目前使用tf.add()tf.multiply()重新缩放从[随机值 - 1,+1]至[minval,maxval],但如果minvalmaxval的形状未知,tf.add()tf.multiply()无法推断出正确的形状,因为可能涉及广播。

通过与已知的形状(其中标量是()[],不0)定义init,TensorFlow可以得出正确的推论有关的tf.random_uniform()结果的形状,并如预期你的程序应该工作。

+2

您和Eugene Brevdo能否回答这些问题您的全职工作? :-) –

+3

七个星期中的一个星期,这是我的全职工作 - 其他几个星期我都乐在其中! :-) – mrry

+0

@ mrry你可以请看看这个问题http://stackoverflow.com/questions/41930725/tensorflow-pass-an-integer-to-graph。谢谢! – void