Tensorflow使用三种类型的容器来存储/执行过程
常数:常数保存典型数据。
variables:数据值将被更改,并带有相应的功能,例如cost_function。
占位符:培训/测试数据将传递到图形中。
0
Tensorflow使用三种类型的容器来存储/执行过程
常数:常数保存典型数据。
variables:数据值将被更改,并带有相应的功能,例如cost_function。
占位符:培训/测试数据将传递到图形中。
0
将张量流中的Variable
视为我们在编程语言中使用的普通变量。我们初始化变量,以后也可以对其进行修改。而placeholder
不需要初始值。占位符只是分配内存块以供将来使用。稍后,我们可以使用feed_dict
将数据输入placeholder
。默认情况下, placeholder
的形状不受限制,可让您在会话中提供不同形状的张量。您可以通过传递可选参数-shape来制作受约束的形状,如下所述。
x = tf.placeholder(tf.float32,(3,4))
y = x + 2
sess = tf.Session()
print(sess.run(y)) # will cause an error
s = np.random.rand(3,4)
print(sess.run(y, feed_dict={x:s}))
在执行机器学习任务时,大多数时候我们并不知道行数,但是(假设)我们知道功能或列数。在这种情况下,我们可以使用None。
x = tf.placeholder(tf.float32, shape=(None,4))
现在,在运行时,我们可以输入具有4列和任意行数的任何矩阵。
此外,占位符还用于输入数据(它们是我们用于馈送模型的变量的一种),其中,变量是参数,例如我们随时间推移训练的权重。
0
示例片段:
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不会分配任何内存,而是稍后在您使用feed_dict
将sess.run()
喂入占位符时,TensorFlow会为它们( x
和y
)-这种无限制的条件使我们能够提供任何大小和形状的数据。
简而言之 :
变量 -是您希望训练师(即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
,然后传递到输出7的adder_node。在第二种情况下,有一个供稿列表,第一步将添加步骤1和2,接下来是第3步和第4步( a
和b
)。
相关读物:
0
区别在于使用tf.Variable
必须在声明它时提供一个初始值。使用tf.placeholder
您无需提供初始值,并且可以在运行时使用Session.run
的feed_dict
参数指定它。
0
由于Tensor计算是由图组成的,因此最好根据图来解释两者。
以简单的线性回归为例
WX+B=Y
其中W
和B
代表权重和偏差, X
代表观测值的输入, Y
代表观测值的输出。
显然, X
和Y
具有相同的性质(清单变量),与W
和B
(潜在变量)不同。 X
和Y
是样本(观测值)的值,因此需要填充一个位置 ,而W
和B
是权重和偏差。图表中的变量 (先前的值会影响后者)应使用不同的X
和Y
对。我们将不同的样本放置到占位符上以训练变量 。
我们只需要保存或还原 变量 (在检查点)即可使用代码保存或重建图形。
占位符主要是不同数据集(例如训练数据或测试数据)的占位符 。但是,在训练过程中针对特定任务对变量进行了训练,即,以预测输入的结果或将输入映射到所需的标签。它们保持不变,直到您使用不同或相同的样本重新训练或微调模型以通过dict填充到占位符中为止。例如:
session.run(a_graph, dict = {a_placeholder_name : sample_values})
占位符也作为参数传递给设置模型。
如果在训练过程中更改了模型的占位符(添加,删除,更改形状等),则仍可以重新加载检查点,而无需进行任何其他修改。但是,如果更改了已保存模型的变量,则应相应地调整检查点以重新加载它并继续进行训练(图中定义的所有变量都应在检查点中可用)。
总而言之,如果值来自样本(您已经拥有的观测值),则可以安全地放置占位符,而如果需要训练参数,则可以使用变量 (简单地说,为所需的值设置变量)以自动使用TF)。
在一些有趣的模型中,例如样式转换模型 ,输入像素将被优化,并且通常称为模型变量的固定,然后我们应将输入(通常是随机初始化)作为在该链接中实现的变量。
有关更多信息,请推断出这个简单且说明性的文档 。
0
TL; DR
变数
占位符
tf.placeholder_with_default
) 0
变数
TensorFlow变量是表示程序所控制的共享持久状态的最佳方法。变量通过tf.Variable类进行操作。在内部,tf.Variable存储持久张量。通过特定的操作,您可以读取和修改此张量的值。这些修改在多个tf.Session中可见,因此多个工作人员可以看到相同的tf.Variable值。使用前必须先初始化变量。
例:
x = tf.Variable(3, name="x")
y = tf.Variable(4, name="y")
f = x*x*y + y + 2
这将创建一个计算图。可以在张量流会话中初始化变量(x和y)并评估函数(f),如下所示:
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
注意:尺寸的“无”表示“任何尺寸”。
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.]]
参考文献:
0
除了其他答案,他们还在Tensoflow网站上的MNIST 教程中对此进行了很好的解释:
我们通过操纵符号变量来描述这些交互操作。让我们创建一个:
x = tf.placeholder(tf.float32, [None, 784])
,
x
不是特定值。它是一个占位符,当我们要求TensorFlow运行计算时将输入的值。我们希望能够输入任意数量的MNIST图像,每个图像均被展平为784维向量。我们将其表示为浮点数的二维张量,其形状为[None,784]。 (此处无表示尺寸可以为任意长度。)我们还需要模型的权重和偏见。我们可以想象将它们像其他输入一样对待,但是TensorFlow有一个更好的处理方式:
Variable
。Variable
是存在于TensorFlow的交互操作图中的可修改张量。计算可以使用甚至修改它。对于机器学习应用程序,通常将模型参数设为Variable
。
W = tf.Variable(tf.zeros([784, 10]))
b = tf.Variable(tf.zeros([10]))
我们创建这些
Variable
通过给小号tf.Variable
的初始值Variable
:在这种情况下,我们都初始化W
和b
为张量全是零。由于我们将要学习W
和b
,所以它们最初的含义并不重要。
0
简而言之,将tf.Variable
用于可训练变量,例如模型的权重(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 。 (示例摘自网页。)
0
tf.Variable和tf.placeholder之间最明显的区别是
您可以使用变量来保存和更新参数。变量是包含张量的内存缓冲区。必须对它们进行显式初始化,并且可以在培训期间和之后将其保存到磁盘。您以后可以恢复保存的值以执行或分析模型。
变量的初始化是通过sess.run(tf.global_variables_initializer())
。同样,在创建变量时,您需要将Tensor作为其初始值传递给Variable()
构造函数,并且在创建变量时始终知道其形状。
另一方面,您无法更新占位符。它们也不应该被初始化,但是由于它们是承诺具有张量的,因此您需要将值输入sess.run(<op>, {a: <some_val>})
。最后,与变量相比,占位符可能不知道形状。您可以提供部分尺寸,也可以完全不提供。
还有其他区别:
有趣的是,不仅可以喂占位符。您可以将值输入变量,甚至常量。
0
我是TensorFlow的新手。我对
tf.placeholder
和tf.Variable
之间的区别感到困惑。在我看来,tf.placeholder
用于输入数据,而tf.Variable
用于存储数据状态。这就是我所知道的。有人可以向我详细解释他们之间的差异吗?特别是何时使用
tf.Variable
和何时使用tf.placeholder
?