TensorFlow:没有形状的初始值

时间:2018-04-30 12:02:25

标签: tensorflow

我尝试实现以下代码。

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())
    }

ab是矩阵的高度和宽度。

1 个答案:

答案 0 :(得分:1)

在我看来,错误信息实际上非常精确。但我明白你的困惑。您可能不太了解Tensorflow如何在引擎盖下工作。您可能想要开始阅读here

必须在运行时之前知道计算图的形状。每个变量或占位符中只能有一个轴在编译时未指定,它在运行时被认为是批量维度。

在您的情况下,您尝试使用占位符来指定变量的尺寸,这是不可能的,因为图形无法以这种方式编译。

我不知道你要做什么,但我想有办法实现你所需要的。实际上,您可以动态地使用批量维度的长度来绘制该大小的统一向量。

修改:在您更新问题后,我觉得我对自己的怀疑是正确的。 ab不需要占位符,只需将它们变为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))