我是TensorFlow的新手。我搞不懂tf的区别。占位符和tf.Variable。在我看来,tf。占位符用于输入数据,tf。变量用于存储数据的状态。这就是我所知道的一切。
谁能给我详细解释一下他们的不同之处吗?特别是,什么时候使用tf。变量和何时使用tf.placeholder?
我是TensorFlow的新手。我搞不懂tf的区别。占位符和tf.Variable。在我看来,tf。占位符用于输入数据,tf。变量用于存储数据的状态。这就是我所知道的一切。
谁能给我详细解释一下他们的不同之处吗?特别是,什么时候使用tf。变量和何时使用tf.placeholder?
当前回答
变量
TensorFlow变量是表示程序操纵的共享持久状态的最佳方式。变量是通过tf操作的。变量类。内部是一个tf。变量存储一个持久张量。特定的操作允许你读取和修改这个张量的值。这些修改在多个tf中可见。会话,因此多个工作人员可以看到tf.Variable的相同值。变量在使用前必须初始化。
例子:
x = tf.Variable(3, name="x")
y = tf.Variable(4, name="y")
f = x*x*y + y + 2
这将创建一个计算图。变量(x和y)可以被初始化,函数(f)在一个tensorflow会话中被计算,如下所示:
with tf.Session() as sess:
x.initializer.run()
y.initializer.run()
result = f.eval()
print(result)
42
占位符
占位符是一个节点(与变量相同),其值可以在将来初始化。这些节点基本上在运行时输出分配给它们的值。占位符节点可以使用tf.placeholder()类来分配,你可以为它提供参数,比如变量的类型和/或它的形状。占位符广泛用于表示机器学习模型中的训练数据集,因为训练数据集不断变化。
例子:
A = tf.placeholder(tf.float32, shape=(None, 3))
B = A + 5
注意:维度的“None”表示“任何大小”。
with tf.Session as sess:
B_val_1 = B.eval(feed_dict={A: [[1, 2, 3]]})
B_val_2 = B.eval(feed_dict={A: [[4, 5, 6], [7, 8, 9]]})
print(B_val_1)
[[6. 7. 8.]]
print(B_val_2)
[[9. 10. 11.]
[12. 13. 14.]]
引用:
https://www.tensorflow.org/guide/variables https://www.tensorflow.org/api_docs/python/tf/placeholder O'Reilly:使用Scikit-Learn和Tensorflow进行动手机器学习
其他回答
简而言之,使用tf。变量为可训练变量,如权重(W)和偏差(B)为您的模型。
weights = tf.Variable(
tf.truncated_normal([IMAGE_PIXELS, hidden1_units],
stddev=1.0 / math.sqrt(float(IMAGE_PIXELS))), name='weights')
biases = tf.Variable(tf.zeros([hidden1_units]), name='biases')
特遣部队。占位符用于提供实际的训练示例。
images_placeholder = tf.placeholder(tf.float32, shape=(batch_size, IMAGE_PIXELS))
labels_placeholder = tf.placeholder(tf.int32, shape=(batch_size))
这是你在训练中输入训练示例的方式:
for step in xrange(FLAGS.max_steps):
feed_dict = {
images_placeholder: images_feed,
labels_placeholder: labels_feed,
}
_, loss_value = sess.run([train_op, loss], feed_dict=feed_dict)
你的助教。变量将被训练(修改)作为这个训练的结果。
详见https://www.tensorflow.org/versions/r0.7/tutorials/mnist/tf/index.html。(例子摘自网页。)
在TensorFlow中,变量只是另一个张量(比如tf。常量或tf.placeholder)。碰巧变量可以通过计算来修改。特遣部队。占位符用于将在运行时提供给计算的外部输入(例如训练数据)。特遣部队。变量用于作为计算的一部分并将被计算修改的输入(例如神经网络的权重)。
博士TL;
变量
为了学习参数 价值观可以从培训中获得 初始值是必需的(通常是随机的)
占位符
为数据分配存储(例如在馈送期间用于图像像素数据) 初始值不是必需的(但可以设置,参见tf.placeholder_with_default)
Tensorflow使用三种类型的容器来存储/执行过程
Constants:Constants保存典型数据。 变量:数据值将被改变,相应的函数,如cost_function.. 占位符:训练/测试数据将被传递到图表中。
最明显的区别是。变量和tf。占位符是
使用变量保存和更新参数。变量是 包含张量的内存缓冲区。它们必须明确 已初始化,可以在培训期间和培训结束后保存到磁盘。你 可以稍后恢复保存的值以练习或分析模型。
变量的初始化使用sess.run(tf.global_variables_initializer())完成。另外,在创建变量时,你需要将一个Tensor作为它的初始值传递给variable()构造函数,当你创建一个变量时,你总是知道它的形状。
另一方面,您不能更新占位符。它们也不应该被初始化,但因为它们是一个有一个张量的承诺,你需要将值输入到它们sess.run(<op>, {a: <some_val>})。最后,与变量相比,占位符可能不知道形状。您可以提供部分维度,也可以什么都不提供。
还有其他区别:
the values inside the variable can be updated during optimizations variables can be shared, and can be non-trainable the values inside the variable can be stored after training when the variable is created, 3 ops are added to a graph (variable op, initializer op, ops for the initial value) placeholder is a function, Variable is a class (hence an uppercase) when you use TF in a distributed environment, variables are stored in a special place (parameter server) and are shared between the workers.
有趣的是,不仅可以提供占位符。您可以将值提供给变量,甚至是常量。