深度学习在单线性回归方程中的应用--TensorFlow实战详解

深度学习在单线性回归方程中的应用–TensorFlow实战详解

文章目录

  • 深度学习在单线性回归方程中的应用--TensorFlow实战详解
    • 1、人工智能<-->机器学习<-->深度学习
    • 2、线性回归方程
    • 3、TensorFlow实战解决单线性回归问题
      • 人工数据集生成
      • 构建模型
      • 训练模型
      • 定义损失函数
      • 定义优化器
      • 创建会话
      • 迭代训练
      • 训练结果
      • 打印参数和预测值
    • 4、完整代码demo

提到人工智能,绕不开的话题就是机器学习了,因为机器学习是人工智能很重要的一个分支。而今天要讨论的深度学习又是机器学习的一个很重要的分支。

目前的主流深度学习框架有

  • TensorFlow
  • Keras
  • Theano

1、人工智能<–>机器学习<–>深度学习

其实机器学习就是让机器自己学习的算法,我们需要训练出这个算法,在利用这个算法解决一些问题。机器学习和人工智能的关系就是,机器学习是技术,人工智能是概念,机器学习技术用来解决人工智能出现的问题。

显而易见的说,机器学习就是训练如下的一个模型,用这个模型解决问题,那么如何训练呢?那就是通过历史数据来训练。

img

深度学习是机器学习的一个子集,深度学习是利用深度的神经网络,将模型处理得更为复杂,从而使模型对数据的理解更加深入。

img

2、线性回归方程

首先要知道线性回归的概念,所谓回归是指:回归事物的本质和真相。线性是指通过一个已知条件x得到预测值y。我们中学学过的y=kx放在坐标系里讨论,就是一条直线,我们称其为:线性的。

所以线性回归方程我们可以抽象成如下:

img

它的图象可以表示为:

img

线性回归有一个特点就是,我们事先知道一个方程,然后代入x因变量,就可以得到y的值,只要我们知道这个方程,那么我们就掌握了预测未来的可能。在深度学习中,我们将x点成为 特征,将得到的y成为标签,而一堆特征我们称为 样本

那么我们对一个模型的训练过程就如下图:

img

机器学习要做的事情是:先给你一些点,也就是数据集,我们通过这个数据集训练出一个方程,也就是一个模型,然后再用这个模型去预测未来。

3、TensorFlow实战解决单线性回归问题

首先我们要知道利用深度学习算法训练一个模型的核心步骤:

  • 准备数据集
  • 构建模型
  • 训练模型
  • 进行预测

我们这里选用了TensorFlow框架进行训练。

单变量线性回归方程可以表示如下:

img

人工数据集生成

现在的已知条件是,我们有一堆点在这里,然后我们希望通过这些点找到上面的回归方程,这个回归方程就是我们说的模型,这个找方程的过程叫做:模型训练。方程找到了,也就是计算出了w和b了,那么我们就可以通过这个模型预测未知的y值了。

img

这些点我们可以通过随机生成人工数据集,为了让这些点均匀分布,不会分布在一条线上,我们还要加上噪音振幅。

# 图象实现
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
import tensorflow.compat.v1 as tf
#关闭Eager Execution
tf.compat.v1.disable_eager_execution()
#设置随机数种子
np.random.seed(5)

然后生成100个点,每个点的取值在-1,1之间

x_data=np.linspace(-1,1,100)
# y=2x+1+噪声
y_data=2*x_data+1.0+np.random.randn(*x_data.shape)*0.4

利用matplotlib画出结果

# 画出随机数生成的散点图
plt.scatter(x_data,y_data)
# 画出我们的目标,也就是希望得到的函数y=2*x+1
plt.plot(x_data,2*x_data+1.0,color='red',linewidth=3)

img

我们画出这个图想要说明的是,当前选用的数据集点生成模型是可行的,因为点和我们期待生成的那个函数是可以拟合的,大致相似的。

构建模型

模型结构如下:

x=tf.placeholder("float",name="x")
y=tf.placeholder("float",name="y")
# 定义模型函数
def model(x,w,b):return tf.multiply(x,w)+bw=tf.Variable(1.0,name="w0")
b=tf.Variable(0.0,name="b0")
pred=model(x,w,b)#预测值的计算

训练模型

设置训练参数,在这里 learn_rate学习率和迭代次数 train_epochs超参量参数,也就是我们在训练一个模型的时候必须自己人工定义的参数,通过这种参数去让模型更好的拟合,达到我们希望的效果。我们常说调参调参就是指这个。

#迭代次数
train_epochs=10
#学习率
learn_rate=0.05

定义损失函数

损失函数的作用是指导模型收敛的方向,他表示描述预测值和真实值之间的误差,是一个数。

常见的损失函数有:

  • L1损失函数
  • l2损失函数
  • 均方误差MSE

这里我们使用MSE均方差损失函数。所谓均方差损失函数就是每个点的y值减掉预测的y值在进行平方,然后把这些点的平方都加起来,最后加和结果除以总的点个数。专业的解释是:每个样本的平均平方损失

img

# 采用均方差作为损失函数
loss_function=tf.reduce_mean(tf.square(y-pred))

定义优化器

我们定义优化器的目的是减少模型的损失,使得损失最小化。我们在优化器 Optimzer中会通过 learn_rate学习率和 loss_function损失函数 来优化收敛我们的模型。我们在讨论损失函数的时候,我们希望损失最小,那么我们就要求出损失函数的最小值。怎么求呢?我们需要用到 梯度下降算法

# 梯度下降优化器
optimizer=tf.train.GradientDescentOptimizer(learn_rate).minimize(loss_function)

如何理解梯度下降呢?首先需要知道这个东西是为了降低损失的,降低损失函数的值

梯度下降法的基本思想可以类比为一个下山的过程,如下图所示函数看似为一片山林,红色的是山林的高点,蓝色的为山林的低点,蓝色的颜色越深,地理位置越低,则图中有一个低点,一个最低点。

img

假设这样一个场景:一个人被困在山上(图中红圈的位置),需要从山上下来(找到山的最低点,也就是山谷),但此时山上的浓雾很大,导致可视度很低。因此,下山的路径就无法确定,他必须利用自己周围的信息去找到下山的路径。这个时候,他就可以利用梯度下降算法来帮助自己下山。具体来说就是,以他当前的所处的位置为基准,寻找这个位置最陡峭的地方,然后朝着山的高度下降的方向走,然后每走一段距离,都反复采用同一个方法,最后就能成功的抵达山谷。

img

假设这座山最陡峭的地方是无法通过肉眼立马观察出来的,而是需要一个复杂的工具来测量,同时,这个人此时正好拥有测量出最陡峭方向的工具。所以,此人每走一段距离,都需要一段时间来测量所在位置最陡峭的方向,这是比较耗时的。那么为了在太阳下山之前到达山底,就要尽可能的减少测量方向的次数。这是一个两难的选择,如果测量的频繁,可以保证下山的方向是绝对正确的,但又非常耗时,如果测量的过少,又有偏离轨道的风险。所以需要找到一个合适的测量方向的频率(多久测量一次),来确保下山的方向不错误,同时又不至于耗时太多,在算法中我们成为步长

在这里我们将步长称为 学习率,也就是上面代码中的 learn_rate。学习率不能过大过小,需要我们根据经验设置,过大过小都会导致模型拟合过度。

我们说一个点什么时候梯度最小?也就是说什么时候损失函数最小?

如下图我们对点进行求导,它的导数从数学的角度来说表示斜率,也就是斜线的陡峭程度,这个斜率的值其实就是我们说的梯度。斜线的方向就是我们说的梯度方向。

img

如下图,当点的斜率为0的时候,也就是梯度为0了,这个时候我们说这个模型的损失最小,模型最为拟合。

img

其实我们上面定义的优化器 GradientDescentOptimizer(learn_rate).minimize(loss_function)已经帮我们干了上面所有的事情,它直接通过我们设置好的步长学习率和损失函数,将我们的模型损失降到了最低,也就是上面这张图所需要的效果。

创建会话

sess=tf.Session()
# 所有变量初始化
init=tf.global_variables_initializer()
sess.run(init)

迭代训练

在模型训练阶段,设置多轮迭代,每次通过将样本逐个输入模型,进行梯度下降优化操作,每轮迭代以后,绘制出迭代曲线

# epoch就是训练轮数,这里为10
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)

训练结果

img

从图中可以得到,这个模型在训练3次以后就接近拟合的状态了。

打印参数和预测值

print("w:",sess.run(w))
print("b:",sess.run(b))
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)

img

4、完整代码demo

环境:

  • Anaconda
  • Jupyter
  • Python3.5.2
  • TensorFlow2.0
%matplotlib inlineimport matplotlib.pyplot as plt
import numpy as np
import tensorflow.compat.v1 as tf
tf.compat.v1.disable_eager_execution()np.random.seed(5)x_data=np.linspace(-1,1,100)
y_data=2*x_data+1.0+np.random.randn(*x_data.shape)*0.4
plt.scatter(x_data,y_data)
plt.plot(x_data,2*x_data+1.0,color='red',linewidth=3)x=tf.placeholder("float",name="x")
y=tf.placeholder("float",name="y")
def model(x,w,b):return tf.multiply(x,w)+bw=tf.Variable(1.0,name="w0")
b=tf.Variable(0.0,name="b0")
pred=model(x,w,b)#设置迭代次数和学习率、损失函数
train_epochs=10
learn_rate=0.05
loss_function=tf.reduce_mean(tf.square(y-pred))optimizer=tf.train.GradientDescentOptimizer(learn_rate).minimize(loss_function)sess=tf.Session()init=tf.global_variables_initializer()sess.run(init)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))
print("b:",sess.run(b))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)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/213330.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pair的用法,详解

1.pair是什么 pair名为二元组&#xff0c;顾名思义&#xff0c;就是储存二元组的。 2.pair的初始化 pair<第一个值类型, 第二个值类型> pr 第一个值类型&#xff1a;要储存的第一个值的数据类型第二个值类型&#xff1a;要储存的第二个值的数据类型pair<int, int&g…

【数据结构】顺序表的定义和运算

目录 1.初始化 2.插入 3.删除 4.查找 5.修改 6.长度 7.遍历 8.完整代码 &#x1f308;嗨&#xff01;我是Filotimo__&#x1f308;。很高兴与大家相识&#xff0c;希望我的博客能对你有所帮助。 &#x1f4a1;本文由Filotimo__✍️原创&#xff0c;首发于CSDN&#x1f4da;。 &…

关于mysql高版本使用groupby导致的报错

在开发时&#xff0c;遇到mysql版本在5.7.X及以上版本时使用group by 语句会报以下的错误 Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column business_typ…

【flink番外篇】1、flink的23种常用算子介绍及详细示例(1)- map、flatmap和filter

Flink 系列文章 一、Flink 专栏 Flink 专栏系统介绍某一知识点&#xff0c;并辅以具体的示例进行说明。 1、Flink 部署系列 本部分介绍Flink的部署、配置相关基础内容。 2、Flink基础系列 本部分介绍Flink 的基础部分&#xff0c;比如术语、架构、编程模型、编程指南、基本的…

GPTs的创建与使用,自定义GPTs中的Actions示例用法 定义和执行特定任务的功能模块 通过API与外部系统或服务的交互

Name 等 Logo:自动生成 Name 介绍 Description 介绍 Instructions 要求或命令等 比如用中文回复&#xff0c;角色。 Knowledge 上传你的知识库&#xff0c;如果你有某一垂直行业的数据&#xff0c;基于数据来回答。比如我有某个芯片的指令集。 Capabilities 都要 Actions&…

Python OS模块常用方法整理

os模块包含了普遍的操作系统和文件目录方法 引入类库 首先需要引入类库 import os 常用方法 OS模块方法 获取操作系统类型 nt->window:Microsoft Windows NT posix->Linux/Mac OS: Portable Operating System Interface of UNIX&#xff08;可移植操作系统接口&…

Python VSCode 配置固定的脚本入口

Python VSCode 配置固定的脚本入口 打开或者新建一个启动配置 选择 .vscode目录下 launch.json文件 将 “program”: “${file}” 替换成 “program”: “mian.py”, //完成你自己的入口.py文件名即可 json启动配置文件 {// Use IntelliSense to learn about possible attrib…

C++数据结构:B树

目录 一. 常见的搜索结构 二. B树的概念 三. B树节点的插入和遍历 3.1 插入B树节点 3.2 B树遍历 四. B树和B*树 4.1 B树 4.2 B*树 五. B树索引原理 5.1 索引概述 5.2 MyISAM 5.3 InnoDB 六. 总结 一. 常见的搜索结构 表示1为在实际软件开发项目中&#xff0c;常用…

使用条件格式突出显示单元格数据-sdk

使用条件格式突出显示单元格数据 2023 年 12 月 6 日 根据数据值将视觉提示应用于特定单元格、行或列&#xff0c;从而更轻松地识别模式和趋势。 网格中的条件格式允许用户根据单元格或范围包含的数据将视觉样式应用于单元格或范围。它通过以数据驱动的方式突出显示关键值、异常…

【3】密评-物理和环境安全测评

0x01 依据 GB/T 39786 -2021《信息安全技术 信息系统密码应用基本要求》针对等保三级系统要求&#xff1a; 物理和环境层面&#xff1a; a&#xff09;宜采用密码技术进行物理访问身份鉴别,保证重要区域进入人员身份的真实性&#xff1b; b&#xff09;宜采用密码技术保证电子门…

【面试经典150 | 二叉树】从中序与后序遍历序列构造二叉树

文章目录 写在前面Tag题目来源题目解读解题思路方法一&#xff1a;递归 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法&#xff0c;两到三天更新一篇文章&#xff0c;欢迎催更…… 专栏内容以分析题目为主&#xff0c;并附带一些对于本题涉及到的数据结构等内容…

VS2009和VS2022的错误列表可复制粘贴为表格

在VS2019或VS2022中&#xff0c;可看到如下错误列表&#xff1a; 如果复制这两行错误信息&#xff1a; 然后把它粘贴到word文件&#xff0c;就可以看到以下表格&#xff1a; 严重性 代码 说明 项目 文件 行 禁止显示状态 错误(活动) E0020 未定义标识符 "dd"…

【Redis】Redis 的学习教程(十三)Redis 各场景

由于Redis 支持比较丰富的数据结构&#xff0c;因此他能实现的功能并不仅限于缓存&#xff0c;而是可以运用到各种业务场景中&#xff0c;开发出既简洁、又高效的系统 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-bo…

【WPF.NET开发】WPF中的对话框

目录 1、消息框 2、通用对话框 3、自定义对话框 实现对话框 4、打开对话框的 UI 元素 4.1 菜单项 4.2 按钮 5、返回结果 5.1 模式对话框 5.2 处理响应 5.3 非模式对话框 Windows Presentation Foundation (WPF) 为你提供了自行设计对话框的方法。 对话框是窗口&…

每日一题:LeetCode-209. 长度最小的子数组(滑动窗口)

每日一题系列&#xff08;day 11&#xff09; 前言&#xff1a; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f50e…

圆通速递查询,圆通速递单号查询,用表格导出查询好的物流信息

批量查询圆通速递单号的物流信息&#xff0c;以表格的形式导出查询好的物流信息。 所需工具&#xff1a; 一个【快递批量查询高手】软件 圆通速递单号若干 操作步骤&#xff1a; 步骤1&#xff1a;运行【快递批量查询高手】软件&#xff0c;并登录 步骤2&#xff1a;点击主界…

同源策略与跨域

作者简介&#xff1a;大家好&#xff0c;我是smart哥&#xff0c;前中兴通讯、美团架构师&#xff0c;现某互联网公司CTO 联系qq&#xff1a;184480602&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗互联网寒冬 不论个人练习还是实际开…

千锋 Vue 详细笔记整理

视频笔记是根据B站 千锋 涛哥 - SpringBootvue前后端分离项目《锋迷商城》实战课-完结版 进行整理的 笔记可上 gitee仓库 自取 千锋 Vue 笔记整理 一、vue 的简介1.1 使用 JQuery 的复杂性问题1.2 VUE 简介1.2.1 前端框架1.2.2 MVVM 二、 vue 入门使用2.1 vue 的引入2.2 入门案…

期末速成数据库极简版【存储过程】(5)

目录 【7】系统存储过程 【8】用户存储过程——带输出参数的存储过程 创建存储过程 存储过程调用 【9】用户存储过程——不带输出参数的存储过程 【7】系统存储过程 系统存储我们就不做过程讲解用户存储过程会考察一道大题&#xff0c;所以我们把重点放在用户存储过程。…

Navicat 与 华为云 GaussDB 合作再升级,赋能 GaussDB 分布式数据库

2023 年第三季度&#xff0c;Navicat 首次支持了华为云 GaussDB 主备版数据库。经过双方团队进一步的深化合作&#xff0c;Navicat 完成了 GaussDB 分布式的研发适配工作&#xff0c;赋能 GaussDB 全域数据库产品。 GaussDB 数据库分为主备版和分布式版两种模式。主备版适用于…