Tensorflow之单变量线性回归问题的解决方法

跟着网易云课堂上面的免费公开课深度学习应用开发Tensorflow实践学习,学到线性回归这里感觉有很多需要总结,梳理记录下阶段性学习内容。

题目:通过生成人工数据集合,基于TensorFlow实现y=2*x+1线性回归

使用Tensorflow进行算法设计与训练的核心步骤

(1)准备数据

(2)构建模型

(3)训练模型

(4)进行预测

#线性回归问题

#******************一、准备数据:**********************

#生成人工数据集

# 在Jupter中,使用matplotlib显示图像需要设置为inline模式,否则不会显示图像
%matplotlib inline

import matplotlib.pyplot as plt #载入matplotlib,用于绘图
import numpy as np #载入numpy,numpy是Python进行科学计算时的基础模块
import tensorflow as tf #载入Tensorflow

#设置随机种子。训练之后结果随机,随机种子起到固定初始值的作用,为了训练之后得到一样的结果
np.random.seed(5)
#直接采用np生成等差数列的方法,生成100个点,每个点的取值在-1~1之间
x_data = np.linspace(-1,1,100)

# y = 2x +1 + 噪声,其中,噪声的维度与x_data一致
y_data = 2 * x_data + 1.0 + np.random.randn(*x_data.shape) * 0.4

#***********************二、构建线性模型*************************

#定义训练数据的占位符,x是特征,y是标签值
x = tf.placeholder("float",name= "x")
y = tf.placeholder("float",name = "y")

#定义模型函数
def model(x,w,b):
    return tf.multiply(x,w) + b

#定义模型结构
#Tensorflow变量的声明函数是tf.Variable。tf.Variable的作用是保存和更新函数,变量的初始值可以是随机数、常数,或是通过其他变量的初始值计算得到
#构建线性函数的斜率,变量w
w = tf.Variable(1.0,name = "w0")
#构建线性函数的截距,变量b
b = tf.Variable(0.0,name = "b0")

#pred是预测值,前向计算
pred = model(x,w,b)

#************************三、训练模型*******************************
#设置训练参数
#迭代次数(训练轮数)
train_epochs = 10

#学习率
learning_rate = 0.05

#定义优化器、最小损失函数

#定义损失函数,损失函数用于描述预测值与真实值之间的差别,从而指导模型收敛方向。常见损失函数:均方差、交叉熵
#采用均方差作为损失函数
loss_function = tf.reduce_mean(tf.square(y-pred))

#定义优化器
#定义优化器Optimizer,初始化一个GradientDescentOptimizer(梯度下降优化器)
#设置学习率和优化目标:最小化损失
optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss_function)

#创建会话
#声明会话
sess = tf.Session()
#变量初始化
#在真正执行计算前,需要将所有变量初始化。通过tf.global_variables_initializer函数可实现对所有变量的初始化
init = tf.global_variables_initializer()
sess.run(init)

#迭代训练
#模型训练阶段,设置迭代轮次,每次通过将样本逐个输入模型,进行梯度下降优化操作。每轮迭代后,绘制出模型曲线
#开始训练,轮次为epoch,采用SGD随机梯度下降优化方法
for epoch in range(train_epochs):
    for xs,ys in zip(x_data,y_data):
        _,loss = sess.run([optimizer,loss_function],feed_dict={x:xs,y:ys})
    b0temp = b.eval(session=sess)
    w0temp = w.eval(session=sess)
    plt.plot(x_data,w0temp * x_data + b0temp)  #画图

#结果查看。当训练完成后,打印查看参数。数据每次运行都可能会有所不同
print("w:",sess.run(w))     #w的值应该在2附近
print("b:",sess.run(b))     #b的值应该在1附近

#结果可视化
plt.scatter(x_data,y_data,label=‘Original data‘)
plt.plot(x_data,x_data*sess.run(w) + sess.run(b),label=‘Fitted line‘,color=‘r‘,linewidth=3)
plt.legend(loc=2) #通过参数loc指定图例位置

#*********************四、利用学习到的模型进行预测*******************

x_test = 3.21

predict = sess.run(pred,feed_dict={x:x_test})
print("预测值: %f"%predict)

target = 2 * x_test + 1.0
print("目标值: %f"%target)

  题目二:通过生成人工数据集合,基于TensorFlow实现y=3.1234*x+2.98线性回归

# 在Jupter中,使用matplotlib显示图像需要设置为inline模式,否则不会显示图像
%matplotlib inline

import matplotlib.pyplot as plt #载入matplotlib
import numpy as np #载入numpy
import tensorflow as tf #载入Tensorflow

#设置随机种子
np.random.seed(5)
#直接采用np生成等差数列的方法,生成100个点,每个点的取值在-1~1之间
x_data = np.linspace(-1,1,100)
# y = 3.1234x +2.98 + 噪声, 其中, 噪声的唯度与x_data一致
y_data = 3.1234*x_data + 2.98 + np.random.randn(*x_data.shape)*0.4
x = tf.placeholder("float",name = "x")
y = tf.placeholder("float",name = "y")

def model(x,w,b):
    return tf.multiply(x,w)+b
# 构建线性函数的斜率, 变量w
w = tf.Variable(1.0,name="w")
# 构建线性函数的截距,变量b
b = tf.Variable(0.0, name="b0")
#pred是预测值,前向计算
pred = model(x,w,b)

# 迭代次数(训练轮数)
train_epochs = 10
# 学习率
learning_rate = 0.05
# 采用均方差作为损失函数
loss_function = tf.reduce_mean(tf.square(y-pred))
# 梯度下降优化器
optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss_function)
sess = tf.Session()
init = tf.global_variables_initializer()
sess.run(init)

# 开始训练,轮数为 epoch,采用SGD随机梯度下降优化方法
#zip为组装,x,y都为一维数组. zip 把x,y组装起来也为一维数组,每个单元为(x,y)

for epoch in range(train_epochs):
    for xs,ys in zip(x_data, y_data):
        #优化器给了一个下划线,loss_function 给了loss
        _, loss=sess.run([optimizer,loss_function],feed_dict={x: xs, y:ys})

plt.scatter(x_data,y_data,label=‘Original data‘)
plt.plot(x_data,x_data*sess.run(w)+sess.run(b),        label=‘Fitted line‘,color=‘r‘,linewidth=3)
plt.legend(loc=2)#通过参数loc指定图例位置

print("w: ", sess.run(w)) #w的值应该在3.1234附近
print("b: ",sess.run(b)) #b的值应该在2.98附近

原文地址:https://www.cnblogs.com/lsm-boke/p/9932489.html

时间: 11-08

Tensorflow之单变量线性回归问题的解决方法的相关文章

Ng第二课:单变量线性回归(Linear Regression with One Variable)

二.单变量线性回归(Linear Regression with One Variable) 2.1  模型表示 2.2  代价函数 2.3  代价函数的直观理解 2.4  梯度下降 2.5  梯度下降的直观理解 2.6  梯度下降的线性回归 2.7  接下来的内容 2.1  模型表示 之前的房屋交易问题为例,假使我们回归问题的训练集(Training Set)如下表所示: 我们将要用来描述这个回归问题的标记如下: m                代表训练集中实例的数量 x          

机器学习之单变量线性回归(Linear Regression with One Variable)

1. 模型表达(Model Representation) 我们的第一个学习算法是线性回归算法,让我们通过一个例子来开始.这个例子用来预测住房价格,我们使用一个数据集,该数据集包含俄勒冈州波特兰市的住房价格.在这里,我要根据不同房屋尺寸所售出的价格,画出我的数据集: 我们来看这个数据集,如果你有一个朋友正想出售自己的房子,如果你朋友的房子是1250平方尺大小,你要告诉他们这房子能卖多少钱. 那么,你可以做的一件事就是构建一个模型,也许是条直线.从这个数据模型上来看,也许你可以告诉你的朋友,他大概

机器学习门户网站——单变量线性回归

线性回归的概念.在高中的数学书出现了. 给你一些样本点,怎样找出一条直线,使得最逼近这些样本点. 给出一个样例:如果 x 是房子面积,y是房子价格.确定一条直线须要theta0和theta1. 给出x,我们就能够计算出房子的价格 h(x) = theta0+theta1*x 关键是怎样计算出theta0和theta1,也就是怎样找出这么一条直线呢? 在这里,引入一个概念,叫做cost function.m表示样本个数,也就是训练样本数目 这是一个square error.学过统计的应该常常见到

PHP不用第三变量交换2个变量的值的解决方法

以前做过一道php面试题是这样的:不使用第三个变量实现交换两个变量的值.一般都是借助第三个中间变量来实现原来两个变量的值交换,但是这道题却要求不能使用中间变量,这对于初学者来说也算是一个难题了.网上找到的几种方法总结如下: 复制代码 代码如下: //字符串版本 结合使用substr,strlen两个方法实现 $a="a";$b="b";echo '交换前 $a:'.$a.',$b:'.$b.'<br />';$a.=$b;$b=substr($a,0,(

ADS1.2和MDK兼容解决方法

报错如下: 原因: ADS1.2与MDK不兼容 最近安装了Keil 4.73的最新版本,却莫名其妙的出现了与ADS 1.2软件不兼容的情况,弄了半天才弄好,为了大家少走点弯路, 把网上论坛的解放方案分享一下(呵呵,原封不动抄周立功论坛的,内容如下:) /************************************************************************************************/ 如果以前玩过ARM7,使用过ADS软件,那么安装新

vc的环境变量配置和缺少mspdb60.dll的解决方法

vc的编译器是cl.exe,我们如果在vc中编译就不用配置环境,但是如果要在任何位置用命令提示符打开编译器cl.exe来编译程序,那么就要配置环境了. 下面我就讲讲vc的环境变量配置和缺少mspdb60.dll的解决方法. 1.环境变量配置:(配置的时候注意中英文的标点符号) 打开vc安装目录里面的这个路径:C:\Program Files (x86)\Microsoft Visual Studio\VC98,将里面的bin,include和lib这三个文件夹的路径配置到系统环境变量中的path

关于单双引号与数组冲突问题,解决方法

最近在写站群程序,想把配置都搞成文件存放起来.在开发过程中出现了单双引号与数组冲突的问题. 错误提示: Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING 给大家举个栗子: <?php $a['aaa'] = 'bbb'; echo "'$a['aaa']'"; ?> 解决方法:把中括号中的2个单引号

php 表单提交错误后返回数据消失问题的解决方法

本文章向码农们介绍php 表单提交错误后返回数据消失问题的解决方法,感兴趣的码农可以参考一下. 表单提交错误后返回数据消失怎么办呐,今天就来分析解决一下这个问题. 状况概述: 做填写表单信息提交的时候会碰到一个问题就是当用户填写并提交表单后,程序判断不符合要求并返回,返回之后之前填写的表单信息会被清空了的情况.如果填写的信息量少还无所谓,如果填写的信息量比较多,这会直接打击到填写信息的人的良好心情.因此解决表单提交错误返回后填写的内容消失的问题是一个提高用户体验度的迫在眉睫的问题. 对于这种问题

MATLAB 单变量函数一阶及N阶求导

1 对一维函数的求导及求特定函数处的变量值 %%最简单的一阶单变量函数进行求导 function usemyfunArray() %主函数必须位于最上方 clc clear syms x %syms x代表着声明符号变量x,只有声明了符号变量才可以进行符号运算,包括求导. %f(x)=sin(x)+x^2; %我们输入的要求导的函数 y = diff(sin(x)+x^2); %代表着对单变量函数f(x)求一阶导数 disp('f(x)=sin(x)+x^2的导数是'); pretty(y);

eclipse启动时jdk环境变量的问题及解决办法

以前傻乎乎的,每次安装什么软件都是下载个windows安装文件,然后双击完exe文件就是一个劲儿的点下一步.知道完成,就心满意足的去使用了,后来发现机子卡了,垃圾多了,有些软件明明自己貌似没点安装竟然也有.当时觉得好神奇,现在才发现,那都是自己的问题.好了废话不多说了,接下来说下在本机没有安装JDK的情况下eclipse启动时报的错误及解决办法. eclipse(下载链接:[eclipse](http://pan.baidu.com/s/1mgu0COw)刚刚下载之后 如果没有安装JDK和配置环