我正在通过以下示例学习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)
答案 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()
的别名)会返回标量值,因此变量W
和b
将具有标量形状。
虽然代码中的占位符(X
和Y
)具有不受约束的形状,但某些运算符(例如tf.add()
和tf.mul()
)对此有其他要求他们的论点形状(即他们与NumPy broadcasting rules兼容)。由于TensorFlow不知道您何时构建图形,这些张量的实际形状将是什么,它相信用户知道他们在做什么,并动态执行检查(在调用tf.Session.run()
期间)。相反,如果你限制占位符的形状,你可以让TensorFlow更早地执行一些检查,这样做可以帮助减少错误。