试图理解这个简单的 TensorFlow 代码
Posted
技术标签:
【中文标题】试图理解这个简单的 TensorFlow 代码【英文标题】:Trying to understand this simple TensorFlow code 【发布时间】:2017-08-10 18:32:03 【问题描述】:我对深度学习很感兴趣,最近发现了 TenserFlow。我安装了它并按照https://www.tensorflow.org/get_started/get_started 上的教程进行操作。
这是我按照该教程提出的代码:
import tensorflow as tf
W = tf.Variable(0.3, tf.float32)
b = tf.Variable(-0.3, tf.float32)
x = tf.placeholder(tf.float32)
y = tf.placeholder(tf.float32)
linear_model = W * x + b
squared_deltas = tf.square(linear_model - y)
loss = tf.reduce_sum(squared_deltas)
sess = tf.Session()
init = tf.global_variables_initializer()
sess.run(init)
optimizer = tf.train.GradientDescentOptimizer(0.01)
train = optimizer.minimize(loss)
sess.run(init)
for i in range(1000):
sess.run(train, x:[1,2,3,4], y:[0,-1,-2,-3])
print(sess.run([W, b]))
目前,我只对训练之前的代码感兴趣,以免不知所措。
现在,我了解(或至少我认为我了解)这段代码的部分内容。它按照教程产生了预期的结果,但是这段代码中的大多数行都让我感到困惑。这可能是因为我不熟悉所涉及的数学,但我不知道这里实际涉及到多少数学,所以很难判断这是否是问题所在。
无论如何,我理解前 6 行。 然后是这一行:
squared_deltas = tf.square(linear_model - y)
据我了解,它只是返回 (linear_model - y) 的平方 但是, y 还没有值。
然后,loss 被赋值为 tf.reduce_sum(squared_deltas)。我知道损失需要尽可能低。
我如何解释最后两行?
我有点理解 tf.Session() 和 tf.global_variables_initializer() 所以我现在不太关心这两个函数。
额外问题:在任一方向(增加或减少)更改 tf.train.GradientDescentOptimizer() 参数中的值都会给我错误的结果。为什么 0.01 有效,而 0.1,0.001 无效?
感谢我能得到的任何帮助! 谢谢
【问题讨论】:
As I understand it, it simply returns the square of (linear_model - y) However, y has no value yet.
你为什么认为,y
是 placeholder 类型。 docs
好点。占位符的确切用途是什么?对不起,如果这是一个愚蠢的问题。我尝试在“使用”之前和之后打印 y 的值,但在所有情况下都返回错误。
您是否考虑过阅读文档?我在评论中添加了链接。
@sascha 我只是按照“入门”教程进行操作。当我对自己正在做的事情有了更好的理解(很多点,难以连接)时,我通常会阅读文档,因为早期往往有点难以理解。我不是在寻找对每个函数中发生的事情的深入解释,而是更多可以让我对每一行的目的和整个代码有一个可理解的概述的东西。但是,我会看看你提供的链接。谢谢。
【参考方案1】:
据我了解,它只是返回 (linear_model - y) 的平方但是,y 还没有值。 然后,loss 被赋值为 tf.reduce_sum(squared_deltas)。我知道损失需要尽可能低。 我该如何解释最后两行?
您显然需要浏览 TensorFlow 文档。您错过了 TF 背后的核心思想 - 它定义了 计算图,此时不涉及计算,您是对的 - 还没有“y”,至少没有值 - 它只是一个符号变量(占位符)因此我们说我们的损失将是预测和真实值(y)之间差异的平方的平均值,但我们还没有提供它。实际值在会话中开始“活跃”,在此之前这只是计算图,TF 的指令,因此它知道“预期什么”。
额外问题:在任一方向(增加或减少)更改 tf.train.GradientDescentOptimizer() 参数中的值都会给我错误的结果。为什么 0.01 有效,而 0.1,0.001 无效?
如果学习率足够小并且您有足够的迭代次数,线性回归(您正在使用的)会收敛。 0.1 可能太大了,0.01 很好,0.001 也很好,0.001 只需要超过 1000 次迭代,但它会起作用(任何较小的值也会起作用,但同样 - 慢得多)。
【讨论】:
感谢您的解释。我现在肯定更好地理解了代码。顺便说一句,通常如何尝试找到一个好的学习率和迭代次数?我的意思是,模型经过一段时间的训练后,损失减少会显着下降,以至于进一步训练它不会再提高准确性。只是反复试验还是有数学方法? 对于线性回归,您可以证明良好/最佳的学习率,但一旦您“深入”,您就不会。因此,总的来说,这是反复试验,因为在非凸世界中,您不能真正期望一旦事物“高原”,它们将永远不会再次加速——在高度非线性的世界中,“一切都可能发生”。然而,有一些启发式方法,如 rmsprop 或 Adam,在调整相对较少的情况下工作得非常好。以上是关于试图理解这个简单的 TensorFlow 代码的主要内容,如果未能解决你的问题,请参考以下文章