基于sympy的python实现三层BP神经网络算法

#!/usr/bin/python
# -*- coding: utf-8 -*-
"""
写一个三层的BP神经网络(3,2,1),3是输入数据的维度,隐层设置节点数为2,1是因为每个观测的target都是一个标量即只有一个数;
1.随机生成两个随机矩阵作为三个层之间的连接权值,注意矩阵大小设置;设定误差阈值等参数
2.使用i=random.randint(0,len(x)-1)随机产生一个样品的输入及target
3.使用权值w1,w2,sigmoid函数、diffsigmoid函数计算隐层和输出层的输入,输出
4.利用上面的随机样品的实际输出和期望输出之差e,用e求偏导de/dwho、de/dwih
5.梯度下降法更新权值w1,w2
6.再次计算全局误差,若满足设定的误差阈值,返回当前权值;否则重算
"""
print(__doc__)
import random
from sympy import *
import numpy as np
import pandas as pd
data=pd.read_csv("wenzi.csv",header='infer')
data=np.mat(data)
x=data[:, :3]
y=data[:, 3]#激活函数
def sigmoid(x):return ( 1/(1+np.exp(-x)) )
#激活函数的导函数
def diffsigmoid(x):return (1- 1/(1+np.exp(-x)) )*( 1/(1+np.exp(-x)) )def upgrade_w1_w2(): #i是随机选取的一个样本erro=0.01 #误差n_iter=500 #迭代次数learnrate=0.1 #学习率global w1,w2,b1,b2
w1= 0.5 * np.random.rand(2,3) - 0.1
b1= 0.5 * np.random.rand(2,1) - 0.1
w2= 0.5 * np.random.rand(1,2) - 0.1
b2= 0.5 * np.random.rand(1,1) - 0.1"""
随机抽取一个样本计算两个偏导de/dwih 、de/dwoh
"""
i=random.randint(0,len(x)-1)
obs =np.array(x[i] )hidden_input_1=np.dot(w1[0],obs.T) - b1[0]
hidden_input_2=w1[1].dot(obs.T)-b1[1]hidden_output_1=sigmoid(hidden_input_1)
hidden_output_2=sigmoid(hidden_input_2)hidden_output_array=[float(hidden_output_1),float(hidden_output_2)]outlayer_input=np.dot(w2[0] ,(hidden_output_array)) - b2[0] #输出层只有一个节点
outlayer_output=sigmoid(outlayer_input)expect_output=y[i]
loss=expect_output - outlayer_output
sigma_t_k_1=-(expect_output-sigmoid(outlayer_input)) * diffsigmoid(outlayer_input)A=sigma_t_k_1 * hidden_output_array #de/dwho
print("sigma_t_k_1\n",sigma_t_k_1)
print('隐层的输出向量',hidden_output_array )
a=np.array(sum(-(sigma_t_k_1)))print("sum(-(sigma_t_k_1)* w1) * obs",a*w1[0] * obs )B1=diffsigmoid(hidden_input_1) * a* w1[0] * obsB2=diffsigmoid(hidden_input_2) * a* w1[1] * obs"""
计算全局误差
"""while True:for j in range(len(x)):obs =x[j]hidden_input_1=np.mat(w1[0]).dot(obs.T) - b1[0] #隐层第一个节点上的输入hidden_input_2=np.mat(w1[1]).dot(obs.T) - b1[1] #隐层第二个节点上的输入hidden_output_1=sigmoid(hidden_input_1) #隐层第一个节点上的输出hidden_output_2=sigmoid(hidden_input_2) #隐层第二个节点上的输出hidden_output_array=[float(hidden_output_1),float(hidden_output_2)]outlayer_input_1=w2[0].dot(hidden_output_array)-b2[0] #输出层的输入outlayer_output_1=sigmoid(outlayer_input_1) #输入层的输出expect_output=y[i] #期望输出就是每个观测的target数值totalloss= [] #建立空列表用以求和loss=expect_output - outlayer_output_1 #loss是每个观测的期望输出与实际输出的差totalloss.append(loss) #totalloss=np.array(totalloss) #把列表转化为数组才能进行点乘"""如果全局误差大于阈值就要更新权重"""if 0.5*totalloss.dot(totalloss) > erro:print("误差大于给定的阈值")new_w2_0=w2[0]-learnrate* (sigma_t_k_1 * hidden_output_array)new_w2=new_w2_0w2=new_w2new_w1_0=np.array(w1[0]-learnrate*B1)new_w1_1=np.array(w1[1]-learnrate*B2)w1=np.vstack((new_w1_0,new_w1_1))print("误差大于阈值时的全局损失; ",0.5*totalloss.dot(totalloss))print("误差大于阈值时的实际输出",sigmoid(outlayer_output_1))print("误差大于阈值时的w1权值矩阵:\n",w1)print("误差大于阈值时的w2权值矩阵:\n",w2)"""如果全局误差小于阈值就返回目前权"""if 0.5*totalloss.dot(totalloss)<= erro:print("\n误差满足要求!")w1=np.mat(w1)print("到更新的w1矩阵",w1 )print("得到更新的w2矩阵",w2)print("全局损失; ",0.5*totalloss.dot(totalloss))breakupgrade_w1_w2() #调用函数def classfier(test):obs =test[0:,:3]hi_1=np.mat(w1[0]).dot(obs.T) - b1[0]hi_2=np.mat(w1[1]).dot(obs.T) - b1[1]ho_1=sigmoid(hi_1)ho_2=sigmoid(hi_2)hidden_output_array=[float(hi_1),float(hi_2)]outlayer_input_1=w2[0].dot(hidden_output_array)-b2[0]outlayer_output_1=sigmoid(outlayer_input_1)print("经过最终神经网络训练后,输出层的实际输出:", outlayer_output_1)if outlayer_output_1>0.45:print("该测试样本和0.9代表的类别更接近")if outlayer_output_1<0.45:print("该测试样本和0.1代表的类别更接近")if outlayer_output_1==0.45:print("该测试样本可被任意归为两个类别之一")classfier(np.mat([[1.82,1.54,0]]))#这里的测试样本[[2.08,1.56,0]]是我从原先14个样本中挑选的,训练集有13个,留了1个作为测试,该样本的target的确是0.1#说明我们训练出的BP神经网络模型有可信度,训练集如下图所示,最后一列是target目标值

任何程序错误,以及技术疑问或需要解答的,请添加

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

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

相关文章

JVM(二)Java虚拟机组成详解

导读&#xff1a;详细而深入的总结&#xff0c;是对知识“豁然开朗”之后的“刻骨铭心”&#xff0c;想忘记都难。 Java虚拟机&#xff08;Java Virtual Machine&#xff09;下文简称jvm&#xff0c;上一篇我们对jvm有了大体的认识&#xff0c;进入本文之后我们将具体而详细的…

PyCharm pyqt5 python串口通信封装类SerialCommunication

""" pyqt5串口通信文件SerialCommunication.py """ import binascii import os import serial import serial.tools.list_ports from PyQt5.QtGui import QPixmap# 全局变量&#xff0c;串口是否创建成功标志 Ret False # 串口列表串口号 port_…

Fiddler利用Xposed框架+JustTrustMe抓取手机APP数据

文章目录 1. Xposed安装2. JustTrustMe安装3. 确保Fiddler在模拟器里配置 此文只是针对Fiddler抓取APP数据失败情况下的方案&#xff0c;主要想解决的是安卓手机APP抓包HTTPS报文通过MITM代理后证书不被信任的问题。网上搜索出这是使用了SSL Pinning技术&#xff0c;网上可以搜…

互动直播的视频录制与合成—支持多人离线重入

实现的效果图&#xff1a; 上图合成了2个人视频&#xff0c;中途有1个人先离开之后又重新加入了房间。 一、业务场景 业务场景是这样的&#xff1a;多个用户&#xff08;2-4人&#xff09;直播的视频&#xff0c;合成为一个视频&#xff0c;这期间要满足2个条件&#xff1a;首…

Python界面 PyQT可视化开发(python3+PyQt5+Qt Designer)

前言 以前制作一个Python窗体界面&#xff0c;我都是用GUI窗口视窗设计的模块Tkinter一点一点敲出来的&#xff0c;今天朋友问我有没有Python窗体的设计工具&#xff0c;“用鼠标拖拖”就能完成窗体设计&#xff0c;我查了查相关资料&#xff0c;果然有一款好用的工具——Qt De…

JVM(三)对象的生死判定和算法详解

好的文章是能把各个知识点&#xff0c;通过逻辑关系串连起来&#xff0c;让人豁然开朗的同时又记忆深刻。 导读&#xff1a;对象除了生死之外&#xff0c;还有其他状态吗&#xff1f;对象真正的死亡&#xff0c;难道只经历一次简单的判定&#xff1f;如何在垂死的边缘“拯救”一…

【STM32】修改芯片型号后报 Error 的解决方案

原文&#xff1a;https://blog.csdn.net/xiuhua_wu/article/details/85237418 背景 前几天有个新需求&#xff0c;使用 STM32 的标准库&#xff08;STD&#xff09;做个产品的例程。之前已经做了个 HAL 的&#xff0c;但人家客户不干&#xff0c;非要 STD 的。拖了一周&#xf…

Python手写神经网络实现3层感知机

一、BP神经网络结构模型 BP算法的基本思想是&#xff0c;学习过程由信号的正向传播和误差的反向传播俩个过程组成&#xff0c;输入从输入层输入&#xff0c;经隐层处理以后&#xff0c;传向输出层。如果输出层的实际输出和期望输出不符合&#xff0c;就进入误差的反向传…

JVM(四)垃圾回收的实现算法和执行细节

全文共 1890 个字&#xff0c;读完大约需要 6 分钟。 上一篇我们讲了垃圾标记的一些实现细节和经典算法&#xff0c;而本文将系统的讲解一下垃圾回收的经典算法&#xff0c;和Hotspot虚拟机执行垃圾回收的一些实现细节&#xff0c;比如安全点和安全区域等。 因为各个平台的虚拟…

python-cx_oracle报错“DatabaseError: DPI-1047: 64-bit Oracle Client library cannot be loaded: “

问题的主要原因是python-cx_oracle加载的是32位的instantclient-basic&#xff0c;我们需要让他读到64位的。 弄清版本&#xff0c;最重要&#xff01;&#xff01;&#xff01; 首先安装配置时&#xff0c;必须把握一个点&#xff0c;就是版本一致&#xff01;包括&#xff1…

JVM(五)垃圾回收器的前世今生

全文共 2195 个字&#xff0c;读完大约需要 8 分钟。 如果垃圾回收的算法属于内存回收的方法论的话&#xff0c;那本文讨论的垃圾回收器就属于内存回收的具体实现。 因为不同的厂商&#xff08;IBM、Oracle&#xff09;&#xff0c;实现的垃圾回收器各不相同&#xff0c;而本文…

【SlowFast复现】SlowFast Networks for Video Recognition复现代码 使用自己的视频进行demo检测

目录 一&#xff0c;准备 1.1代码1.2 环境准备1.3 搭建镜像1.4 配置slowfast环境1.5 ava.json1.6 SLOWFAST_32x2_R101_50_50.yaml1.7 SLOWFAST_32x2_R101_50_50 .pkl二&#xff0c;代码运行三 错误解决复现过程视频&#xff1a;B站复现视频复现结果 一&#xff0c;准备 1.1代…

MySQL学生向笔记以及使用过程问题记录(内含8.0.34安装教程

MySQL 只会写代码 基本码农 要学好数据库&#xff0c;操作系统&#xff0c;数据结构与算法 不错的程序员 离散数学、数字电路、体系结构、编译原理。实战经验&#xff0c; 高级程序员 去IOE&#xff1a;去掉IBM的小型机、Oracle数据库、EMC存储设备&#xff0c;代之以自己在开源…

程序员专属精品简历合集—面试必备

听说你最近打算换工作&#xff1f;听说你和好工作之间&#xff0c;只差一个漂亮的简历模板&#xff1f;人们常说“金三银四”&#xff0c;一年之际在于春。不管你是主动离职&#xff0c;还是被动“被离职”&#xff08;稳住&#xff0c;我们能赢&#xff01;&#xff09;&#…

ubuntu20.10下wine安装微信

1.unbuntu20.04下安装wine sudo apt-get install wine2.微信官网http://short.weixin.qq.com/下载window系统微信软件 3.在wine中安装微信 在WeChatSetup.exe文件中打开终端输入&#xff1a; wine WeChatSetup.exe

【faster rcnn 实现via的自动框人】使用detectron2中faster rcnn 算法生成人的坐标,将坐标导入via(VGG Image Annotator)中,实现自动框选出人的区域

前言 B站讲解视频 我的研究生毕业论文方向就是时空行为检测&#xff0c;所以&#xff0c;slowfast和ava是我重点搞的&#xff0c;我的博客主页也有很多这些相关内容。 终于&#xff0c;到了标注数据这一块了&#xff0c;为了更简单的标注数据&#xff0c;我要做的这部分的数据…

程序员精美简历Top榜—面试必备

听说你最近打算换工作&#xff1f;听说你和好工作之间&#xff0c;只差一个漂亮的简历模板&#xff1f; 不管是主动离职&#xff0c;还是“被离职”&#xff08;稳住&#xff0c;我们能赢&#xff01;&#xff09;&#xff0c;趁着大好时光和对新年的憧憬&#xff0c;再找一个…

失败创业者的告白:初创团队应有一位绝对领导者

做了两年的项目失败了&#xff0c;我们的项目做的是数码3C的优惠信息&#xff0c;我是一个80后&#xff0c;小硕一枚;我们的1号创始人是90后&#xff0c;有激情、有梦想;在十八岁那年带上他的梦想千里北上&#xff0c;找我们的开复老师指点一二;但那时&#xff0c;开复老师正为…

【ffmpeg裁剪视频faster rcnn自动检测 via】全自动实现ffmpeg将视频切割为图片帧,再使用faster rcnn将图片中的人检测出来,最后将检测结果转化为via可识别的csv格式

目录 前言一&#xff0c;ffmpeg 自动裁剪 1.1 目录结构1.2 cutVideoToImage.sh1.2 myVideo1.3 myVideo15mins1.5 myFrames1.6 运行1.7 查看结果二&#xff0c;detectron2中的faster rcnn检测 2.1 img2.2 myvia.py2.3 运行2.4 结果展示三&#xff0c;via标注 3.1 csv文件修改&am…

ubuntu20.10(Linux)在wine下用pyinstaller打包python程序在window系统运行 交叉编译

1.安装wine 在终端中输入&#xff1a; sudo apt-get install wine2.安装pip 在https://pypi.org/project/pip/#files下载pip-21.0.tar.gz&#xff0c;在压缩包上右键提取到此处&#xff0c;打开解压的文件夹pip-21.0 在该文件夹中打开终端安装pip-21.0.tar.gz&#xff1a; wi…