【关键字】Tensorflow Linear Regression 线性回归
Tensorflow API 版本:r1.8
我们一行一行来解读下这段代码。代码地址:https://github.com/dabing1022/TensorFlow-Examples/blob/master/examples/2_BasicModels/linear_regression.py
from __future__ import print_function这句导入的作用是什么呢?我们知道目前 Python2.x 版本 和 Python3.x 版本是共存的,print 函数在 Python3.x 是要加括号的 print("Hello World"),而在 Python2.x 中,print "Hello World" 可以这么写,但这么写就会在 Python3.x 环境下报错,为了避免这种情况,__future__ 模块抹平了不同 python 版本的差异性,使得低版本 python 也可以使用高版本的特性,如在 Python2.x 中使用 __future__ 中的 print_function,就可以用 print("Hello World") 这种 Python3.x 的写法了。
导入3个重量嘉宾模块:tensorflow、numpy、matplotlib。tensorflow 负责机器学习部分,numpy 负责高效处理大型矩阵,matplotlib 用于生成图表展示。
numpy.random 模块起了个别名 rng,简写方便后面调用。
设定了学习速率、训练迭代次数、打印显示步数(多少步打印一次,在打印频繁的情况下,可以有效的降低打印量,方便阅读也减少频繁打印造成的卡顿等现象,如在 IPython notebooks 下频繁打印数据量大的情况,可能会造成卡死、打开载入超级慢等现象)初始化值。
训练数据在二维坐标下的 x 值集合和 y 值集合。使用 numpy的 asarray 方法构建。
numpy.asarray vs numpy.array
demo start
这里值得一提的是,将 python 的 list 转化为 numpy 的 array,还可以用 numpy.array(list),那和 numpy.asarray(list) 有什么区别呢?
我们看下 numpy 源码 defchararray.py 中:
asarray(list) 和 array(list) 的最大区别在于是否 copy list。我们举个简单的例子:
很容易对吧,我们来看下 copy 的:
因为 b 是 a 的一个 copy 副本,修改 b 并不会影响 a。
这里是否同样适用于 numpy.asarray 与 numpy.array 呢?
我们做个测试
这个我知道,我知道,array(a) 会 copy 一份 a,修改 b 不会影响 a。
看这个:
什么情况?你不是说 asarray 的 copy 是 False 么,相当于 b 就是 a 么?怎么修改 b 没影响到 a 呢?
错啦。因为 a 是 Python 的 list 类型,而 b 无论用 asarray 还是 array 都是 numpy 的 ndarray 类型,a 在转换为 b 的时候都要进行 copy 一份。所以咱们看到修改 b 并没有影响到 a。
我们再来看一个例子,看完你就明白 asarray 和 array 的区别了。
numpy.asarray vs numpy.array
demo end
tensorflow 的 placeholder 是用来生成占位变量的。上面代码生成了 float 类型的 X 和 Y 变量。为什么要生成一个占位变量呢?关键是为了后面可以为占位变量反复赋值,提高变量的利用率,简化 tensorflow 的数据流图,否则每一个数据都要对应一个变量,流图就会变得非常臃肿,影响性能。
rng 为 numpy.random 模块,rng.randn() 会返回一个符合标准正态分布的一个随机值。
W 是线程方程的 x 的系数权重(weight),为一个数组,b 为截距或者称为偏置(bias)。为了方便理解,最简单的一个一元线性方程 y = wx + b,w是x的系数,当x = 0的时候,y = b,b 称为截距,指的是 x = 0 时,直线与 y 轴的交点值。
数学公式 y = wx + b 的对应表达,也就是我们的训练模型。
cost 就是我们的损失函数。计算方式为每一个样本的预测值与真实值的差值平方和,除以 2 倍的样本数。
优化器使用的是梯度下降。梯度下降是一种寻找函数极值点的算法。机器学习在调整优化模型参数的时候,目标是将损失最小化,刚好可以用梯度下降来寻找损失函数的最小值点。关于梯度下降,小菜与老鸟后面有机会单独开一篇和大家谈谈。
在训练开始前要使用 tf.global_variables_initializer() 一次性初始化所有的可训练变量。如果我们需要初始化指定变量,则可以使用 sess.run(my_variable.initializer)。
sess.run(init) 启动流图。tf.Session.run 方法是一种用于运行 tf.Operation 或对 tf.Tensor 求值的主要机制。我们可以将一个或多个 tf.Operation 或 tf.Tensor 对象传递到 tf.Session.run,TensorFlow 将执行计算结果所需的指令。这里 init 为一个 Op 操作。
tf.Session.run 可以接受 Feed 字典,字典元素的值通常是 Python 标量、列表或者 Numpy 数组,在流图运行的时候会替换 tf.placeholder 张量。
训练集上进行训练,最后训练结果是
损失函数值为0.08左右,模型为 y = 0.29x + 0.50。然后显示图表。
在测试集数据上进行测试,然后显示图表。
运行日志:
从日志中看到,每次迭代过程,cost 损失值都在不断的降低,W 和 b 都在调整优化,在完成指定迭代次数后,我们便获得了比较精准的参数值。
透过这个例子,我们也可以看出使用 tensorflow 进行机器学习的一般步骤:
1. 首先构建流图,初始化模型参数,可以随机赋值,比如可以生成符合标准正态分布的随机值,也可以初值设为0。
2. 读取训练数据。
3. 在训练数据上运行模型,每个训练样本都会得出一个输出值。
4. 根据损失函数计算损失值。将模型的输出值与真实值输入到损失函数计算出一个损失值来表示期望输出到一个差距。
5. 根据损失值调整模型参数。学习的目标就是通过大量训练调整各参数值(这个例子中就是 W 和 b 的值),从而将损失最小化。
6. 调整模型参数后,继续迭代。
7. 训练结束后,我们使用之前拆分出的测试数据集进行测试,计算出损失值看效果。
更多阅读
1. https://www.tensorflow.org/programmers_guide/graphs
2. https://github.com/dabing1022/TensorFlow-Examples/blob/master/examples/2_BasicModels/linear_regression.py
领取专属 10元无门槛券
私享最新 技术干货