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

Python 试图理解这个简单的TensorFlow代码,python,machine-learning,tensorflow,artificial-intelligence,Python,Machine Learning,Tensorflow,Artificial Intelligence,我对深入学习感兴趣,最近发现了TenserFlow。我安装了它并遵循了在上找到的教程 这是我根据该教程编写的代码: 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

我对深入学习感兴趣,最近发现了TenserFlow。我安装了它并遵循了在上找到的教程

这是我根据该教程编写的代码:

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)
据我所知,它只是返回(线性_模型-y)的平方 然而,y还没有值

然后,将损耗分配给tf.reduce_sum(平方增量)的值。我知道损失需要尽可能低

我怎么解释最后两行呢

我有点理解tf.Session()和tf.global_变量_初始化器(),所以我现在不太关心这两个函数

附加问题:在任意方向(增加或减少)更改tf.train.GradientDescentOptimizer()参数中的值会得到错误的结果。为什么0.01可以工作而0.1,0.001不能

我很感激能得到的任何帮助! 谢谢

据我所知,它只是返回(线性_模型-y)的平方,然而,y还没有值。 然后,将损耗分配给tf.reduce_sum(平方增量)的值。我知道损失需要尽可能低。 我怎么解释最后两行呢

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

附加问题:在任意方向(增加或减少)更改tf.train.GradientDescentOptimizer()参数中的值会得到错误的结果。为什么0.01可以工作而0.1,0.001不能


线性回归(您正在使用)在学习率足够小且迭代次数足够多的情况下收敛。0.1可能太大了,0.01很好,0.001也很好,0.001只需要1000多次迭代,但它会工作(任何较小的值也会工作,但速度要慢得多)。

据我所知,它只返回(线性模型-y)的平方,但是,y还没有值。
你为什么认为,
y
属于占位符类型。说得好。占位符的确切用途是什么?抱歉,如果这是个愚蠢的问题。我试着打印Y的值在它被使用之前和之后,它在所有的情况下都会出错。你是否考虑过阅读文档?我在我的评论中添加了链接。@sascha我只是遵循了“入门”教程。当我对自己正在做的事情有了更好的理解(很多点,很难连接)时,我通常会阅读文档,因为它在早期往往有点难以理解。我不想深入解释每一个函数中都发生了什么,而是想从整体上对每一行和代码的用途有一个可理解的概述。不过,我还是要看看你提供的链接。谢谢,谢谢你的解释。我现在肯定更了解代码了。顺便问一下,人们通常会如何寻找一个好的学习率和迭代次数?我的意思是,在模型经过一段时间的训练后,损失减少的幅度有了显著的下降,进一步的训练将不再增加准确性。这只是一种尝试和错误,还是有一种数学方法?对于线性回归,你可以证明良好/最佳的学习率,但一旦你“深入”你就不会了。因此,一般来说,这是反复试验,因为在非凸世界中,你们不能真正期望,一旦事物“停滞”,它们就再也不会加速——在高度非线性的世界中,“一切都可能发生”。然而,也有一些启发式方法,比如rmsprop或Adam,它们在相对较少的调整下工作得非常好。