[tensorflow] 线性回归模型实现
在这一篇博客中大概讲一下用tensorflow如何实现一个简单的线性回归模型,其中就可能涉及到一些tensorflow的基本概念和操作,然后因为我只是入门了点tensorflow,所以我只能对部分代码给出相关的tensorflow的概念。
线性回归模型的表达式如下:
其中,是权重,
是偏置,
和
则是输入数据和对应的模型预测值。
在tensorflow中,是用图来表示计算的形式的,图中的每个节点称为一个op(即operation),每个operation获得相关张量(Tensor)后进行数值计算,每个张量就是一个类型化的多维数组,用图表示了计算的形式后并不会计算和得到结果,需要在会话(session)中执行(run)才会进行计算并得到结果。
要实现上面的式子,一般是要先声明好相关参数的张量,代码如下:
# 设置tensorflow图模型的输入
X = tf.placeholder("float")
Y = tf.placeholder("float")
上面两句代码声明了模型的输入数据和对应的真实值(或者叫标签),tf.placeholder()可以理解为为变量设置形参,在运算的时候再进行赋值,函数原型为:
placeholder(dtype, shape=None, name=None):
有了输入数据之后,我们还需要先声明好权值和偏置,代码如下:
# 设置模型权重和偏置
W = tf.Variable(rng.randn(), name="weight")
b = tf.Variable(rng.randn(), name="bias")
这两句定义了两个变量,并且将两个变量随机初始化,并设置名称,tf.Variable()函数是tensorflow定义变量的的函数。
有了前面的变量之后,我们需要构造计算的表达式,这里就涉及到tensorflow中的一些基本运算:
tf.add() #相加
# 算术操作符:+ - * / %
tf.add(x, y, name=None) # 加法(支持 broadcasting)
tf.subtract(x, y, name=None) # 减法
tf.multiply(x, y, name=None) # 乘法
tf.divide(x, y, name=None) # 浮点除法, 返回浮点数(python3 除法)
tf.mod(x, y, name=None) # 取余
有了上述基本的算术操作之后构造一个线性回归模型的表达式就简单了:
# Construct a linear model
pred = tf.add(tf.multiply(X, W), b)
现在表达式已经有了,在训练的过程中我们还需要一个损失函数来衡量模型的误差并更新参数,线性回归模型比较常用的损失函数是均方误差(mean squared error):
cost = tf.reduce_sum(tf.pow(pred-Y, 2))/(2*N_samples)
优化函数这里选择最常见的随机梯度下降法(SGD),这个在tensorflow中是内置的,可以直接调用。
好了,这样基本的架构有了,就需要让训练跑起来,这个时候就需要构造一个会话(Session),会话(session)拥有并管理TensorFlow 程序运行时的所有资源。当所有计算完成之后需要关闭会话来帮助系统回收资源,否则就可能出现资源泄漏的问题。创建会话的方式有两种:
1、第一种模式需要明确调用会话生成函数和关闭会话函数:
sess = tf.Session()
...
sess.close()
2、第一种模式在所有计算完成之后,需要明确调用Session.close 函数来关闭会话并释放资源。然而,当程序因为异常而退出时,关闭会话的函数可能就不会被执行从而导致资源泄漏。为了解决异常退出时资源释放的问题,TensorFlow 可以通过Python 的上下文管理器来使用会话:
with tf.Session() as sess:
...
所以,这里我们采用第二种方式是比较合适的。
接着就是一个迭代过程,在每次迭代开始之后,我们需要把数据填充到前面所声明的两个占位符X和Y中,并执行优化算法:
sess.run(optimizer, feed_dict={X: x, Y: y})
完整的代码如下:
from __future__ import print_function
import tensorflow as tf
import numpy
import matplotlib.pyplot as plt
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets as skd
from sklearn.model_selection import train_test_split
rng = numpy.random
# 设置初始训练参数
learning_rate = 0.01
training_epochs = 5000
display_step = 50
# 从sklearn中加载波士顿房价数据集,该数据集的数据为[506,13],标签为[506]
data = skd.load_boston()
print("data.shape = ", data.data.shape)
print("target.shape = ", data.target.shape)
# 将数据集的数据和标签分离
#X_data = data.data[:,12]
X_data = data.data[:,12]
Y_data = data.target
print("X_data.shape = ", X_data.shape)
print("Y_data.shape = ", Y_data.shape)
print("X_data[0:20, 12] = ", X_data[0:20])
print("Y_data[0:20, 12] = ", Y_data[0:20])
# 将数据和标签分成训练集和测试集
x_train,x_test,y_train,y_test = train_test_split(X_data,Y_data,test_size=0.3,random_state=0)
print("x_train.shape = ", x_train.shape)
print("x_test.shape = ", x_test.shape)
print("y_train.shape = ", y_train.shape)
print("y_test.shape = ", y_test.shape)
N_sample = x_train.shape[0]
# 构建图模型计算的输入
X = tf.placeholder("float")
Y = tf.placeholder("float")
# 定义权重和偏置
W = tf.Variable(rng.randn(), name="weight")
b = tf.Variable(rng.randn(), name="bias")
# 构件图模型结构
y = tf.add(tf.multiply(W, X), b)
# 定义损失函数
cost = tf.reduce_sum(tf.pow(y-Y, 2)/2/N_sample)
# 定义优化函数
optimizer = tf.train.GradientDescentOptimizer(learning_rate=learning_rate).minimize(cost)
# 定义初始化器
init = tf.global_variables_initializer()
# 在会话中运行图模型计算
with tf.Session() as sess:
# 执行初始化
sess.run(init)
# 开始迭代训练
for epoch in range(training_epochs):
for (x, y) in zip(x_train, y_train):
sess.run(optimizer, feed_dict={X: x, Y: y})
if (epoch+1) % display_step == 0:
c = sess.run(cost, feed_dict={X: x_train, Y:y_train})
print("Epoch:", '%04d' % (epoch+1), "cost=", "{:.9f}".format(c), "W=", sess.run(W), "b=", sess.run(b))
# 完成训练
print("训练完成")
training_cost = sess.run(cost, feed_dict={X: x_train, Y: y_train})
print("训练误差=", training_cost, "W=", sess.run(W), "b=", sess.run(b), '\n')
# 画图显示
plt.plot(x_train, y_train, 'ro', label='Original data')
plt.plot(x_train, sess.run(W) * x_train + sess.run(b), label='Fitted line')
plt.legend()
plt.show()
# 开始测试数据
cost_test = tf.reduce_sum(tf.pow(y - Y, 2)) / (2 * x_test.shape[0])
testing_cost = sess.run(cost_test, feed_dict={X: x_test, Y: y_test})
print("测试=", testing_cost)
print("Absolute mean square loss difference:", abs(training_cost - testing_cost))
plt.plot(x_test, y_test, 'bo', label='Testing data')
plt.plot(x_train, sess.run(W) * x_train + sess.run(b), label='Fitted line')
plt.legend()
plt.show()
这里的数据采用的是sklearn提供的波士顿房价数据,这个数据集是一个506*13维的数据集,我提取了其中的第二轴的第12维的数据来训练和预测,然后将数据集分成训练集和测试集,比例是7:3,代码运行中间训练信息:

训练数据和拟合的表达式如下:

测试数据集和表达式如下:

前面讲的是一元的线性回归模型,下面就讲一下多元线性回归模型的实现。数据依然是sklearn内置的波士顿房价数据,这个数据有506个样本,每个样本有13维特征,跟前面一样,这里先加载数据进来,然后切分为训练集和测试集:
boston = skd.load_boston()
X_data = boston.data
Y_data = boston.target
x_train,x_test,y_train,y_test = train_test_split(X_data,Y_data,test_size=0.3,random_state=0)
x_train = scale(x_train)
x_test = scale(x_test)
y_train = scale(y_train.reshape((-1,1)))
y_test = scale(y_test.reshape((-1,1)))
然后,同样的,定义图模型计算的输入和标签:
X = tf.placeholder(tf.float32, [None, 13])
Y = tf.placeholder(tf.float32, [None, 1])
定义权重和偏置:
W = tf.Variable(tf.random_normal([13, 1]),dtype=tf.float32, name="weight")
b = tf.Variable(tf.random_normal([1]),dtype=tf.float32, name="bias")
然后定义模型结构表达式和损失函数:
# 注意这里是矩阵相乘,所以要用tf.matmul
y = tf.add(tf.matmul(X, W), b)
cost = tf.reduce_mean(tf.square(Y-y))
剩下的操作其实就跟前面类似了,不过这里要说一下,如果像保存训练好的模型,那可以这么做:
saver = tf.train.Saver() with tf.Session() as sess:
# 训练
saver.save(sess, "file_path/model_name.ckpt")
保存模型之后,如果要加载模型的话,可以这么做:
saver = tf.train.Saver()
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
saver.restore(sess,"file_path/")# 注意这里,只要到目录就可以
sess.run(...)
完整的代码如下:
from __future__ import print_function
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets as skd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import scale
rng = numpy.random
# 设置初始训练参数
learning_rate = 0.001
training_epochs = 100000
display_step = 50
# 从sklearn中加载波士顿房价数据集,该数据集的数据为[506,13],标签为[506]
boston = skd.load_boston()
# 将数据集的数据和标签分离
X_data = boston.data
Y_data = boston.target
print("X_data.shape = ", X_data.shape)
print("Y_data.shape = ", Y_data.shape)
# 将数据和标签分成训练集和测试集
x_train,x_test,y_train,y_test = train_test_split(X_data,Y_data,test_size=0.3,random_state=0)
x_train = scale(x_train)
x_test = scale(x_test)
y_train = scale(y_train.reshape((-1,1)))
y_test = scale(y_test.reshape((-1,1)))
print("x_train.shape = ", x_train.shape)
print("x_test.shape = ", x_test.shape)
print("y_train.shape = ", y_train.shape)
print("y_test.shape = ", y_test.shape)
N_sample = x_train.shape[0]
# 构建图模型计算的输入
X = tf.placeholder(tf.float32, [None, 13])
Y = tf.placeholder(tf.float32, [None, 1])
# 定义权重和偏置
#W = tf.Variable(rng.randn(), name="weight")
#b = tf.Variable(rng.randn(), name="bias")
W = tf.Variable(tf.random_normal([13, 1]),dtype=tf.float32, name="weight")
b = tf.Variable(tf.random_normal([1]),dtype=tf.float32, name="bias")
# 构件图模型结构
y = tf.add(tf.matmul(X, W), b)
#y = tf.matmul(X, W)+b
# 定义损失函数
#cost = tf.reduce_sum(tf.pow(y-Y, 2)/2/N_sample)
cost = tf.reduce_mean(tf.square(Y-y))
# 定义优化函数
optimizer = tf.train.GradientDescentOptimizer(learning_rate=learning_rate).minimize(cost)
# 定义初始化器
init = tf.global_variables_initializer()
# 创建保存模型
saver = tf.train.Saver()
# 在会话中运行图模型计算
with tf.Session() as sess:
# 执行初始化
sess.run(init)
# 开始迭代训练
for epoch in range(training_epochs):
sess.run(optimizer, feed_dict={X: x_train, Y: y_train})
if (epoch+1) % display_step == 0:
c = sess.run(cost, feed_dict={X: x_train, Y:y_train})
print("Epoch:", '%04d' % (epoch+1), "cost=", "{:.9f}".format(c), "W=", sess.run(W), "b=", sess.run(b))
# 完成训练
saver.save(sess, "linear_regression/LiR4MultiFeatures.ckpt")
print("训练完成")
training_cost = sess.run(cost, feed_dict={X: x_train, Y: y_train})
print("训练误差=", training_cost, "W=", sess.run(W), "b=", sess.run(b), '\n')
# 画图显示
plt.plot(x_train[:,12], y_train, 'ro', label='Original data')
pred = sess.run(y, feed_dict={X: x_train})
plt.plot(x_train[:,12], pred, 'bx', label='predict data')
plt.legend()
plt.show()
# 开始测试数据
cost_test = tf.reduce_sum(tf.pow(y - Y, 2)) / (2 * x_test.shape[0])
testing_cost = sess.run(cost_test, feed_dict={X: x_test, Y: y_test})
print("Testing cost=", testing_cost)
print("Absolute mean square loss difference:", abs(training_cost - testing_cost))
plt.plot(x_test[:,12], y_test, 'ro', label='Testing data')
pred_test = sess.run(y, feed_dict={X: x_test})
plt.plot(x_test[:,12], pred_test, 'bx', label='predicted data')
plt.legend()
plt.show()
# 加载本地训练好的模型进行预测
model_file=tf.train.latest_checkpoint("linear_regression/")
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
saver.restore(sess,model_file)
cost_test = tf.reduce_sum(tf.pow(y - Y, 2)) / (2 * x_test.shape[0])
testing_cost = sess.run(cost_test, feed_dict={X: x_test, Y: y_test})
print("Testing cost=", testing_cost)
print("Absolute mean square loss difference:", abs(training_cost - testing_cost))
plt.plot(x_test[:,12], y_test, 'bo', label='Testing data')
pred_test = sess.run(y, feed_dict={X: x_test})
plt.plot(x_test[:,12], pred_test, 'rx', label='predicted data')
plt.legend()
plt.show()
训练出来的效果如下:



昨夜夜半,枕上分明梦见。
语多时。
依旧桃花面,频低柳叶眉。
半羞还半喜,欲去又依依。
觉来知是梦,不胜悲。
-- 韦庄 《女冠子·昨夜夜半》
[tensorflow] 线性回归模型实现的更多相关文章
- TensorFlow从1到2(七)线性回归模型预测汽车油耗以及训练过程优化
线性回归模型 "回归"这个词,既是Regression算法的名称,也代表了不同的计算结果.当然结果也是由算法决定的. 不同于前面讲过的多个分类算法或者逻辑回归,线性回归模型的结果是 ...
- tensorflow入门(1):构造线性回归模型
今天让我们一起来学习如何用TF实现线性回归模型.所谓线性回归模型就是y = W * x + b的形式的表达式拟合的模型. 我们先假设一条直线为 y = 0.1x + 0.3,即W = 0.1,b = ...
- 线性回归模型的 MXNet 与 TensorFlow 实现
本文主要探索如何使用深度学习框架 MXNet 或 TensorFlow 实现线性回归模型?并且以 Kaggle 上数据集 USA_Housing 做线性回归任务来预测房价. 回归任务,scikit-l ...
- 用Tensorflow完成简单的线性回归模型
思路:在数据上选择一条直线y=Wx+b,在这条直线上附件随机生成一些数据点如下图,让TensorFlow建立回归模型,去学习什么样的W和b能更好去拟合这些数据点. 1)随机生成1000个数据点,围绕在 ...
- TensorFlow笔记-模型的保存,恢复,实现线性回归
模型的保存 tf.train.Saver(var_list=None,max_to_keep=5) •var_list:指定将要保存和还原的变量.它可以作为一个 dict或一个列表传递. •max_t ...
- 【scikit-learn】scikit-learn的线性回归模型
内容概要 怎样使用pandas读入数据 怎样使用seaborn进行数据的可视化 scikit-learn的线性回归模型和用法 线性回归模型的评估測度 特征选择的方法 作为有监督学习,分类问题是预 ...
- R语言解读多元线性回归模型
转载:http://blog.fens.me/r-multi-linear-regression/ 前言 本文接上一篇R语言解读一元线性回归模型.在许多生活和工作的实际问题中,影响因变量的因素可能不止 ...
- R语言解读一元线性回归模型
转载自:http://blog.fens.me/r-linear-regression/ 前言 在我们的日常生活中,存在大量的具有相关性的事件,比如大气压和海拔高度,海拔越高大气压强越小:人的身高和体 ...
- 多元线性回归 ——模型、估计、检验与预测
一.模型假设 传统多元线性回归模型 最重要的假设的原理为: 1. 自变量和因变量之间存在多元线性关系,因变量y能够被x1,x2-.x{k}完全地线性解释:2.不能被解释的部分则为纯粹的无法观测到的误差 ...
随机推荐
- extjs开发———用extJS简单写一个饼状图
先上效果图: js编写部分简单如下,先插入一个模块,然后给模块中添加内容. var myChart1 = echarts.init(document.getElementById('myChart1' ...
- java不要登录发送邮件noReply
最近在工作中遇到一个问题: 客户需要让我们的系统给他们发邮件,但是不给我们提供用户密码. 这样就导致一个问题,即,一般我们使用的都是smtp方式发邮件,发邮件的时候必须登录,虽然可以修改发件人的邮箱名 ...
- 026、MySQL取字符串左边,取字符串右边,取字符串中间,取文本开始位置
#取文本左边 ); #田 ); #田攀 ); #田攀5 #取文本右边 ); # ); # ); #攀52 #取文本中间 '); #田攀 '); #攀5 #从字符串s中获取s1的开始位置 不忘初心,如果 ...
- SpringBoot-拦截器配置
SpringBoot-拦截器配置 SpringBoot-拦截器配置 在我们的SSM项目中,可以在web.xml中配置拦截器,但是在SpringBoot中只能使用java类来配置,配置方法如下. 创建拦 ...
- H5页面单点登录跳回首页 http url参数转义
在往首页跳的时候因为是单点登录进来的,url后面会带有参数,然后存入会话,所以我要拿到原本存入会话的参数放入url后面 但是返回的时候页面报错了 http://localhost:18086/h5ap ...
- Git如何将本地test分支设置跟踪origin/test分支
前提条件: 有一个远程仓库其中只有一个master分支,然后我把它clone到本地 1.新建一个本地分支test, 2.然后把它push到远程仓库(git push origin test) 3.本地 ...
- HihoCoder第十三周:最近公共祖先 一
#1062 : 最近公共祖先·一 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 同城那样神奇,但这个网站仍然让小Ho乐在其中,但这是为什么呢? "为什么呢?& ...
- 用fiddler监控移动端的通讯
用fiddler监控移动端的通讯 1 依次打开Fiddler->Tools->Fiddler Options在[Connection]面板里将Allow remote computers ...
- 官网英文版学习——RabbitMQ学习笔记(九)总结
RabbitMQ与spingboot相整合,主要步骤也很简单: 一.首先需要的是添加依赖 二.需要设置属性,属性主要是设置rabbitmq的地址端口,用户名密码回调等需要用到的一些常量,在整合过程中, ...
- laravel.url
通过php artisan route:list 可以看到当前应用的路由情况, 在前端页面中如果要修改一个实体,需要用到实体.update,涉及的uri为实体/{实体},所用的http方法为put. ...