【实践】基于TensorFlow的线性回归算法实现
2017-03-06 10:35
260 查看
之前在斯坦福公开课过程中,学习了一些关于线性回归算法的知识,大概了解了它比较基本的原理与算法,结合所学的理论知识,结合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都基本上是在做构件图和运行图的操作,首先看下例子中是如何构建计算图的:
上面的代码都是TensorFlow中对计算图的构建,计算图和数据都准备好之后,就可以运行会话来操作计算图了:
根据算法的理论,学习率决定了这个损失函数趋近最小值时做出调整前后的差值大小,如果选大,有可能在最小值周围震荡,若设置偏小,则趋近速度减小,效率低下。
可以根据需要来对其进行修改。
上面程序输出结果如下:
基于训练数据,训练出来的线性模型作图:
测试数据集,与线性模型的误差关系:
执行过程中输出的log:
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_function import tensorflow as tf import numpy import matplotlib.pyplot as plt rng = numpy.random # Parameters learning_rate = 0.03 #学习率 training_epochs = 1000 #根据误差而做调整的迭代次数 display_step = 50 #每50次输出一下计算到的参数值,和误差 # Training Data train_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 Input X = tf.placeholder("float") #占位符,给后面的计算过程起站位作用 Y = tf.placeholder("float") # Set model weights W = tf.Variable(rng.randn(), name="weight") #线性回归模型的参数(亦即权重) b = tf.Variable(rng.randn(), name="bias") # Construct a linear model pred = tf.add(tf.multiply(X, W), b) #线性模型。y=WX+b # Mean squared error cost = tf.reduce_sum(tf.pow(pred-Y, 2))/(2*n_samples) #均方差 # Gradient descent optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost) #基于均方差做梯度下降算法
上面的代码都是TensorFlow中对计算图的构建,计算图和数据都准备好之后,就可以运行会话来操作计算图了:
# Initializing the variables init = 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}) #执行梯度下降优化 b1a3 器(同时给优化器喂数据) # 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:
相关文章推荐
- 基于CC2430/31的Zigbee实践(7)—Zstack1.4.3实现协调器和路由器之间串口通信
- 一、东软实践项目2-基于android平台的应用开发:实现页面之间的跳转
- OpenCV实践之路——基于暗通道先验的去雾算法简单实现
- 【Caffe实践】基于Caffe的人脸识别实现
- win2k环境下基于JBOSS的J2EE开发实践----之三、有状态会话 Bean的开发及多种调用有状态会话Bean方法的实现
- Asp.Net MVC实践 - 自定义ActionResult实现Rss输出 (基于ASP.NET MVC Preview 3)
- 基于回归神经网络的中文语句模型实践(Python+Tensorflow+阿里云)
- [转载]基于TFS实践敏捷-实现用户场景
- 【Caffe实践】基于Caffe的人脸检测实现
- 【Caffe实践】基于Caffe的人脸关键点检测实现
- 【Caffe实践】基于Caffe的人脸检测实现
- 实践中更高效、实现起来相对简单的基于末尾坏字符原则的BM算法实现
- 基于React.js实现webapp的技术实践
- java基于TCP的socket编程简单实现[代码实践过]
- 【Caffe实践】基于Caffe的人脸识别实现
- 【实践】基于百度地图API实现的地图形式天气预报【二】
- Java网络编程实践和总结 --- 基于TCP的Socket编程之实现文件上传和下载服务
- 【Caffe实践】基于Caffe的人脸识别实现
- 【Caffe实践】基于Caffe的人脸关键点检测实现
- 【Caffe实践】基于Caffe的人脸检测实现