深度学习在单线性回归方程中的应用--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.mzph.cn/news/200832.shtml

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

相关文章

发请求/传递过程中出现‘[object Object]‘的问题“

问题&#xff1a;post请求的时候data数据传过去的的时候显示data: [object Object] 问题代码&#xff1a; wx.request( { url: "", header: { "Content-Type": "application/x-www-form-urlencoded" }, method: "POST", data:…

【算法每日一练]-图论(保姆级教程篇11 tarjan模板篇)无向图的桥 #无向图的割点 #有向图的强连通分量

目录 预备知识 模板1&#xff1a;无向图的桥 模板2&#xff1a;无向图的割点 模板3&#xff1a;有向图的强连通分量 讲之前先补充一下必要概念&#xff1a; 预备知识 无向图的【连通分量】&#xff1a; 即极大联通子图&#xff0c;再加入一个节点就不再连通&#xff08;对…

Python 删除字典列表等元素问题

""" 在 Python 中&#xff0c;在迭代列表的同时修改它可能导致意外的结果&#xff0c; 因为这会破坏迭代器的状态。在你的代码中&#xff0c;当你尝试删除元素时&#xff0c; 迭代器可能会跳过下一个元素&#xff0c;导致删除的不是你预期的元素。 ""…

Kafka Schema介绍

Avro概述 简介 Apache Avro(以下简称 Avro,读音:阿夫罗)是一个数据序列化系统,是一种与编程语言无关的序列化格式,是提供一种共享数据文件的方式。Avro是Hadoop中的一个子项目,Avro是一个基于二进制数据传输高性能的中间件。Avro可以做到将数据进行序列化,适用于远程…

三星AI笔电:年底大战一触即发,行业变革在即

随着科技的不断发展&#xff0c;人工智能&#xff08;AI&#xff09;已逐渐渗透至我们日常生活的各个角落&#xff0c;而其在电脑行业的应用也正引发一场革命。 据韩国媒体Businesskorea报道&#xff0c;全球科技巨头三星电子即将于12月中发表世界首款搭载AI技术的笔电。此次发…

Leetcode1423. 可获得的最大点数

Every day a Leetcode 题目来源&#xff1a;1423. 可获得的最大点数 解法1&#xff1a;前缀和 后缀和 基于贪心的思想&#xff0c;要使得获得的点数最大&#xff0c;每次拿卡牌都应该选点数尽量高的卡牌。 但是拿卡牌有限制&#xff0c;每次行动&#xff0c;只可以从行的…

[Java][项目][战斗逻辑]基于JFrame的文字游戏

项目注解&#xff1a; Core:启动文件 AttributeBean&#xff1a;玩家属性 BackpackedBean&#xff1a;背包设计&#xff08;未完成&#xff09; BackpackedFrame&#xff1a;背包页面&#xff08;未完成&#xff09; BattleField&#xff1a;战斗逻辑&#xff08;核心&…

Android Chips(标签)

目录 一、流式布局标签发展历程 二、类型及使用 2.1 Chip.Action(默认值) 2.2 Chip.Entry 2.3 Chip.Filter 2.4 Chip.Choice 三、常用事件 3.1 OnClickListener 3.2 OnCheckedChangeListener 3.3 OnCloseIconClickListener 四、ChipGroup 4.1 ChipGroup Chip.Choi…

AGI = 大模型 + 知识图谱 + 强化学习

一、大模型&#xff08;Large Models&#xff09; 定义&#xff1a; 大模型通常指的是参数数量庞大的机器学习模型&#xff0c;特别是深度学习模型。这些模型在训练时需要大量的计算资源和数据。例如&#xff0c;GPT-3&#xff08;Generative Pre-trained Transformer 3&#…

力扣973. 最接近原点的 K 个点(java 排序法,大顶堆法)

Problem: 973. 最接近原点的 K 个点 文章目录 题目描述思路解题方法复杂度Code 题目描述 给定一个数组 points &#xff0c;其中 points[i] [xi, yi] 表示 X-Y 平面上的一个点&#xff0c;并且是一个整数 k &#xff0c;返回离原点 (0,0) 最近的 k 个点。 这里&#xff0c;平面…

获取网络ppt资源

背景&#xff1a; ​ 某度上有很多优质的PPT资源和文档资源&#xff0c;但是大多数需要付费才能获取。对于一些经济有限的用户来说&#xff0c;这无疑是个遗憾&#xff0c;因为我们更倾向于以免费的方式获取所需资源。 解决方案&#xff1a; ​ 然而&#xff0c;幸运的是&am…

python 笔记:将不同长度2D矩阵线性插值至相同长度(scipy.interpolate)

1 问题描述 我现在有三个2D矩阵&#xff0c;每一行是两个元素&#xff0c;代表经纬度&#xff1b;不同矩阵的行数不同 现在希望通过线性插补&#xff0c;使得每个2D矩阵行数相同 pth_lst[[[1,2],[1,3],[3,4]],[[3,4],[5,6],[7,8],[9,10],[11,12],[13,14],[15,16]],[[2,4],[5…

记录一次driud连接池的连接数用完问题

一、问题描述&#xff1a; 最直观的表现就是生产上项目崩了&#xff0c;无法访问。 二、分析原因&#xff1a; 通过查看生产日志&#xff0c;出现了大量的获取连接超时异常&#xff0c;具体如下&#xff1a; org.springframework.jdbc.CannotGetJdbcConnectionException:Fail…

Python 网络爬虫(四):初识网络爬虫

《Python入门核心技术》专栏总目录・点这里 文章目录 什么是爬虫爬虫的工作原理应用场景反爬虫合法和道德问题Robots 协议练习爬虫的一些网站总结 大家好&#xff0c;我是水滴~~ 在当今数字化时代&#xff0c;互联网上充斥着大量的数据和信息&#xff0c;而我们常常需要从这个…

vue运用之echart柱状图3D效果案例代码

前言 在ECharts中,创建3D柱状图需要使用GL模块,并设置type为’bar3D’ 柱状图案例可参考,我的这篇文章 Echarts之柱状图 3D柱状图的示例代码 // 引入ECharts主模块 var echarts = require(echarts); // 引入3D模块 var GL = require(echarts/util/graphic/GL

思维模型 移情效应

本系列文章 主要是 分享 思维模型&#xff0c;涉及各个领域&#xff0c;重在提升认知。情感迁移&#xff0c;爱屋及乌。 1 移情效应的应用 1.1 移情效应在市场营销中应用-多芬&#xff08;Dove&#xff09;“真美运动” 多芬&#xff08;Dove&#xff09;是一家知名的个人护理…

软件工程 复习笔记

目录 概述 软件的定义&#xff0c;特点和分类 软件的定义 软件的特点 软件的分类 软件危机的定义和表现形式 软件危机 表现形式 软件危机的产生原因及解决途径 产生软件危机的原因 软件工程 概念 软件工程的研究内容和基本原理 内容 软件工程的基本原理 软件过程…

Redis使用Lua脚本

Lua脚本 redis可以支持lua脚本&#xff0c;可以使用lua脚本来将几个命令整合为一个整体来执行&#xff0c;这样可以使得多个命令原子操作&#xff0c;且可以减少网络开销 Lua的数据类型 Lua是一个动态类型的语言&#xff0c;一个变量可以存储任何类型的值&#xff0c;类型有&am…

27、卷积 - 卷积特征的可视化和一个神奇的网站

既然上一节说了卷积的本质是一个特征提取器,那么既然卷积神经网络在图像分类、图像检测、图像分割以及其他领域有这么好的表现,卷积算法到底提取了什么特征呢? 虽然有时候我们说神经网络是个黑盒,但是研究人员也一直在探索,如何将卷积学习到的特征给分析出来。 就是想要…

我们是如何让微服务在实践中“活色生香”的?

文章目录 &#x1f50a;博主介绍&#x1f964;本文内容1. 前言2. 请求的路径分析3. 服务周期分析4. 请求格式转换5. 服务层设计6. 业务服务层设计7. 安全防护及策略8. 结论 &#x1f4e2;文章总结&#x1f4e5;博主目标 &#x1f50a;博主介绍 &#x1f31f;我是廖志伟&#xf…