tf.placeholder和tf.Variable有什么区别?

我是张力stream的新手。 我很困惑tf.placeholdertf.Variable之间的区别。 在我看来, tf.placeholder用于input数据,而tf.Variable用于存储数据的状态。 这就是我所知道的。

有人能更详细地向我解释他们的区别吗? 特别是何时使用tf.Variable和何时使用tf.placeholder

简而言之,您可以使用tf.Variable作为可训练variables,例如模型的权重(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') 

tf.placeholder用于提供实际的训练示例。

 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) 

你的tf.variables将被训练(修改)作为这次训练的结果。

请参阅https://www.tensorflow.org/versions/r0.7/tutorials/mnist/tf/index.html 。 (例子取自网页。)

tf.Variable不同的是,当你声明它时,你必须提供一个初始值。 使用tf.placeholder您不必提供初始值,并且可以在运行时使用Session.runfeed_dict参数指定它

由于张量计算由图组成,因此最好从图中解释两者。

以WX + B = Y(其中W和B代表权重和偏差,X代表观测的input,Y代表观测的输出)为例。 很明显,X和Y的性质与W和B的性质是不同的.X和Y是样本(观察值)的值,因此需要一个填充的位置 ,而W和B是权重和偏差, Variables先前的值影响后者),该图应该使用不同的X和Y对进行训练。 我们将不同的样本放置到占位符来训练variables

我们只能保存或恢复 variables来保存或重buildgraphics。 占位符大多是不同数据集的持有者(例如训练数据或testing数据),但variables在训练过程中训练并保持不变(预测input的结果或映射样本的input和输出[标签]),稍后再重新训练模型(使用不同或相同的样本通过字典填充占位符 ,例如session.run(a_graph, dict={a_placeholder_name: sample_values})占位符也作为parameter passing给模型) 。

如果在训练过程中更改模型的占位符(添加或删除或更改形状等),则仍可以重新加载检查点,而无需进行任何其他修改。 但是,如果保存模型的variables发生变化,则应相应地调整检查点以重新加载并继续训练。

总而言之,如果这些值来自样本(您已经有了观测值),那么您可以安全地占据一个占位符,而如果您需要一个参数被训练来处理一个variables (简单地说,将variables设置为您想要的值自动使用TF)。

欲了解更多信息,请推断这个简单的说明文档 。

TL; DR

variables

  • 要参math习
  • 价值观可以从培训中获得
  • 初始值是必需的(通常是随机的)

占位符

  • 为数据分配存储空间(例如,在Feed中为图像像素数据)
  • 初始值不是必需的(但可以设置,请参阅tf.placeholder_with_default

tf.Variable和tf.placeholder之间最明显的区别就是


你使用variables来保存和更新参数。 variables是包含张量的内存缓冲区。 他们必须明确初始化,并可以在培训期间和之后保存到磁盘。 您可以稍后恢复保存的值以运行或分析模型。

variables的初始化是通过sess.run(tf.global_variables_initializer()) 。 在创build一个variables时,需要将一个张量作为其初始值传递给Variable()构造函数,并且当您创build一个variables时,您始终知道它的形状。


另一方面,你不能更新占位符。 他们也不应该被初始化,但是因为他们承诺有一个张量,所以你需要把值送入sess.run(<op>, {a: <some_val>}) 。 最后,与variables相比,占位符可能不知道形状。 您可以提供部分维度或者不提供任何内容。


还有其他的区别:

  • 可以在优化期间更新variables内的值
  • variables可以共享 ,并且可以是不可训练的
  • 训练后可以存储variables内的值
  • 当variables被创build时, 3个操作被添加到一个图中 (variablesop,初始化操作,操作初始值)
  • 占位符是一个函数,variables是一个类 (因此是一个大写)
  • 当您在分布式环境中使用TF时,variables将存储在特定的位置( 参数服务器 ),并在工作人员之间共享。

有趣的部分是,不仅可以吃饭的占位符。 您可以将该值提供给一个variables甚至一个常量。

添加到其他的答案,他们也很好地解释了这个在Tensoflow网站上的MNIST 教程 :

我们通过操纵符号variables来描述这些交互操作。 我们来创build一个:

x = tf.placeholder(tf.float32, [None, 784])

x不是一个具体的值。 这是一个占位符,当我们要求TensorFlow运行一个计算时,我们会input一个值。 我们希望能够input任意数量的MNIST图像,每个图像被平面化成784维向量。 我们将其表示为浮点数的二维张量,其形状为[无,784]。 (这里None表示维度可以是任何长度。)

我们也需要我们的模型的权重和偏见。 我们可以想象把这些看作是额外的input,但是TensorFlow有一个更好的方法来处理它:variables。 variables是一个可修改的张量,它存在于TensorFlow的交互操作图中。 它可以被使用,甚至被计算修改。 对于机器学习应用程序,通常将模型参数设置为variables。

W = tf.Variable(tf.zeros([784, 10]))

b = tf.Variable(tf.zeros([10]))

我们通过给定variables的初始值来创build这些variables:在这种情况下,我们将W和b初始化为充满零的张量。 既然我们要学习W和B,它们最初是什么都没有关系。

示例代码片段:

 import numpy as np import tensorflow as tf ### Model parameters ### W = tf.Variable([.3], tf.float32) b = tf.Variable([-.3], tf.float32) ### Model input and output ### x = tf.placeholder(tf.float32) linear_model = W * x + b y = tf.placeholder(tf.float32) ### loss ### loss = tf.reduce_sum(tf.square(linear_model - y)) # sum of the squares ### optimizer ### optimizer = tf.train.GradientDescentOptimizer(0.01) train = optimizer.minimize(loss) ### training data ### x_train = [1,2,3,4] y_train = [0,-1,-2,-3] ### training loop ### init = tf.global_variables_initializer() sess = tf.Session() sess.run(init) # reset values to wrong for i in range(1000): sess.run(train, {x:x_train, y:y_train}) 

正如名称所说,占位符是一个承诺,以后提供价值即

variables只是训练参数( W (matrix), b (偏差))与日常编程中使用的正常variables相同,教练在每次运行/步骤中更新/修改。

虽然占位符不需要任何初始值,但是在创buildxy TF不会分配任何内存,而是稍后在使用feed_dict sess.run()的占位符时,TensorFlow将分配适当大小的内存他们( xy ) – 这种无约束性允许我们喂养任何大小和形状的数据。


简而言之

variables – 是您希望培训师(即GradientDescentOptimizer)在每个步骤后更新的参数。

占位符演示 –

 a = tf.placeholder(tf.float32) b = tf.placeholder(tf.float32) adder_node = a + b # + provides a shortcut for tf.add(a, b) 

执行:

 print(sess.run(adder_node, {a: 3, b:4.5})) print(sess.run(adder_node, {a: [1,3], b: [2, 4]})) 

导致输出

 7.5 [ 3. 7.] 

在第一种情况下,3和4.5将分别传递给ab ,然后传递给adder_node ouputting 7.第二种情况下有一个馈送列表,第一步和第二步将被添加,接下来的3和4( ab )。


相关内容如下:

  • tf.placeholder doc。
  • tf.Variable文档。
  • variablesVS​​占位符 。

张量variables和占位符:

variables(tf.varibales(someValue中)):

variables是输出当前值的状态节点(无论分配给它的值是多less)。 我们必须为tensorflow中的variables赋值。

占位符(tf.placeholders(D型,形状)):

占位符是在执行时input值的节点。 例如:input,标签等

占位符:

  1. 占位符只是一个variables,我们将在稍后的date分配数据。 它允许我们创build我们的操作并构build我们的计算图,而不需要数据。 在TensorFlow术语中,我们通过这些占位符将数据提供给图表。

  2. 初始值不是必需的,但可以有tf.placeholder_with_default)默认值tf.placeholder_with_default)

  3. 我们必须在运行时提供价值,如:

     a = tf.placeholder(tf.int16) // initialize placeholder value b = tf.placeholder(tf.int16) // initialize placeholder value use it using session like : sess.run(add, feed_dict={a: 2, b: 3}) // this value we have to assign at runtime 

variables:

  1. TensorFlowvariables是表示由程序操作的共享持久状态的最佳方式。
  2. variables通过tf.Variable类来操作。 一个tf.Variable表示一个张量,其值可以通过运行ops来改变。

例如: tf.Variable("Welcome to tensorflow!!!")