用于形状时的Tensorflow变量和常数差异

时间:2016-11-23 07:50:52

标签: tensorflow

W = tf.Variable(tf.random_uniform(shape, -1.0, 0.0))中,我为shape尝试了以下三种数据类型:

shape = tf.constant([1])  # 1
shape = [1]               # 2
shape = tf.Variable([1])  # 3

然后我打电话给:

init = tf.initialize_all_variables()
sess = tf.Session()
sess.run(init)
print(sess.run(W))

12都正确输出,类似于[-0.25340891]。但是,3给了我

  

ValueError:initial_value必须具有指定的形状:Tensor(" random_uniform:0",shape =(?,),dtype = float32)

完整的代码示例:

import tensorflow as tf
import numpy as np

# shape = tf.constant([1])  # 1
# shape = [1]               # 2
shape = tf.Variable([1])  # 3

W = tf.Variable(tf.random_uniform(shape, -1.0, 0.0))

init = tf.initialize_all_variables()

sess = tf.Session()
sess.run(init)

print(sess.run(W))

为什么会这样?

1 个答案:

答案 0 :(得分:2)

由于两个原因,您的示例无效:

  1. 使用随机初始化W时,init值应指定形状,但未指定形状,因为它本身是变量而不是常量。添加validate_shape = False可以回避这个问题。
  2. initialize_all_variables()并行运行所有内容,但您需要首先初始化'shape'变量。以所需顺序显式初始化变量可以解决此问题。
  3. 工作代码:

    import tensorflow as tf
    import numpy as np
    
    shape = tf.Variable([1])
    W = tf.Variable(tf.random_uniform(shape, -1.0, 0.0), validate_shape=False)
    
    sess = tf.Session()
    sess.run(shape.initializer)
    sess.run(W.initializer)
    
    print(sess.run(W))