机器学习:BP神经网络

news2024/10/7 4:23:06

神经网络

  • 人工神经网络的结构特点
  • 人工神经网络
    • 单层神经网络
    • 双层神经网络
    • 多层神经网络
  • BP神经网络
  • 通过TensorFlow实现BP神经网络

单层感知网络是最初的神经网络,具有模型清晰、结构简单、计算量小等优点,但是它无法处理非线性问题。BP神经网络具有任意复杂的模式分类能力和优良的多维函数映射能力,解决了简单感知器不能解决的异或问题和一些其他问题。

神经网络可以包含:

BP神经网络——最简单的

深度学习——可以看作复杂的BP神经网络解决范围更广

其他神经网络

人工神经网络的结构特点

☞非线性:自然界的普遍特性

☞非局限性:一个神经网络通常由多个神经元广泛连接而成。系统的整体行为取决于单元之间的相互作用、相互连接。

☞非常定性:人工神经网络具有自适应、自组织和自学习能力。系统本身一直在演化。

☞非凸性:非凸性是指这种函数有多个极值,因此系统具有多个较平稳的平衡态,这将导致系统演化的多样性。

✦神经网络模型主要有的4种类型:前向型、反馈型、随机型、竞争型

人工神经网络

一般来说,神经网络学习算法要能正常工作,激活函数F应当是可导和光滑的,比如:线性函数、逻辑斯蒂函数

单层神经网络

包括输入、权重、输出
在这里插入图片描述
单层神经网络的主要区别在于输出向量z,输出元的数量多于1时,即认为z是向量。
g(W*a)=z

双层神经网络

单层神经网络无法解决异或问题,增加一个计算层后,不仅可以解决异或问题,而且具有非常好的非线性分类效果。
在这里插入图片描述
在神经网络的每个层次中,除了输出层外,都会含有一个偏置单元
在这里插入图片描述

多层神经网络

“深度信念网络”,即“深度学习”包含的过程

“预训练”——让神经网络中的全职找到一个接近最优解的值。
“微调”——对整个网络进行优化训练。
在这里插入图片描述

在这里插入图片描述
多层神经网络中,输出也是按照一层一层的方式来计算的。

增加更多的层次有什么优势?

1、能够更深入地表示特征,更强的表现函数的模拟能力。
2、随着网络层数的增加,每一层对于前一层次的抽象表示更深入。

BP神经网络

BP神经网络是一种非线性多层前向反馈网络。BP神经网络般分为三层,分别是输入层、隐含层和输出层,这三层中的每一层的神经元状态只影响下一层的神经元状态,若预测结果得不到期望输出,网络则进行反向传播。主要思路是:输入数据,利用反向传播算法对网络的权值和阈值不断地进行调整训练,根据预测误差调整权值和阈值,输出与期望趋近的结果,直到预测结果可以达到期望。
在这里插入图片描述
BP神经网络对输入数据的处理步骤如下:
(1)初始化网络。初始化输入层和隐含层,以及输出层神经元之间的连接权值ωij,ωjk,初始化隐含层和输出阈值a,b,并设置学习率和激活函数
(2)计算隐含层输出。ωij,a分别为输入层和隐含层间的连接权值及隐含层阈值,隐含层输出H的计算为:
在这里插入图片描述
l为隐含层激活函数
(3)计算输出层。H为隐含层的输出,BP网络的预测输出Y为:
在这里插入图片描述
(4) 计算误差。误差e的计算为:
在这里插入图片描述
Ok是实际期望的值
(5)更新权值
在这里插入图片描述
η是学习率
(6)阈值更新。根据预测误差e更新网络的阈值a,b:
在这里插入图片描述
(7)判断迭代是否可以结束,若算法迭代没有结束,则返回第(2)步,直到算法结束。

!!!第(1)步到第(3)是信号的前馈过程,第(4)步到第(7)步是神经网络反向更新参数的过程。

通过TensorFlow实现BP神经网络

# -*- coding: utf-8 -*-
"""
Created on Mon Oct 31 11:50:53 2022

@author: Yangz
"""

#import tensorflow as tf
from numpy.random import RandomState
import tensorflow.compat.v1 as tf
#tensorflow版本原因2.0往上的用这种方式
tf.compat.v1.disable_eager_execution()
'''
定义神经网络的参数、输入、输出节点

Variable()函数,在TensorFlow的世界里,变量的定义和初始化是分开的,所有关于图变量的赋值和计算
都要通过tf.Session的run来进行。想要将所有图变量进行集体初始化时应该使用
tf.global_variables_initializer。

placeholder()函数是在神经网络构建graph的时候在模型中的占位,此时并没有把要输入的数据传入模型,
它只会分配必要的内存。等建立session,在会话中,运行模型的时候通过feed_dict()函数向占位符喂入数据。
'''
#定义训练数据的大小,是每次的训练数据
batch_size = 10 
#声明w1变量,生成2*3的矩阵,均值为0,标准差为1
w1 = tf.Variable(tf.random.normal([2,3],mean=0,stddev=1,seed=1))
#声明w2变量,生成3*1的矩阵,均值为0,标准差为1
w2 = tf.Variable(tf.random.normal([3,1],mean=0,stddev=1,seed=1))
#定义输入x和输出y_
x = tf.placeholder(tf.float32,shape=(None,2),name="x-input")
y_ = tf.placeholder(tf.float32,shape=(None,1),name="y-output") #实际期望值,后面是Y

'''
定义前向传播过程
'''
#前向传播
a = tf.matmul(x, w1) #矩阵乘法
y = tf.matmul(a, w2)  #网络预测值
'''
定义损失函数
'''
#tf.clip_by_value(a,b,c)a是一个矩阵,b是最小值,c是最大值;这个方法是控制a里面的值。
#如果里面的值小于b,输出b,大于c就输出c
cross_entropy = - tf.reduce_mean(y_ * tf.log(tf.clip_by_value(y,1e-10,1.0))) #对数损失函数
'''
定义反向传播算法,修正权重w,偏置a,和学习率
'''
#AdamOptimizer是TensorFlow中实现Adam(自适应矩估计)算法的优化器。
#是一个寻找全局最优点的优化算法,引入了二次梯度校正。 0.001是权重的更新比率
#利用反向传播算法对权重和偏置项进行修正,同时也在运行中不断修正学习率
#.minimize(loss_function)的含义是根据其损失量学习自适应,损失量大则学习率大,
#进行修正的角度越大,损失量小,修正的幅度也小,学习率就小,但是不会超过自己所设定的学习率。
train_step = tf.train.AdamOptimizer(0.001).minimize(cross_entropy)

'''
生成模拟数据集,用于训练神经网络
'''
rdm = RandomState(1) #定义一个随机数种子
#数据量大小为128
dataset_size = 128
X = rdm.rand(dataset_size,2) #产生[0,1)之间的数组128*2
Y = [[int(x1 + x2 <1)] for (x1,x2) in X] #Y是与X所对应的存放布尔类型值的list,留为实际值
'''
创建一个会话来运行TensorFlow程序,其实这里只是查看了一下w1、w2,
不创建会话的情况下误差执行上面Tensorflow生成语句
'''
#可以理解为TensorFlow下定义的语句不会立即执行,只有等到开启会话session时,才会执行session.run()语句

with tf.Session() as sess:
    #初始化变量,只有在定义了变量之后才可以初始化
    #init_op = tf.initialize_all_variables() 已被弃用
    init_op = tf.global_variables_initializer()
    sess.run(init_op) #
    #输出目前(未经训练)的参数取值
    print(sess.run(w1))
    print(sess.run(w2))
    print("\n")
    '''
    最后训练模型,得到训练后的参数结果
    '''
    #设定训练轮数
    STEPS = 5000
    #训练的循环
    for i in range(STEPS):
        #每次只训练10个样本数据
        start = (i * batch_size) % dataset_size
        end = min(start + batch_size,dataset_size)
        #利用feed_dict喂入数据
        sess.run(train_step,feed_dict = {x:X[start:end],y_:Y[start:end]})
        if i % 1000 == 0:
            #每隔1000轮,计算在所有数据上的交叉熵并输出
            total_cross_entropy = sess.run(cross_entropy,feed_dict={x:X,y_:Y})
            print('After %d training step(s),cross_entropy on all data is %g' % (i,total_cross_entropy))
        #输出训练后的参数取值
    print(sess.run(w1))
    print(sess.run(w2))
    print("\n")

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

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

相关文章

性能工具之前端分析工Chrome Developer Tools性能标签

文章目录一、前言二、第一部分三、第二部分四、第三部分五、第四部分六、小结一、前言 之前本博曾经写过几篇和前端性能分析相关的文章&#xff0c;如下&#xff1a; 常见性能工具一览性能工具之常见压力工具是否能模拟前端&#xff1f;性能工具之前端分析工Chrome Developer…

【Pytorch with fastai】第 19 章 :从零开始的 fastai 学习者

&#x1f50e;大家好&#xff0c;我是Sonhhxg_柒&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f4dd;个人主页&#xff0d;Sonhhxg_柒的博客_CSDN博客 &#x1f4c3; &#x1f381;欢迎各位→点赞…

AutoDWG 文件属性编辑修改控件/Attribute Modifier-X

AutoDWG 文件属性编辑修改控件组件/AttributeX 控件组件 属性控件组件是开发者无需AutoCAD就可以直接在dwg文件中提取或修改属性值的组件。 主要特征&#xff1a; 从 dwg 文件中提取属性值。 直接在dwg文件中添加或修改属性值。 支持 R9 到 2016 版本的 DWG 和 DXF。 独立于 A…

如何学习Python技术?自学Python需要多久?

前言 Python要学习的时间取决于学习方式&#xff1a;自学至少需要学8个月;报班的话&#xff0c;可能需要4个月左右的时间。如果想具体了解Python要学多久&#xff0c;那不妨接着往下看吧! &#xff08;文末送读者福利&#xff09; 这个问题分为两种情况&#xff0c;分为自学和…

机械设计基础总复习

《机械设计基础》 一、简答题 1. 机构与机器的特征有何不同&#xff1f; 机器的特征&#xff1a;&#xff08;1&#xff09;人为机件的组合&#xff1b;&#xff08;2&#xff09;有确定的运动&#xff1b;&#xff08;3&#xff09;能够进行能量转换或代替人的劳动。 机构…

攻防世界Encode

Encode 题目描述&#xff1a;套娃&#xff1f; 题目环境&#xff1a;https://download.csdn.net/download/m0_59188912/87094879 打开timu.txt文件&#xff0c;猜测是rot13加密。 Rot13在线解码网址&#xff1a;https://www.jisuan.mobi/puzzm6z1B1HH6yXW.html 解密得到&#x…

跟艾文学编程《Python基础》(1)Python 基础入门

作者&#xff1a; 艾文&#xff0c;计算机硕士学位&#xff0c;企业内训讲师和金牌面试官&#xff0c;现就职BAT一线大厂公司资深算法专家。 邮箱&#xff1a; 1121025745qq.com 博客&#xff1a;https://wenjie.blog.csdn.net/ 内容&#xff1a;跟艾文学编程《Python基础入门》…

专题18:Django之Form,ModelForm

原始思路实现添加用户功能的缺点&#xff1a; 1&#xff09;用户提交的数据没有校验 2&#xff09;如果用户输入的数据有错误&#xff0c;没有错误提示 3&#xff09;前端页面上的每一个字段都需要我们重新写一次 4&#xff09;关联的数据需要手动取获取并循环展示在页面 1…

【Effective_Objective-C_1熟悉Objective_C】

文章目录说在前面的熟悉ObjectiveCfirst了解Objective-C的起源1.消息结构和函数调用运行期组件内存管理Objective-C的起源要点总结Second 在类的头文件尽量少饮入其他文件尽量延后引入头文件或者单独开辟一个文件向前声明在类的头文件尽量少饮入其他文件要点总结THIRD-多用字面…

梯度下降法的理解

1 梯度下降法 本文所有的数学定义概念非官方所给&#xff0c;皆来自于个人理解融合 1.1 梯度的定义 个人理解就是能够使函数值增大最快的方向 需要明确的一点&#xff0c;这里说的方向都是自变量变化的方向 1.2 梯度下降法 梯度下降法本质上是用来求解目标函数最小值的一种…

CocosCreater学习1

1.产品定位 Cocos Creator 是以内容创作为核心&#xff0c;实现了脚本化、组件化和数据驱动的游戏开发工具。具备了易于上手的内容生产工作流&#xff0c;以及功能强大的开发者工具套件&#xff0c;可用于实现游戏逻辑和高性能游戏效果。 2.工作流程 3.项目文件夹结构 初次创…

C++入门基础01:指针与引用

C入门基础&#xff1a;指针与引用 指针 #include <iostream> //系统定义头文件一般是尖括号 #include<fstream> #include<string> using namespace std;//引用与指针 //是复合数据类型&#xff0c;与基本数据类型int、double这类是不一样的 //指针存储的是…

Java集合框架详解(一)Collection接口、List接口、ArrayList类、Vector类

一、集合架构图 二、Collection接口 Collection集合的遍历 迭代器&#xff1a;Iterater 方法名称备注Iterater Iterater()返回在此collection的元素上进行迭代的迭代器boolean hasNext()如果有元素可以迭代&#xff0c;返回true&#xff0c;否则返回falseE next()返回迭代的下…

Kafka - Kafka生产者|发送消息|分区策略|提高吞吐量|数据可靠性|数据去重|数据有序

文章目录1. Kafka 生产者2. 生产者发送消息1. 生产者异步发送消息2. 生产者异步发送消息带回调函数3. 生产者同步发送消息3. 生产者发送消息的分区策略1. Kafka 分区好处2. 分区器 DefaultPartitioner 和 ProducerRecord 源码3. 指定 partition 的情况4. 没有指定 partition 但…

从零集成mybatis-plus

Mybatis-Plus特性&#xff1a; 无侵入&#xff0c;即引入它不会对现有工程产生影响。损耗小&#xff0c;启动就会自动注入基本的CRUD&#xff0c;内置通用Mapper、Service等&#xff0c;基本能满足大部分需求。支持主键自动生成&#xff0c;其中包括分布式唯一ID生成器Sequenc…

PTA题目 分段计算居民水费

为鼓励居民节约用水&#xff0c;自来水公司采取按用水量阶梯式计价的办法&#xff0c;居民应交水费y&#xff08;元&#xff09;与月用水量x&#xff08;吨&#xff09;相关&#xff1a;当x不超过15吨时&#xff0c;y4x/3&#xff1b;超过后&#xff0c;y2.5x−17.5。请编写程序…

[附源码]java毕业设计时事资讯平台

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

黑*头条_第1章_项目介绍和工程搭建

黑*头条_第1章_项目介绍和工程搭建 文章目录黑*头条_第1章_项目介绍和工程搭建学习目标1. 项目介绍1.1项目背景1.2 项目概述1.3 项目术语定义2. 项目需求2.1 APP主要功能大纲2.2 APP用例图&#xff08;主要功能&#xff09;2.3 WEMEDIA功能大纲2.4 WEMEDIA用例图&#xff08;主…

STM32嵌入式工程师自我修养

STM32嵌入式工程师自我修养一、STM32必备技能二、程序员必须熟知三、学习STM32自备资料和硬件一、STM32必备技能 1、熟悉 C 语言编程&#xff0c;熟练 STM32CUBEMX,Keil 开发环境。 2、熟悉基于STM32 MCU开发&#xff0c;掌GPIO,TIME,PWM,ADC等外设开发。 3、熟悉USART,IIC,SP…

快速熟悉C++之常用语法

函数重载&#xff08;Overload&#xff09; 规则 函数名相同 参数个数不同、参数类型不同、参数顺序不同 ◼ 注意 返回值类型与函数重载无关 调用函数时&#xff0c;实参的隐式类型转换可能会产生二义性 ◼ 本质 采用了name mangling或者叫name decoration技术 ✓…