关于张量流中的会话的解释

时间:2017-03-10 07:09:05

标签: python tensorflow

考虑以下示例中的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吗?然后它继续传递相同的两个xy,并且每次从最后一个版本的W和b迭代?

两个问题:

1)更新发生在哪里或者是sess.run中隐含的更新? sess.run(train...是否专门知道更新的Wb,因为这些是变量?

2)每次都能继续传递相同的x和y吗? - 这个问题只有在我对问题1的想法不正确时才有意义。如果它每次自动更新W,b,那么它完全有意义,我们只是继续前进,直到我们找到最合适的方式。但是,如果更新没有自动发生,那么我不确定......

2 个答案:

答案 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 初始化了ytf.placeholder(),并将bW初始化为 { {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)。