tf.placeholder和tf.Variable有什么区别?
我是张力stream的新手。 我很困惑tf.placeholder
和tf.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.run
的feed_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相同,教练在每次运行/步骤中更新/修改。
虽然占位符不需要任何初始值,但是在创buildx
和y
TF不会分配任何内存,而是稍后在使用feed_dict
sess.run()
的占位符时,TensorFlow将分配适当大小的内存他们( x
和y
) – 这种无约束性允许我们喂养任何大小和形状的数据。
简而言之 :
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将分别传递给a
和b
,然后传递给adder_node ouputting 7.第二种情况下有一个馈送列表,第一步和第二步将被添加,接下来的3和4( a
和b
)。
相关内容如下:
- tf.placeholder doc。
- tf.Variable文档。
- variablesVS占位符 。
张量variables和占位符:
variables(tf.varibales(someValue中)):
variables是输出当前值的状态节点(无论分配给它的值是多less)。 我们必须为tensorflow中的variables赋值。
占位符(tf.placeholders(D型,形状)):
占位符是在执行时input值的节点。 例如:input,标签等
占位符:
-
占位符只是一个variables,我们将在稍后的date分配数据。 它允许我们创build我们的操作并构build我们的计算图,而不需要数据。 在TensorFlow术语中,我们通过这些占位符将数据提供给图表。
-
初始值不是必需的,但可以有
tf.placeholder_with_default)
默认值tf.placeholder_with_default)
-
我们必须在运行时提供价值,如:
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:
- TensorFlowvariables是表示由程序操作的共享持久状态的最佳方式。
- variables通过tf.Variable类来操作。 一个tf.Variable表示一个张量,其值可以通过运行ops来改变。
例如: tf.Variable("Welcome to tensorflow!!!")
- 如何在TensorFlow上进行Xavier初始化
- 在Windows上,运行“导入tensorflow”生成没有名为“_pywrap_tensorflow”错误的模块
- 名称范围和张量streamvariables范围有什么区别?
- 如何在TensorFlow中添加正则化?
- 如何判断tensorflow是否从python shell里面使用gpu加速?
- Tensorflow与Windows工作stream兼容吗?
- Windows上的TensorFlow版本1.0.0-rc2:“OpKernel('op:”BestSplits“device_type:”CPU“')for unknown op:BestSplits”with test code
- 禁用Tensorflowdebugging信息
- TensorFlow中的variables和get_variable之间的区别