试图理解这个简单的TensorFlow代码

时间:2017-03-19 13:49:49

标签: python machine-learning tensorflow artificial-intelligence

我对Deep Learning感兴趣,最近发现了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]))

目前,我只是在进行培训之前对代码感兴趣,以免不堪重负。

现在,我理解(或者至少我认为我这样做)部分代码。它按照教程的说明生成了预期的结果,但是这段代码中的大多数行都让我感到困惑。这可能是因为我不熟悉所涉及的数学,但我不知道这里涉及多少数学,所以很难判断这是不是问题所在。 / p>

无论如何,我理解前6行。 然后就是这一行:

squared_deltas = tf.square(linear_model - y)

据我了解,它只返回(linear_model - y)的平方 但是,y还没有价值。

然后,为损失分配tf.reduce_sum(squared_deltas)的值。我知道损失需要尽可能低。

我如何解释最后两行呢?

我理解tf.Session()和tf.global_variables_initializer(),所以我现在不太关心这两个函数。

额外问题:在任一方向(增加或减少)中更改tf.train.GradientDescentOptimizer()参数中的值会给出错误的结果。当0.1,0.001不是

时,0.01如何工作

我感谢任何帮助! 感谢

1 个答案:

答案 0 :(得分:2)

  

据我了解,它只返回(linear_model - y)的平方但是,y还没有值。   然后,为损失分配tf.reduce_sum(squared_deltas)的值。我知道损失需要尽可能低。   我怎么能解释最后两行?

您显然需要查看TensorFlow文档。你错过了TF背后的核心思想 - 它定义了计算图,此时不涉及计算,你是对的 - 至少没有“y”,至少没有值 - 它只是一个符号变量(占位符)因此我们说我们的损失将是预测值和真值(y)之间差异的平均值,但我们还没有提供它。实际值在会话中开始“生活”,在此之前,这只是计算图表,TF的指令,因此它知道“预期的内容”。

  

额外问题:在任一方向(增加或减少)中更改tf.train.GradientDescentOptimizer()参数中的值会给出错误的结果。当0.1,0.001没有时,0.01如何工作?

如果学习率足够小并且您有足够的迭代次数,则线性回归(您正在使用)会收敛。 0.1可能只是太大,0.01很好,因此是0.001,你只需要超过1000次迭代0.001,但它会工作(任何较小的值,但再次 - 慢得多)。