【实践】基于TensorFlow的线性回归算法实现
来源:互联网 发布:php 十六进制转字符串 编辑:程序博客网 时间:2024/06/06 13:11
之前在斯坦福公开课过程中,学习了一些关于线性回归算法的知识,大概了解了它比较基本的原理与算法,结合所学的理论知识,结合TensorFlow的代码,在了解TensorFlow的API的过程中,对线性回归算法再加深理解。
TensorFlow初学例子代码库:https://github.com/aymericdamien/TensorFlow-Examples/
程序在代码库中的路径:examples\2_BasicModels\linear_regression.py
这里面的还有许多其他的程序和资源,在今后的过程中,边学边看。
在开始读这个TensorFlow线性回归的Python程序之前,先看下线性回归中用到的TensorFlow中算法的api:
梯度下降优化器:
tf.train.GradientDescentOptimizer的构造函数:
__init__(learning_rate,use_locking=False,name='GradientDescent')
- 参数1:一个float型的值来表示学习率
- 参数2:表示是否锁定操作过程中的赋值操作,默认(false)是都可以赋值。变量可以进行并发的读和写操作(operation)。由于变量是并发(concurrently)更新的, 所以从一个变量中读出的值可能会改变。在不互斥的条件下,对一个变量的并发的许多赋值操作(operation)是默认允许运行的。在对一个变量赋值时,如果想要加锁。
- 参数3:在执行梯度下降算法时创建的操作名称。
梯度下降优化器中的一个方法:
minimize(loss, global_step=None, var_list=None, gate_gradients=GATE_OP, aggregation_method=None, colocate_gradients_with_ops=False, name=None, grad_loss=None)
- 参数1:一个包含需要最小化值的张量
- 参数2及其之后的参数,都为可选参数,不太明白,之后深入学习之后,再来做深入了解。
算法的计算过程虽然复杂,TensorFlow已经为我们把一些基本算法的实现做成api,从代码上来看,不会很长,但是理解编程过程中的逻辑与算法实现,是非常重要的。
我们知道TensorFlow都基本上是在做构件图和运行图的操作,首先看下例子中是如何构建计算图的:
from __future__ import print_functionimport tensorflow as tfimport numpyimport matplotlib.pyplot as pltrng = numpy.random# Parameterslearning_rate = 0.03 #学习率training_epochs = 1000 #根据误差而做调整的迭代次数display_step = 50 #每50次输出一下计算到的参数值,和误差# Training Datatrain_X = numpy.asarray([3.3,4.4,5.5,6.71,6.93,4.168,9.779,6.182,7.59,2.167, 7.042,10.791,5.313,7.997,5.654,9.27,3.1])train_Y = numpy.asarray([1.7,2.76,2.09,3.19,1.694,1.573,3.366,2.596,2.53,1.221, 2.827,3.465,1.65,2.904,2.42,2.94,1.3])n_samples = train_X.shape[0] # 样本容量即样本个数# tf Graph InputX = tf.placeholder("float") #占位符,给后面的计算过程起站位作用Y = tf.placeholder("float")# Set model weightsW = tf.Variable(rng.randn(), name="weight") #线性回归模型的参数(亦即权重)b = tf.Variable(rng.randn(), name="bias")# Construct a linear modelpred = tf.add(tf.multiply(X, W), b) #线性模型。y=WX+b# Mean squared errorcost = tf.reduce_sum(tf.pow(pred-Y, 2))/(2*n_samples) #均方差# Gradient descentoptimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost) #基于均方差做梯度下降算法
上面的代码都是TensorFlow中对计算图的构建,计算图和数据都准备好之后,就可以运行会话来操作计算图了:
# Initializing the variablesinit = tf.global_variables_initializer() #TensorFlow中对变量的初始化# Launch the graph 以上计算图的构建就算完成了,下面开始将图放在会话中开始执行with tf.Session() as sess: sess.run(init) #初始化变量 # Fit all training data for epoch in range(training_epochs): #开始用for循环训练数据迭代计算 for (x, y) in zip(train_X, train_Y): #将训练的数据,成对取出 sess.run(optimizer, feed_dict={X: x, Y: y}) #执行梯度下降优化器(同时给优化器喂数据) # Display logs per epoch step 每50次迭代输出log if (epoch+1) % display_step == 0: c = sess.run(cost, feed_dict={X: train_X, Y:train_Y}) print("Epoch:", '%04d' % (epoch+1), "cost=", "{:.9f}".format(c), \ "W=", sess.run(W), "b=", sess.run(b)) print("Optimization Finished!") training_cost = sess.run(cost, feed_dict={X: train_X, Y: train_Y}) print("Training cost=", training_cost, "W=", sess.run(W), "b=", sess.run(b), '\n') #输出结果 # Graphic display plt.plot(train_X, train_Y, 'ro', label='Original data') #用训练数据画线性图 plt.plot(train_X, sess.run(W) * train_X + sess.run(b), label='Fitted line') plt.legend() plt.show() # Testing example, as requested (Issue #2) 用测试数据来检测上面的学习结果,并绘图 test_X = numpy.asarray([6.83, 4.668, 8.9, 7.91, 5.7, 8.7, 3.1, 2.1]) test_Y = numpy.asarray([1.84, 2.273, 3.2, 2.831, 2.92, 3.24, 1.35, 1.03]) print("Testing... (Mean square loss Comparison)") testing_cost = sess.run( tf.reduce_sum(tf.pow(pred - Y, 2)) / (2 * test_X.shape[0]), feed_dict={X: test_X, Y: test_Y}) # same function as cost above print("Testing cost=", testing_cost) print("Absolute mean square loss difference:", abs( training_cost - testing_cost)) plt.plot(test_X, test_Y, 'bo', label='Testing data') plt.plot(test_X, sess.run(W) * test_X + sess.run(b), label='Fitted line') plt.legend() plt.show()
根据算法的理论,学习率决定了这个损失函数趋近最小值时做出调整前后的差值大小,如果选大,有可能在最小值周围震荡,若设置偏小,则趋近速度减小,效率低下。
可以根据需要来对其进行修改。
上面程序输出结果如下:
基于训练数据,训练出来的线性模型作图:
测试数据集,与线性模型的误差关系:
执行过程中输出的log:
- 【实践】基于TensorFlow的线性回归算法实现
- 基于Tensorflow实现基本的线性回归(Linear regression)
- 基于tensorflow的线性回归模型
- tensorflow 实现线性回归
- Tensorflow实现线性回归
- Tensorflow实现线性回归
- TensorFlow实现线性回归
- tensorflow实践-02:线性回归
- tensorflow实现线性回归的完整程序
- 【TensorFlow】TensorFlow的线性回归
- Keras上基于TensorFlow实现简单线性回归模型
- 深度学习算法实践5---线性回归算法实现
- 深度学习算法实践5---线性回归算法实现
- 深度学习算法实践5---线性回归算法实现
- 线性回归算法实现
- 使用TensorFlow实现简单的线性回归(LinearRegression)
- TensorFlow实现一个简单的线性回归预测
- 基于.NET实现数据挖掘--线性回归算法
- swift数组
- 苹果开发文档学习链接
- 【leetcode】203. Remove Linked List Elements
- redis配置认证密码
- 一个简单的BP神经网络matlab程序(附函数详解)
- 【实践】基于TensorFlow的线性回归算法实现
- 学习JavaScript闭包
- 错误记录:使用了mysql_affected_rows修改方法的返回值判断要>0
- 常见的几种浏览器兼容性问题和解决方案
- 微信小程序(Mini Program)
- 创建与使用WEBAPI
- Python学习2
- 【POJ3335】博物馆守卫Rotating Scoreboard 半平面交
- 服务器挖矿又出新服务 wnTKYg