TensorFlow报错ValueError:initial_value需指定形状,求解决方案
解决TensorFlow 1.x中"initial_value must have a shape specified"错误
问题根源分析
你遇到的错误有两个核心原因:
initw函数未返回创建的变量:你的函数里生成了tf.Variable但没有用return语句返回它,导致bla实际上是None,后续执行sess.run([bla])会引发额外问题。- 动态形状的变量初始化限制:你用
placeholder(动态形状的张量)作为tf.Variable的形状参数,使得初始值的形状是(?, ?)(不确定的)。而TensorFlow 1.x中tf.Variable默认要求初始值有明确固定的形状,因此触发了ValueError。
修正后的代码方案
我们可以通过两处修改解决问题:给tf.Variable添加validate_shape=False参数关闭形状验证,同时确保函数返回创建的变量:
import tensorflow as tf a = tf.placeholder(tf.int32) b = tf.placeholder(tf.int32) def initw(a, b): # 添加validate_shape=False允许动态形状的初始值,同时返回变量 return tf.Variable(tf.sign(tf.random_uniform(shape=[a, b], minval=-1.0, maxval=1.0)), validate_shape=False) bla = initw(a, b) with tf.Session() as sess: # 注意:因变量形状是动态的,需先传入确定的形状参数再初始化 sess.run(tf.global_variables_initializer(), feed_dict={a:2, b:2}) print(sess.run([bla], feed_dict={a:2, b:2}))
额外说明
如果你想更规范地处理动态形状变量,也可以使用tf.get_variable并设置validate_shape=False,效果完全一致。另外要注意:这种动态形状的变量在TensorFlow 1.x中使用时,必须在初始化阶段就传入确定的形状值(也就是feed_dict要在global_variables_initializer执行时就提供),否则依然会触发形状相关错误。
内容的提问来源于stack exchange,提问作者Gilfoyle
相关产品推荐
相关产品推荐

