1.用sigmoid(x)函数激活:

其导数f'(x)=f(x)(1-f(x))

import pandas as pd
import numpy as np
import matplotlib.pyplot as pltdef sigmoid(x):return 1/(1+np.exp(-x))def BP(data_tr, data_te, maxiter=1000):data_tr, data_te = np.array(data_tr), np.array(data_te)net_in = np.array([0.0, 0, -1])out_in = np.array([0.0, 0, 0, 0, -1])   # 输出层的输入,即隐层的输出w_mid = np.random.rand(3, 4) # 隐层神经元的权值&阈值w_out = np.random.rand(5)    # 输出层神经元的权值&阈值delta_w_out = np.zeros([5])      # 输出层权值&阈值的修正量delta_w_mid = np.zeros([3,4])   # 中间层权值&阈值的修正量yita = 1.75                           # η: 学习速率Err = np.zeros([maxiter])             # 记录总体样本每迭代一次的错误率# 1.样本总体训练的次数for it in range(maxiter):# 衡量每一个样本的误差err = np.zeros([len(data_tr)])# 2.训练集训练一遍for j in range(len(data_tr)):net_in[:2] = data_tr[j, :2]                       # 存储当前对象前两个属性值real = data_tr[j, 2]# 3.当前对象进行训练for i in range(4):out_in[i] = sigmoid(sum(net_in*w_mid[:, i]))  # 计算输出层输入res = sigmoid(sum(out_in * w_out))                # 获得训练结果err[j] = abs(real - res)# --先调节输出层的权值与阈值delta_w_out = yita*res*(1-res)*(real-res)*out_in  # 权值调整delta_w_out[4] = -yita*res*(1-res)*(real-res)     # 阈值调整w_out = w_out + delta_w_out# --隐层权值和阈值的调节for i in range(4):# 权值调整delta_w_mid[:, i] = yita * out_in[i] * (1 - out_in[i]) * w_out[i] * res * (1 - res) * (real - res) * net_in# 阈值调整delta_w_mid[2, i] = -yita * out_in[i] * (1 - out_in[i]) * w_out[i] * res * (1 - res) * (real - res)w_mid = w_mid + delta_w_midErr[it] = err.mean()plt.plot(Err)plt.show()# 存储预测误差err_te = np.zeros([ len(data_te)  ])# 预测样本len(data_te)个for j in range( len(data_te)  ):net_in[:2] = data_te[j, :2]                         # 存储数据real = data_te[j, 2]                                # 真实结果# net_in和w_mid的相乘过程for i in range(4):# 输入层到隐层的传输过程out_in[i] = sigmoid(sum(net_in*w_mid[:, i]))res = sigmoid(sum(out_in*w_out))                    # 网络预测结果输出err_te[j] = abs(real-res)                           # 预测误差print('res:', res, ' real:', real)plt.plot(err_te)plt.show()if "__main__" == __name__:# 1.读取样本data_tr = pd.read_csv("D:\\人工智能\\3.3 data_tr.txt")data_te = pd.read_csv("D:\\人工智能\\3.3 data_te.txt")BP(data_tr, data_te, maxiter=1000)

仿造sigmoid(x)函数实现tanh函数和ReLU函数的激活

!!!注意:

以下两个代码实现中的学习速率不能太大,否者就会出现以下这种情况:

res值一样,明显出错。

于是我在代码中增加了print(sum(net_in*w_mid[:, i]))

运行中出现了:

原因:

学习速率太大,会出现震荡,出现震荡,会导致你的梯度值特别大,很可能出现溢出这种情况。这个梯度值可能是inf,-inf。

而以下这些操作都会导致nan的产生,这些都是不确定的操作

np.inf/np.inf

0*np.inf

具体可以看(40条消息) nan值的出现_run_session的博客-CSDN博客_nan值

2.用tanh函数激活:

其导数为f'(x)=1-f(x)*f(x)

import pandas as pd
import numpy as np
import matplotlib.pyplot as pltdef tanh(x):return (np.exp(x) - np.exp(-x)) / (np.exp(x) + np.exp(-x))def BP(data_tr, data_te, maxiter=500):data_tr, data_te = np.array(data_tr), np.array(data_te)net_in = np.array([0.0, 0, -1])out_in = np.array([0.0, 0, 0, 0, -1])   # 输出层的输入,即隐层的输出w_mid = np.random.rand(3, 4) # 隐层神经元的权值&阈值w_out = np.random.rand(5)     # 输出层神经元的权值&阈值delta_w_out = np.zeros([5])      # 输出层权值&阈值的修正量delta_w_mid = np.zeros([3,4])   # 中间层权值&阈值的修正量yita = 0.20                           # η: 学习速率Err = np.zeros([maxiter])             # 记录总体样本每迭代一次的错误率# 1.样本总体训练的次数for it in range(maxiter):# 衡量每一个样本的误差err = np.zeros([len(data_tr)])# 2.训练集训练一遍for j in range(len(data_tr)):net_in[:2] = data_tr[j, :2]                       # 存储当前对象前两个属性值real = data_tr[j, 2]# 3.当前对象进行训练for i in range(4):out_in[i] =   tanh (sum(net_in*w_mid[:, i]))  # 计算输出层输入res = tanh   (sum(out_in * w_out))                # 获得训练结果err[j] = abs(real - res)# --先调节输出层的权值与阈值delta_w_out = yita*(1-res*res)*(real-res)*out_in  # 权值调整  f'(x)=1-f(x)*f(x)delta_w_out[4] = -yita*(1-res*res)*(real-res)     # 阈值调整w_out = w_out + delta_w_out# --隐层权值和阈值的调节for i in range(4):# 权值调整delta_w_mid[:, i] = yita *  (1 - out_in[i] * out_in[i]) * w_out[i] * (1 - res * res) * (real - res) * net_in# 阈值调整delta_w_mid[2, i] = -yita * (1 - out_in[i] * out_in[i]) * w_out[i] * (1 - res * res) * (real - res)w_mid = w_mid + delta_w_midErr[it] = err.mean()plt.plot(Err)plt.show()# 存储预测误差err_te = np.zeros([ 100 ])# 预测样本len(data_te)个for j in range( 100 ):net_in[:2] = data_te[j, :2]                         # 存储数据real = data_te[j, 2]                                # 真实结果# net_in和w_mid的相乘过程for i in range(4):# 输入层到隐层的传输过程out_in[i] = tanh(sum(net_in*w_mid[:, i]))res = tanh(sum(out_in*w_out))                    # 网络预测结果输出err_te[j] = abs(real-res)                           # 预测误差print('res:', res, ' real:', real)plt.plot(err_te)plt.show()if "__main__" == __name__:# 1.读取样本data_tr = pd.read_csv("D:\\人工智能\\3.3 data_tr.txt")data_te = pd.read_csv("D:\\人工智能\\3.3 data_te.txt")BP(data_tr, data_te, maxiter=500)

3.用ReLU函数激活:

其导数f'(x)=1,x>0;f'(x)=0,x<=0

这里要求学习速率要特别低,我设了0.01

import pandas as pd
import numpy as np
import matplotlib.pyplot as pltdef ReLU(x):return np.where(x > 0, x, 0)def ReLUd(x):return np.where(x > 0, 1, 0)def BP(data_tr, data_te, maxiter=2000):data_tr, data_te = np.array(data_tr), np.array(data_te)net_in = np.array([0.0, 0, -1])out_in = np.array([0.0, 0, 0, 0, -1])   # 输出层的输入,即隐层的输出w_mid = np.random.rand(3, 4) # 隐层神经元的权值&阈值w_out = np.random.rand(5)     # 输出层神经元的权值&阈值delta_w_out = np.zeros([5])      # 输出层权值&阈值的修正量delta_w_mid = np.zeros([3,4])   # 中间层权值&阈值的修正量Err = []yita = 0.01                          # η: 学习速率Err = np.zeros([maxiter])             # 记录总体样本每迭代一次的错误率# 1.样本总体训练的次数for it in range(maxiter):# 衡量每一个样本的误差err = np.zeros([len(data_tr)])# 2.训练集训练一遍for j in range(len(data_tr)):net_in[:2] = data_tr[j, :2]                       # 存储当前对象前两个属性值real = data_tr[j, 2]# 3.当前对象进行训练for i in range(4):out_in[i] = ReLU(sum(net_in*w_mid[:, i]))  # 计算输出层输入res = ReLU(sum(out_in * w_out))                # 获得训练结果err[j] = abs(real - res)# --先调节输出层的权值delta_w_out = yita*(real-res)*out_in*ReLUd(res)  # 权值调整delta_w_out[4] = -yita*(real-res)*ReLUd(res)     # 阈值调整w_out = w_out + delta_w_out# --隐层权值和阈值的调节for i in range(4):# 权值调整delta_w_mid[:, i] = yita * w_out[i]* (real - res) * net_in*ReLUd(res) # 阈值调整delta_w_mid[2, i] = -yita * w_out[i] * (real - res)*ReLUd(res) w_mid = w_mid + delta_w_midErr[it] = err.mean()plt.plot(Err)plt.show()# 存储预测误差err_te = np.zeros([ len(data_te) ])# 预测样本len(data_te)个for j in range( len(data_te) ):net_in[:2] = data_te[j, :2]                         # 存储数据real = data_te[j, 2]                                # 真实结果# net_in和w_mid的相乘过程for i in range(4):# 输入层到隐层的传输过程out_in[i] = ReLU(sum(net_in*w_mid[:, i]))res = ReLU(sum(out_in*w_out))                       # 网络预测结果输出err_te[j] = abs(real-res)                           # 预测误差print('res:', res, ' real:', real)plt.plot(err_te)plt.show()if "__main__" == __name__:# 1.读取样本data_tr = pd.read_csv("D:\\人工智能\\3.3 data_tr.txt")data_te = pd.read_csv("D:\\人工智能\\3.3 data_te.txt")BP(data_tr, data_te, maxiter=2000)

若要解决出现nan的问题,可以看(40条消息) 解决输出为nan的问题_Tchunren的博客-CSDN博客_网络输出为nan

BP神经网络代码实现相关推荐

  1. bp神经网络代码_机器学习(周志华)课后习题——第五章——神经网络

    5.1 试述将线性函数 用作神经元激活函数的缺陷. 答: 使用线性函数作为激活函数时,无论是在隐藏层还是在输出层(无论传递几层),其单元值(在使用激活函数之前)都还是输入 的线性组合,这个时候的神经网 ...

  2. python bp神经网络代码实现预测,用Python实现BP神经网络(附代码)

    用Python实现出来的机器学习算法都是什么样子呢? 前两期线性回归及逻辑回归项目已发布(见文末链接),今天来讲讲BP神经网络. BP神经网络 全部代码 https://github.com/lawl ...

  3. BP神经网络代码超通俗解释(MATLAB)

    clc;clear; %BP神经网络 xy=rand(2,200); %随机生成200组自变量,一组变量包含x,y,可以看成第一行为x1,x2,...x200,第二行为y1,y2,...y200; z ...

  4. bp神经网络代码_精通数据科学笔记 神经网络

    本章讨论一种全新的建模理念,它不关心模型的假设以及相应的数学推导,也就是说不关心模型的可解释性,其核心内容是模型实现,虽然到目前为止,人们还无法理解,但在某些特定场景里预测效果却非常好.我们把这种模型 ...

  5. 机器学习(一):BP神经网络(含代码及注释)

    目录 人工神经网络 神经网络分类 BP神经网络 代码实现 人工神经网络 人们利用数学模型来模仿生物神经元传递信息以及做出决策等等.       下图神经网络数学模型可以等效为输入矩阵X与系数矩阵W相乘 ...

  6. 【回归预测-BP预测】基于灰狼算法优化BP神经网络实现数据回归预测附matlab代码

    1 内容介绍 Mirjalili 等在 2014 年 提 出 了 灰 狼 优 化 ( Grey Wolf Optimizer,GWO) 算法,是一种新型群智能优化算法,通过模拟自然界中灰狼寻找.包围和 ...

  7. MATLAB房价,MATLAB实现波士顿房价预测使用BP神经网络

    MATLAB实现波士顿房价预测使用BP神经网络 MATLAB实现波士顿房价预测,使用BP神经网络 代码如下(包括下载数据和训练网络): %%Download Housing Prices filena ...

  8. 计算智能——BP神经网络

    BP神经网络 1.BP神经网络发展背景 在人工神经网络的发展历史上,感知机(Multilayer Perceptron,MLP)网络曾对人工神经网络的发展发挥了极大的作用,也被认为是一种真正能够使用的 ...

  9. 利用BP神经网络教计算机进行非线函数拟合(代码部分多层)

    利用BP神经网络教计算机进行非线函数拟合(代码部分多层) 本图文已经更新,详细地址如下: http://blog.csdn.net/lsgo_myp/article/details/54425751

  10. BP神经网络python代码详细解答(来自原文翻译)

    翻译如下 ** <font color=black size=6.5> 在 SCRATCH采用python 上实现一种神经网络 **         注: Scratch是一款由麻省理工学 ...

最新文章

  1. 深度学习笔记之使用Faster-Rcnn进行目标检测 (实践篇)
  2. cocos2d-x之逐帧动画
  3. swarm 本地管理远程_带有WildFly Swarm的远程JMS
  4. python没有那个文件或目录_fatal error: Python.h: 没有那个文件或目录 解决方法
  5. 一个架构师谈什么是架构,以及怎么成为架构师
  6. Noise,Error,wighted pocket Algorithm
  7. psp记忆棒测试软件,psp记忆棒修复工具 ms-format
  8. Log4j.properties 属性详解以及 LOG4J日志级别详解
  9. 王牌英雄怎么服务器维护了,王牌英雄steam版无法运行问题解决方法
  10. dxp中发光二极管在哪找_DXP2004 元件库中常用元件
  11. python关于类和对象说法正确的是_关于类和对象的关系,下列描述正确的是()。
  12. It has been compressed and nested jar files must be stored without compression
  13. 支付系统就该这么设计(万能通用)
  14. 豫让刺杀赵襄子故事原文/白话文翻译?士为知己者死,女为说己者容出自哪?
  15. 1024程序员狂欢节,来领当当大额优惠券
  16. QNX 实时操作系统(Quick Unix)
  17. 华为快应用IDE:代码智能提示及自动补全
  18. IT员工招聘:把好心理这道关
  19. 2021年质量员-市政方向-岗位技能(质量员)考试总结及质量员-市政方向-岗位技能(质量员)试题及解析
  20. [计蒜客][二分]切割钢管

热门文章

  1. java编程对电脑配置,编程对电脑配置要求高吗?
  2. 接口测试apipost
  3. 【转】极品免费网站空间申请:000webhost.com免费1.5G美国空间PHP+MySQL
  4. python 微信模块_Python实现清理微信僵尸粉功能示例【基于itchat模块】
  5. vivo android 6.0 root,vivo手机怎么获取root权限?vivo手机一键ROOT教程
  6. indoe智能客户端ios_inode客户端证书导入
  7. 计算机房通气换气次数,不知道换气次数如何确定?各种换气次数汇总,暖通设计师的宝典...
  8. 智能合约语言Solidity教程系列2 - 地址类型介绍
  9. WS2811B驱动使用及使用说明
  10. java中this关键字的作用