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

Eda*_*ame 6 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)
Run Code Online (Sandbox Code Playgroud)

mrr*_*rry 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
Run Code Online (Sandbox Code Playgroud)

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

请注意,tf.Variable对象在创建时通常需要一个形状,并且这个形状是从初始化器的第一个参数推断出来的.在你的程序,rng.randn()(一个别名numpy.random.randn())返回一个标值,所以变量Wb将有标形状.

尽管代码中的占位符(XY)具有不受约束的形状,但是某些运算符(例如tf.add()和)tf.mul()对其参数的形状(即它们与NumPy广播规则兼容)有其他要求.由于TensorFlow不知道您何时构建图形,这些张量的实际形状是什么,它相信用户知道他们在做什么,并动态地执行检查(在调用期间tf.Session.run()).相反,如果您限制占位符的形状,则启用TensorFlow以更早地执行某些检查,这样做有助于减少错误.