TensorFlow:tf.placeholder和tf.Variable - 为什么不需要维度?

时间:2016-12-27 22:03:37

标签: python-3.x tensorflow

我正在通过以下示例学习TensorFlow:https://github.com/aymericdamien/TensorFlow-Examples/blob/master/notebooks/2_BasicModels/linear_regression.ipynb

我在下面的代码中有几个问题: 在定义占位符和变量(如X,Y,W和b)时,为什么我们不需要指定它们的维度?在不知道这些占位符/变量的大小的情况下,代码如何分配内存?谢谢!

    # tf Graph Input
    X = tf.placeholder("float")
    Y = tf.placeholder("float")

    # Set model weights
    W = tf.Variable(rng.randn(), name="weight")
    b = tf.Variable(rng.randn(), name="bias")


    # Construct a linear model
    pred = tf.add(tf.mul(X, W), b)

1 个答案:

答案 0 :(得分:7)

TensorFlow的tf.placeholder()张量不需要您指定形状,以便您在以后的tf.Session.run()调用中提供不同形状的张量。默认情况下,占位符具有完全不受约束的形状,但您可以通过传递可选的shape参数来约束它。例如:

w = tf.placeholder(tf.float32)                      # Unconstrained shape
x = tf.placeholder(tf.float32, shape=[None, None])  # Matrix of unconstrained size
y = tf.placeholder(tf.float32, shape=[None, 32])    # Matrix with 32 columns
z = tf.placeholder(tf.float32, shape=[128, 32])     # 128x32-element matrix

创建占位符时,TensorFlow不会分配任何内存。相反,当您向占位符提供内容时,在调用tf.Session.run()时,TensorFlow将为输入(以及随后的任何必要的中间)张量分配适当大小的内存。

请注意,tf.Variable个对象在创建时通常需要一个形状,并且这个形状是从初始化器的第一个参数推断出来的。在您的计划中,rng.randn()numpy.random.randn()的别名)会返回标量值,因此变量Wb将具有标量形状。

虽然代码中的占位符(XY)具有不受约束的形状,但某些运算符(例如tf.add()tf.mul())对此有其他要求他们的论点形状(即他们与NumPy broadcasting rules兼容)。由于TensorFlow不知道您何时构建图形,这些张量的实际形状将是什么,它相信用户知道他们在做什么,并动态执行检查(在调用tf.Session.run()期间)。相反,如果你限制占位符的形状,你可以让TensorFlow更早地执行一些检查,这样做可以帮助减少错误。