我尝试实现以下代码。
import tensorflow as tf
a = tf.placeholder(tf.int32)
b = tf.placeholder(tf.int32)
def initw(a,b):
tf.Variable(tf.sign(tf.random_uniform(shape=[a,b],minval=-1.0,maxval=1.0)))
bla = initw(a,b)
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
print(sess.run([bla], feed_dict={a:2, b:2}))
但我一直收到错误消息:
ValueError: initial_value must have a shape specified: Tensor("Sign:0",shape=(?, ?), dtype=float32)
有人能告诉我这里做错了什么吗?我真的不知道导致错误的原因。
编辑:
我想使用initw(a,b)
来初始化网络的权重。我希望能够做到这样的事情:
weights = {
"h1": tf.get_variable("h1", initializer=initw(a,b).initialized_value())
}
a
和b
是矩阵的高度和宽度。
答案 0 :(得分:1)
在我看来,错误信息实际上非常精确。但我明白你的困惑。您可能不太了解Tensorflow如何在引擎盖下工作。您可能想要开始阅读here。
必须在运行时之前知道计算图的形状。每个变量或占位符中只能有一个轴在编译时未指定,它在运行时被认为是批量维度。
在您的情况下,您尝试使用占位符来指定变量的尺寸,这是不可能的,因为图形无法以这种方式编译。
我不知道你要做什么,但我想有办法实现你所需要的。实际上,您可以动态地使用批量维度的长度来绘制该大小的统一向量。
修改:在您更新问题后,我觉得我对自己的怀疑是正确的。 a
和b
不需要占位符,只需将它们变为Python变量,如下所示:
import tensorflow as tf
# Matrix shape must be known in advance, but can of course still be specified
# in some settings file or at the beginning of the python skript
A = 2
B = 2
W = tf.Variable(tf.sign(tf.random_uniform(shape=(A, B), minval=-1.0,
maxval=1.0)))
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
print(sess.run(W))