TensorFlow创建回归神经网络及Optimizer优化器

news/2024/9/18 9:08:56/ 标签: tensorflow, 回归, 神经网络, python

一.TensorFlow创建神经层

如图所示,通过该神经网络识别动物猫或狗,共包括输入层(Input Layer)、隐藏层3层(Hidden Layer)和输出层(Output Layer)。其中每个隐藏层神经元都有一个激励函数,被激励的神经元传递的信息最有价值,它也决定最后的输出结果,经过海量数据训练后,最终神经网络将可以用于识别猫或狗。

在这里插入图片描述

本文将通过TensorFlow不断训练学习,拟合一条曲线来预测散点的分布规律。首先,我们需要添加神经层,将层(Layer)定义成函数,用来添加神经层。神经层是相互连接的,从第一层输入层传入到隐藏层,最后传输至输出层。函数原型如下:

  • add_layer(inputs, in_size, out_size, activation_function=None)
    参数包括输入值,输入节点数,输出节点数和激励函数(默认为None)

TensorFlow的结构如下,输入值input经过隐藏层layer1和layer2,然后有一个预测值predictions,cross_entropy是计算跟真实值的差距。

在这里插入图片描述

首先,我们需要制作的层是Layer1或Layer2,它们中间会有权重Weights和偏置biases,计算位于Wx_plus_b中,激励函数是relu。

在这里插入图片描述

下面开始撰写代码,如下所示:(详见注释)

python"># -*- coding: utf-8 -*-
"""
Created on Thu Dec  5 18:52:06 2019
@author: xiuzhang Eastmount CSDN
"""
import tensorflow as tf#---------------------------------定义神经层-------------------------------
# 函数:输入变量 输入大小 输出大小 激励函数默认None
def add_layer(inputs, in_size, out_size, activation_function=None):# 权重为随机变量矩阵Weights = tf.Variable(tf.random_normal([in_size, out_size]))    #行*列# 定义偏置 初始值增加0.1 每次训练中有变化biases = tf.Variable(tf.zeros([1, out_size]) + 0.1)             #1行多列# 定义计算矩阵乘法 预测值Wx_plus_b = tf.matmul(inputs, Weights) + biases# 激活操作if activation_function is None:outputs = Wx_plus_belse:outputs = activation_function(Wx_plus_b)return outputs

二.回归神经网络实现

接下来开始实现了第一个神经网络代码,步骤如下:

1.制作虚拟数据

通过numpy.linspace生成300个随机点进行训练,形成y=x^2-0.5的虚拟数据。代码如下:

python">import tensorflow as tf
import numpy as np
#---------------------------------定义神经层---------------------------------
# 函数:输入变量 输入大小 输出大小 激励函数默认None
def add_layer(inputs, in_size, out_size, activation_function=None):# 权重为随机变量矩阵Weights = tf.Variable(tf.random_normal([in_size, out_size]))    #行*列# 定义偏置 初始值增加0.1 每次训练中有变化biases = tf.Variable(tf.zeros([1, out_size]) + 0.1)             #1行多列# 定义计算矩阵乘法 预测值Wx_plus_b = tf.matmul(inputs, Weights) + biases# 激活操作if activation_function is None: outputs = Wx_plus_belse:outputs = activation_function(Wx_plus_b)return outputs#---------------------------------构造数据---------------------------------
# 输入
x_data = np.linspace(-1, 1, 300)[:,np.newaxis]   #维度
# 噪声
noise = np.random.normal(0, 0.05, x_data.shape)  #平均值0 方差0.05
# 输出
y_data = np.square(x_data) -0.5 + noise# 设置传入的值xs和ys
xs = tf.placeholder(tf.float32, [None, 1]) #x_data传入给xs
ys = tf.placeholder(tf.float32,[None, 1]) #y_data传入给ys#---------------------------------可视化分析---------------------------------
import matplotlib.pyplot as plt# 定义图片框
fig = plt.figure()
ax = fig.add_subplot(1,1,1)
# 散点图
ax.scatter(x_data, y_data)
plt.show()

这里通过matplotlib简单绘制散点图,输出结果如下图所示,基本满足:y_data = np.square(x_data) -0.5 + noise。

在这里插入图片描述


2.添加神经网络

定义了隐藏层L1层和输出层prediction。

  • L1 = add_layer(xs, 1, 10, activation_function=tf.nn.relu)
    输入为xs,1维的data,神经元10个,relu非线性激励函数
  • prediction = add_layer(L1, 10, 1, activation_function=None)
    输入为L1输出值, in_size为L1的神经元10,假设L2输出为最终output

完整代码如下图所示:

python"># -*- coding: utf-8 -*-
"""
Created on Thu Dec  5 18:52:06 2019
@author: xiuzhang Eastmount CSDN
"""
import tensorflow as tf
import numpy as np#---------------------------------定义神经层---------------------------------
# 函数:输入变量 输入大小 输出大小 激励函数默认None
def add_layer(inputs, in_size, out_size, activation_function=None):# 权重为随机变量矩阵Weights = tf.Variable(tf.random_normal([in_size, out_size]))    #行*列# 定义偏置 初始值增加0.1 每次训练中有变化biases = tf.Variable(tf.zeros([1, out_size]) + 0.1)             #1行多列# 定义计算矩阵乘法 预测值Wx_plus_b = tf.matmul(inputs, Weights) + biases# 激活操作if activation_function is None: outputs = Wx_plus_belse:outputs = activation_function(Wx_plus_b)return outputs#---------------------------------构造数据---------------------------------
# 输入
x_data = np.linspace(-1, 1, 300)[:,np.newaxis]   #维度
# 噪声
noise = np.random.normal(0, 0.05, x_data.shape)  #平均值0 方差0.05
# 输出
y_data =np.square(x_data) -0.5 + noise# 设置传入的值xs和ys
xs = tf.placeholder(tf.float32, [None, 1]) #x_data传入给xs
ys = tf.placeholder(tf.float32,[None, 1]) #y_data传入给ys#---------------------------------可视化分析---------------------------------
import matplotlib.pyplot as plt# 定义图片框
fig = plt.figure()
ax = fig.add_subplot(1,1,1)
# 散点图
ax.scatter(x_data, y_data)
# 连续显示
plt.ion()
plt.show()#---------------------------------定义神经网络---------------------------------
# 一个输入层:x_data只有一个属性故只有一个神经元
# 一个输出层:y_data只有一个属性故只有一个神经元
# 一个隐藏层:10个神经元# 隐藏层
L1 = add_layer(xs, 1, 10, activation_function=tf.nn.relu)# 输出层
prediction = add_layer(L1, 10, 1, activation_function=None)

3.计算误差与神经网络学习

定义loss变量计算误差,即预测值与真实值的差别;再定义梯度下降变量(GradientDescentOptimizer),通过梯度下降让预测值更接近真实值。最后在Session中初始化及计算误差,每隔50步输出一次运算结果。

python"># -*- coding: utf-8 -*-
"""
Created on Thu Dec  5 18:52:06 2019
@author: xiuzhang Eastmount CSDN
"""
import tensorflow as tf
import numpy as np#---------------------------------定义神经层---------------------------------
# 函数:输入变量 输入大小 输出大小 激励函数默认None
def add_layer(inputs, in_size, out_size, activation_function=None):# 权重为随机变量矩阵Weights = tf.Variable(tf.random_normal([in_size, out_size]))    #行*列# 定义偏置 初始值增加0.1 每次训练中有变化biases = tf.Variable(tf.zeros([1, out_size]) + 0.1)             #1行多列# 定义计算矩阵乘法 预测值Wx_plus_b = tf.matmul(inputs, Weights) + biases# 激活操作if activation_function is None: outputs = Wx_plus_belse:outputs = activation_function(Wx_plus_b)return outputs#---------------------------------构造数据---------------------------------
# 输入
x_data = np.linspace(-1, 1, 300)[:,np.newaxis]   #维度
# 噪声
noise = np.random.normal(0, 0.05, x_data.shape)  #平均值0 方差0.05
# 输出
y_data =np.square(x_data) -0.5 + noise# 设置传入的值xs和ys
xs = tf.placeholder(tf.float32, [None, 1]) #x_data传入给xs
ys = tf.placeholder(tf.float32,[None, 1]) #y_data传入给ys#---------------------------------可视化分析---------------------------------
import matplotlib.pyplot as plt# 定义图片框
fig = plt.figure()
ax = fig.add_subplot(1,1,1)
# 散点图
ax.scatter(x_data, y_data)
# 连续显示
plt.ion()
plt.show()#---------------------------------定义神经网络---------------------------------
# 一个输入层:x_data只有一个属性故只有一个神经元
# 一个输出层:y_data只有一个属性故只有一个神经元
# 一个隐藏层:10个神经元# 隐藏层
L1 = add_layer(xs, 1, 10, activation_function=tf.nn.relu)# 输出层
prediction = add_layer(L1, 10, 1, activation_function=None)#------------------------------定义loss和初始化-------------------------------
# 预测值与真实值误差 平均值->求和->平方(真实值-预测值)
loss = tf.reduce_mean(tf.reduce_sum(tf.square(ys - prediction), reduction_indices=[1]))# 训练学习 学习效率通常小于1 这里设置为0.1可以进行对比
train_step = tf.train.GradientDescentOptimizer(0.1).minimize(loss) #减小误差# 初始化
init = tf.initialize_all_variables()# 运行
sess = tf.Session()
sess.run(init)#---------------------------------神经网络学习---------------------------------# 学习1000次
n = 1
for i in range(1000):# 训练sess.run(train_step, feed_dict={xs:x_data, ys:y_data}) #假设用全部数据x_data进行运算# 输出结果 只要通过place_holder运行就要传入参数if i % 50==0:print(sess.run(loss, feed_dict={xs:x_data, ys:y_data}))

输出结果如下图所示,每隔50步输出结果,第一次的误差是0.45145842,第二次的误差是0.012015346, 其误差在不断减少,说明神经网络在提升预测的准确性或学到东西了。

python">0.45145842
0.012015346
0.008982641
0.008721641
0.0085632615
0.008296631
0.0078961495
0.0074299597
0.0069189137
0.0063963127
0.0058622854
0.00548969
0.0051686876
0.0048802416
0.0046461136
0.0044451333
0.0042808857
0.004134449
0.0040101893
0.0039141406

写道这里,整个神经网络的定义和运行过程讲述完毕,包括定义神经层、误差设置、初始化及运行等,接下来开始可视化分析。


三.回归神经网络可视化分析

为了更直观了解神经网络是如何优化结果的,我们通过matplotlib进行可视化分析。从最早不合理的图形到后面基本拟合,loss误差在不断减小,说明神经网络的真实值和预测值在不断更新接近,神经网络正常运行。

第一次运行结果:
在这里插入图片描述

第四次运行结果:
在这里插入图片描述

第二十次运行结果:
在这里插入图片描述

完整代码及注释如下所示:

python"># -*- coding: utf-8 -*-
"""
Created on Thu Dec  5 18:52:06 2019
@author: xiuzhang Eastmount CSDN
"""
import tensorflow as tf
import numpy as np#---------------------------------定义神经层---------------------------------
# 函数:输入变量 输入大小 输出大小 激励函数默认None
def add_layer(inputs, in_size, out_size, activation_function=None):# 权重为随机变量矩阵Weights = tf.Variable(tf.random_normal([in_size, out_size]))    #行*列# 定义偏置 初始值增加0.1 每次训练中有变化biases = tf.Variable(tf.zeros([1, out_size]) + 0.1)             #1行多列# 定义计算矩阵乘法 预测值Wx_plus_b = tf.matmul(inputs, Weights) + biases# 激活操作if activation_function is None: outputs = Wx_plus_belse:outputs = activation_function(Wx_plus_b)return outputs#---------------------------------构造数据---------------------------------
# 输入
x_data = np.linspace(-1, 1, 300)[:,np.newaxis]   #维度
# 噪声
noise = np.random.normal(0, 0.05, x_data.shape)  #平均值0 方差0.05
# 输出
y_data =np.square(x_data) -0.5 + noise# 设置传入的值xs和ys
xs = tf.placeholder(tf.float32, [None, 1]) #x_data传入给xs
ys = tf.placeholder(tf.float32,[None, 1]) #y_data传入给ys#---------------------------------可视化分析---------------------------------
import matplotlib.pyplot as plt# 定义图片框
fig = plt.figure()
ax = fig.add_subplot(1,1,1)
# 散点图
ax.scatter(x_data, y_data)
# 连续显示
plt.ion()
plt.show()#---------------------------------定义神经网络---------------------------------
# 隐藏层
L1 = add_layer(xs, 1, 10, activation_function=tf.nn.relu)# 输出层
prediction = add_layer(L1, 10, 1, activation_function=None)#------------------------------定义loss和初始化-------------------------------# 预测值与真实值误差 平均值->求和->平方(真实值-预测值)
loss = tf.reduce_mean(tf.reduce_sum(tf.square(ys - prediction), reduction_indices=[1]))# 训练学习 学习效率通常小于1 这里设置为0.1可以进行对比
train_step = tf.train.GradientDescentOptimizer(0.1).minimize(loss) #减小误差# 初始化
init = tf.initialize_all_variables()# 运行
sess = tf.Session()
sess.run(init)#---------------------------------神经网络学习---------------------------------# 学习1000次
n = 1
for i in range(1000):# 训练sess.run(train_step, feed_dict={xs:x_data, ys:y_data}) #假设用全部数据x_data进行运算# 输出结果 只要通过place_holder运行就要传入参数if i % 50==0:#print(sess.run(loss, feed_dict={xs:x_data, ys:y_data}))try:# 忽略第一次错误 后续移除lines的第一个线段ax.lines.remove(lines[0])except Exception:pass# 预测prediction_value = sess.run(prediction, feed_dict={xs:x_data})# 设置线宽度为5 红色lines = ax.plot(x_data, prediction_value, 'r-', lw=5) # 暂停plt.pause(0.1)# 保存图片name = "test" + str(n) + ".png"plt.savefig(name)n =  n + 1

注意:在Spyder软件运行代码,一般显示figure的是在IPython console中,如下图所示,图比较小且不能进行操作,同时在IPython console中不能进行动态的figure显示。这时候需要设置单独弹出的窗口才能解决。

在这里插入图片描述

在Spyder软件设置单独弹出的窗口的步骤为:Tools–>Preferences–>IPython console–>Graphics–>Graphics backend–> Backend–>设置成Automatic,如下图所示。如果是设置成Inline则figure是在IPython console中显示。最后需要再对Spyder软件进行重新启动,没有重启则不能实现设置效果。这样就可以显示出单独的窗口,并可以实现动态的figure显示,如图所示的曲线动态拟合效果。

在这里插入图片描述


四.Optimizer优化器

class tf.train.Optimizer是优化器(optimizers)类的基类。这个类定义了在训练模型的时候添加一个操作的API。你基本上不会直接使用这个类,但是你会用到他的子类比如GradientDescentOptimizer、AdagradOptimizer、MomentumOptimizer等等。

优化器有很多不同的种类,最基本的一种是GradientsDescentOptimizer,它也是机器学习中最重要或最基础的线性优化。官方给出的常见优化器如下图所示:

在这里插入图片描述

官方网址:

https://tensorflow.google.cn/versions/r1.15/api_docs/python/tf/train/Optimizer

它介绍七种常见的优化器包括:

  • class tf.train.GradientDescentOptimizer
  • class tf.train.AdagradOptimizer
  • class tf.train.AdadeltaOptimizer
  • class tf.train.MomentumOptimizer
  • class tf.train.AdamOptimizer
  • class tf.train.FtrlOptimizer
  • class tf.train.RMSPropOptimizer

下面结合“莫烦”老师的课程,给读者们分享优化器的用法。

  • GradientDescentOptimizer(梯度下降)取决于传进数据的size,比如只传进去全部数据的十分之一,GradientDescentOptimizer就变成了STD,它只考虑一部分的数据,一部分一部分的学习,其优势是能更快地学习到去往全局最小量(Global minimum)的路径。
  • MomentumOptimizer 是基于学习效率的改变,它不仅仅考虑这一步的学习效率,还加载了上一步的学习效率趋势,然后上一步加这一步的learning_rate,它会比GradientDescentOptimizer更快到达全局最小量。
  • RMSPropOptimizer Google用它来优化阿尔法狗的学习效率。

下图通过可视化对各种优化器进行了对比分析,机器学习从目标学习到最优的过程,有不同的学习路径,由于Momentum考虑了上一步的学习(learning_rate),走的路径会很长;GradientDescent的学习时间会非常慢。如果您是初学者,建议使用GradientDescentOptimizer即可,如果您有一定的基础,可以考虑下MomentumOptimizer、AdamOptimizer两个常用的优化器,高阶的话,可以尝试学习RMSPropOptimizer优化器。总之,您最好结合具体的研究问题,选择适当的优化器。

在这里插入图片描述


http://www.ppmy.cn/news/1519557.html

相关文章

开学季儿童护眼台灯怎么选择?盘点央视公布十大护眼灯!

随着年级的升高和学习内容的增加,学生的休闲娱乐时间逐渐减少,相反,他们在书桌前度过的时间却越来越多。近年来,由于电子产品的广泛使用,我国青少年的用眼负担显著增加。据权威机构预测,到2050年&#xff0…

windows下安装docker操作步骤

因为最近dockerb被封,下载资源太不方便了,所以还是自己本地安装上docker吧 下载的地址一定不要找错,是这里 https://docs.docker.com/desktop/install/windows-install/ 电脑--“控制面板”--“程序与功能”--开启windows功能 “Hyper-V”…

实战docker第一天——windows安装docker,测试,并解决被墙办法

Docker 是一个开源的容器化平台,它允许开发者将应用程序及其所有依赖项打包在一个名为“容器”的单独环境中,从而确保应用程序在任何环境下都能一致地运行。以下是 Docker 的一些核心概念及其意义: 容器化:Docker 通过将应用程序及…

vrrp协议,主备路由器的选举

当VRRP备份组中的所有备份路由器(BACKUP)具有相同的优先级时,选举新的主路由器(MASTER)的过程将基于以下规则: IP地址优先:如果备份路由器的优先级相同,那么具有最高IP地址的路由器…

鱼哥好书分享活动第30期:一本书看完教你学习如何做B端竞品分析?《有效竞品分享》

鱼哥好书分享活动第30期:一本书看完教你学习如何做B端竞品分析?《有效竞品分享》 01 明确目标:案例分享:案例背景: 02 选择竞品:2.1 竞品的分类2.2 如何找到B端的竞品?1.找售前/销售沟通。2.各个…

C#护照查验接口集成示例、护照文字识别、外国人身份认证

护照查验是对护照有效性、真实性和符合相关出入境要求的确认过程。护照作为跨国旅行的重要身份证明文件,其查验是国际旅行中的一个必要程序。护照查验接口,支持查验出入境管理局签发护照的真伪,接口集成,简单高效便捷。 C#护照查验…

闲置物品|基于SprinBoot+vue的校园闲置物品交易平台(源码+数据库+文档)

校园闲置物品交易平台 目录 基于SprinBootvue的校园闲置物品交易平台 一、前言 二、系统设计 三、系统功能设计 5.1系统功能实现 5.2管理员模块实现 5.3用户模块实现 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xf…

Vue59 github案例 vue-resource版本

代码 List.vue <template><div class"row"><!-- 展示用户列表 --><div v-show"info.users.length" class"card" v-for"user in info.users" :key"user.login"><a :href"user.html_url&qu…

uniapp 生成H5 返回上一页 事件不执行

uniapp 生成H5 返回上一页事件不执行 背景&#xff1a;想根据返回的页面判断是否再返回一页 解决办法&#xff1a;uniapp&#xff0c;H5是先执行方法再返回&#xff0c;所以给事件增加延迟调用&#xff0c;如下代码 // 监听返回 onBackPress(e) {let pages getCurrentPages(…

数据结构(6.4_3)最短路径问题_Dijkstra算法

BFS的局限性 Dijkstra算法 1、 2、 3、 4、 如何使用数组信息 Dijkstra算法的时间复杂度 对比&#xff1a;Prim算法的实现思想 用于负权值带权图

docker实战基础三(Docker基础命令)

Docker 实战案例:构建镜像、查看容器运行信息、查看镜像构建信息 在这个实战案例中,我们将详细介绍如何构建Docker镜像、查看容器运行信息以及查看镜像构建信息。这些知识点非常实用,可以帮助你在实际工作中更好地利用Docker进行开发和运维。 一、构建Docker镜像 1. 创建…

【C++】C++STL 揭秘:Strng背后的底层逻辑

C语法相关知识点可以通过点击以下链接进行学习一起加油&#xff01;命名空间缺省参数与函数重载C相关特性类和对象-上篇 在上篇介绍string类的使用与理解&#xff0c;本篇将为大家来带关于string的底层实现逻辑&#xff0c;当然这不是一定库里面的实现逻辑。我们设计一个string…

Android13 动态控制状态栏和导航栏

前言 在Android系统中,状态栏(StatusBar)、导航栏(NavigationBar)以及下拉菜单(通常称为Notification Shade或Quick Settings Panel)构成了用户界面不可或缺的三个元素,它们共同为用户提供了丰富的信息显示与便捷的交互体验。具体而言,状态栏实时展示着时间、电池电量…

DMDSC集群安装

1. 环境描述 机器情况&#xff1a; 存储情况&#xff1a; 2. 部署前准备 2.1. 目录规划和创建 创建和规划目录在2个节点都需要执行。 DSC环境搭建的目录&#xff1a;/dmdba/dmdbms DM执行码和工具存放于目录&#xff1a;/dmdba/dmdbms/bin 配置文件存放于目录&#xff1a…

算法基础-区间合并

1、按照区间的左端点排序 2、 左端点小于等于ed&#xff0c;只需要更新ed和右端点的最大值 左端点大于ed&#xff0c;存入res中&#xff0c;并更新st和ed&#xff0c;最后一组数据手动插入res public class Main {public static void main(String[] args) {Scanner in new S…

信息安全--网络安全体系与安全模型(一)

网络安全体系概述 ■ 网络安全体系是网络安全保证系统的最高层概念抽象&#xff0c;是由各种网络安全单元按照一定的规则组成&#xff0c; 共同实现网络安全的目标。网络安全体系包括法律法规政策文件、安全策略、组织管理、技术措施、 标准规范、安全建设与运营、人员队伍、教…

【Zookeeper】Windows下安装Zookeeper(全面)

目录 1.下载 2.安装 3.环境变量配置 4.启动 1.下载 下载链接&#xff1a; Index of /dist/zookeeper (apache.org)https://archive.apache.org/dist/zookeeper/ 选择合适的版本&#xff0c;下载后缀名为tar.gz的文件下载&#xff1a; 2.安装 下载后将文件夹解压两次&am…

全国大学生数据建模比赛——深度学习

全国大学生数学建模比赛中&#xff0c;深度学习可以成为解决复杂问题的有力手段。 一、深度学习的优势在比赛中的体现 强大的模式识别能力&#xff1a;深度学习模型&#xff0c;如卷积神经网络&#xff08;CNN&#xff09;和循环神经网络&#xff08;RNN&#xff09;&#xff0…

MySQL知识点复习 - 事务篇

MySQL知识点复习 - 事务篇 由于在线上真没用过MySQL&#xff0c;一般用的都是PostgreSQL、Oracle和Sql Server&#xff0c;完美对八股文的神MySql没有一丝线上经验&#xff0c;故来小卷一手。 事务的特性是什么&#xff1f; 原子性&#xff1a;执行的任务要么是一次完成要么就…

VSCode手动创建SpringBoot项目的方法,及详细步骤

不废话&#xff0c;直接来吧&#xff01;这里以Windows系统、Maven项目构建和管理工具为例。 VSCode手动创建SpringBoot项目之前&#xff0c;首先需要先下载Maven。 Maven安装及环境变量配置 Maven包下载地址&#xff1a; https://maven.apache.org/download.cgi 可以下载…