考虑以下示例中的tensorflow代码:
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})
# evaluate training accuracy
curr_W, curr_b, curr_loss = sess.run([W, b, loss], {x:x_train, y:y_train})
print("W: %s b: %s loss: %s"%(curr_W, curr_b, curr_loss))
我很好,直到最后的for循环。
我对sess.run(train, {x:x_train, y:y_train}
部分到底发生了什么感到困惑。据我所知,它继续传递x = [1,2,3,4]
和y = [0,-1,-2,-3]
进行训练。
然后每个循环更新W和b吗?然后它继续传递相同的两个x
和y
,并且每次从最后一个版本的W和b迭代?
两个问题:
1)更新发生在哪里或者是sess.run中隐含的更新?
sess.run(train...
是否专门知道更新的W
和b
,因为这些是变量?
2)每次都能继续传递相同的x和y吗? - 这个问题只有在我对问题1的想法不正确时才有意义。如果它每次自动更新W,b,那么它完全有意义,我们只是继续前进,直到我们找到最合适的方式。但是,如果更新没有自动发生,那么我不确定......
答案 0 :(得分:1)
然后每个循环是否更新W和b?
是
然后它继续传递相同的两个x和y并且每次迭代 从最后一个版本的W和b?
是
1)更新发生在哪里或者是sess.run中隐含的更新?
TensorFlow管道的主要概念是the computation graph。上面的所有代码都只是初始化它。是的,它看起来很误导:你写的Python代码,但它不像Python一样工作。但它没关系,因为它只是Python API。所有魔术都发生在Tensorflow的C ++核心。这个魔法的核心是计算图。尝试在官方手册中了解更多信息或在评论中询问我。
或简短而简单:是的,所有更新都是隐式的。
sess.run(火车......专门知道更新的W和b,因为那些是变量吗?
是
答案 1 :(得分:1)
一点背景:
您刚刚使用 x
初始化了y
和tf.placeholder()
,并将b
和W
初始化为 { {1}} 即可。
正如名称所说,占位符是一个承诺,以便稍后提供一个值,即
变量只是训练参数(W(矩阵),b(偏差)与我们在日常编程中使用的常规变量相同,培训师在每次运行/步骤中更新/修改。< / p>
虽然占位符并不需要任何初始值,但是当您创建tf.Variable()
和x
时,TF并未分配任何内存,而是在以后你使用feed_dict在y
中提供占位符,TensorFlow将为它们分配适当大小的内存(sess.run()
和x
) - 这种无约束的允许我们提供任何大小和形状的数据
OP的问题:
更新发生在哪里或者是sess.run中隐含的更新?是sess.run(火车......专门知道更新的W和b,因为那些 是变量吗?
是 - y
的第一个参数是培训师,即run()
,其次是GradientDescentOPtimizer
参数:
feed_dict
典型的feed_dict arg - 来自Feed的每个值都会为每个步骤/运行中的占位符提供具体值,它采用以下形式:
session.run(trainer, {feed_dict})
每次都可以继续传递相同的x和y吗?
对于每个步骤{placeholder: feed}
or,
{<placeholder>: <tensor of values to be passed for placeholder>}
和x
将是不同的,即来自Feed的项目(训练数据集)。例如:
y
a = tf.placeholder(tf.float32)
b = tf.placeholder(tf.float32)
adder_node = a + b # + provides a shortcut for tf.add(a, b)
:
sess.run()
产生输出
print(sess.run(adder_node, {a: 3, b:4.5}))
print(sess.run(adder_node, {a: [1,3], b: [2, 4]}))
在第一种情况下,3和4.5将分别传递给a和b,然后传递给adder_node输出7.在第二种情况下,有一个提要列表,第一步和第二步将被添加,接下来的第3和第4步(7.5
[ 3. 7.]
和a
)。