我是TensorFlow的新手。我搞不懂tf的区别。占位符和tf.Variable。在我看来,tf。占位符用于输入数据,tf。变量用于存储数据的状态。这就是我所知道的一切。
谁能给我详细解释一下他们的不同之处吗?特别是,什么时候使用tf。变量和何时使用tf.placeholder?
我是TensorFlow的新手。我搞不懂tf的区别。占位符和tf.Variable。在我看来,tf。占位符用于输入数据,tf。变量用于存储数据的状态。这就是我所知道的一切。
谁能给我详细解释一下他们的不同之处吗?特别是,什么时候使用tf。变量和何时使用tf.placeholder?
当前回答
因为张量计算由图组成,所以最好用图来解释这两者。
以简单的线性回归为例
WX+B=Y
其中W和B代表权重和偏差,X代表观测数据的输入,Y代表观测数据的输出。
显然X和Y是同一性质(显变量),而W和B是潜变量。X和Y是样本(观测值)的值,因此需要填充一个位置,而W和B是权重和偏差,图中的变量(前一个值影响后者),应该使用不同的X和Y对进行训练。我们在占位符中放置不同的样本来训练变量。
我们只需要保存或恢复变量(在检查点)来保存或重新构建代码图。
占位符主要是不同数据集的占位符(例如训练数据或测试数据)。然而,变量在训练过程中被训练为特定的任务,即预测输入的结果或将输入映射到所需的标签。它们保持不变,直到你使用不同或相同的样本重新训练或微调模型,通常通过字典填充占位符。例如:
session.run(a_graph, dict = {a_placeholder_name : sample_values})
占位符也作为参数传递给设置模型。
如果你在训练过程中改变了模型的占位符(添加、删除、改变形状等),你仍然可以重新加载检查点,而不需要任何其他修改。但是如果保存的模型的变量发生了变化,您应该相应地调整检查点以重新加载它并继续训练(图中定义的所有变量都应该在检查点中可用)。
总而言之,如果值来自样本(您已经拥有的观察结果),您可以安全地设置一个占位符来保存它们,而如果您需要训练一个参数,则利用一个变量(简单地说,为您想使用TF自动获得的值设置变量)。
在一些有趣的模型中,比如样式转换模型,输入像素将被优化,通常被称为模型变量是固定的,然后我们应该将输入(通常是随机初始化的)作为在该链接中实现的变量。
要了解更多信息,请参考这个简单明了的文档。
其他回答
简而言之,使用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。(例子摘自网页。)
占位符:
A placeholder is simply a variable that we will assign data to at a later date. It allows us to create our operations and build our computation graph, without needing the data. In TensorFlow terminology, we then feed data into the graph through these placeholders. Initial values are not required but can have default values with tf.placeholder_with_default) We have to provide value at runtime like : 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
变量:
TensorFlow变量是表示共享的最佳方式, 由程序操纵的持久状态。 变量是通过tf操作的。变量类。一个特遣部队。变量 表示一个张量,其值可以通过对其运行操作来改变。
例如:tf。变量("欢迎来到tensorflow!! ")
Tensorflow使用三种类型的容器来存储/执行过程
Constants:Constants保存典型数据。 变量:数据值将被改变,相应的函数,如cost_function.. 占位符:训练/测试数据将被传递到图表中。
示例代码片段:
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})
顾名思义,占位符是稍后提供一个值的承诺。
变量只是训练参数(W(矩阵),b(偏差),与您在日常编程中使用的正常变量相同,培训师在每次运行/步骤中更新/修改。
虽然占位符不需要任何初始值,当你创建x和y时,TF不分配任何内存,相反,当你在sesss .run()中使用feed_dict提供占位符时,TensorFlow将为它们分配适当大小的内存(x和y) -这种不受约束的特性允许我们提供任何大小和形状的数据。
简而言之:
Variable -是一个你希望训练器(例如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输出7。在第二种情况下,有一个提要列表,第一步1和2将被添加,接下来的3和4 (a和b)。
相关阅读:
特遣部队。占位符doc。 特遣部队。变量doc。 变量VS占位符。
因为张量计算由图组成,所以最好用图来解释这两者。
以简单的线性回归为例
WX+B=Y
其中W和B代表权重和偏差,X代表观测数据的输入,Y代表观测数据的输出。
显然X和Y是同一性质(显变量),而W和B是潜变量。X和Y是样本(观测值)的值,因此需要填充一个位置,而W和B是权重和偏差,图中的变量(前一个值影响后者),应该使用不同的X和Y对进行训练。我们在占位符中放置不同的样本来训练变量。
我们只需要保存或恢复变量(在检查点)来保存或重新构建代码图。
占位符主要是不同数据集的占位符(例如训练数据或测试数据)。然而,变量在训练过程中被训练为特定的任务,即预测输入的结果或将输入映射到所需的标签。它们保持不变,直到你使用不同或相同的样本重新训练或微调模型,通常通过字典填充占位符。例如:
session.run(a_graph, dict = {a_placeholder_name : sample_values})
占位符也作为参数传递给设置模型。
如果你在训练过程中改变了模型的占位符(添加、删除、改变形状等),你仍然可以重新加载检查点,而不需要任何其他修改。但是如果保存的模型的变量发生了变化,您应该相应地调整检查点以重新加载它并继续训练(图中定义的所有变量都应该在检查点中可用)。
总而言之,如果值来自样本(您已经拥有的观察结果),您可以安全地设置一个占位符来保存它们,而如果您需要训练一个参数,则利用一个变量(简单地说,为您想使用TF自动获得的值设置变量)。
在一些有趣的模型中,比如样式转换模型,输入像素将被优化,通常被称为模型变量是固定的,然后我们应该将输入(通常是随机初始化的)作为在该链接中实现的变量。
要了解更多信息,请参考这个简单明了的文档。