传送门(所有的实验都使用python实现)

实验1 BP神经网络实验

实验2 som网实验

实验3 hopfield实现八皇后问题

实验4 模糊搜索算法预测薄冰厚度

实验5 遗传算法求解tsp问题

实验6 蚁群算法求解tsp问题

实验7 粒子群优化算法求解tsp问题

实验8 分布估计算法求解背包问题

实验9 模拟退火算法求解背包问题

实验10 禁忌搜索算法求解tsp问题

  • 实验目的
  1. 编程实现BP神经网络算法;
  2. 探究BP算法中学习因子算法收敛趋势、收敛速度之间的关系;
  3. 修改训练后BP神经网络部分连接权值,分析连接权值修改前和修改后对相同测试样本测试结果,理解神经网络分布存储等特点。
  • 实验要求

   按照下面的要求操作,然后分析不同操作后网络输出结果。

  1. 可修改学习因子
  2. 可任意指定隐单元层数
  3. 可任意指定输入层、隐含层、输出层的单元数
  4. 可指定最大允许误差ε
  5. 可输入学习样本(增加样本)
  6. 可存储训练后的网络各神经元之间的连接权值矩阵;
  7. 修改训练后的BP神经网络部分连接权值,分析连接权值修改前和修改后对相同测试样本测试结果 。
  • 实验原理
  1. 明确BP神经网络算法的基本思想如下:
  2. 明确BP神经网络算法步骤和流程如下:

四、实验内容和分析

  1. 实验时建立三层BP神经网络,输入节点2个,隐含层节点2个,输出节点1个,输入训练样本如下表:

表1 输入训练样本

输入值

输出

0.0

0.0

0.0

0.0

1.0

1.0

1.0

0.0

1.0

1.0

1.0

0.0

0.1

1.0

1.0

学习因子分别为0.9, 最大允许误差0.001。

  1. 训练结果:

  1. 输入测试样本为

0.05  0.1

0.2   0.9

0.86  0.95

输出测试结果为

成功通过了测试,说明训练过程正确

1.改变学习因子

设置学习因子为0.6,学习因子越小结果越准确,但是也更耗时

2.改变输入层、隐含层、输出层的单元数

当隐含层节点个数为3时,相同训练样本和测试样本,得到测试结果为

隐含层变多之后,网络变复杂了,训练次数增多,但是结果更加准确。

最大允许误差ε控制网络识别精度。

精度取的越小,最后结果更精确,代价是付出更多的时间进行迭代。

以上实验误差均为0.001,本次取误差为0.0001,发现迭代次数上升,但是精度提高。

  1. 增加学习样本

在基本实验的基础上,增加一个学习样本0.1 1.0 1.0后

增加一个样本以后,虽然速度变慢,但是结果精度大大提高。

2.改变部分连接权值

为了保证算法能迅速收敛,因此采用的是随机梯度下降法,而非梯度下降法,因此算法是无监督型的,故不推荐修改连接权值。

1.实验过程:

由于BP算法的初始权重和阈值的随机性(为了保证梯度下降法的随机性,这里不使用固定的权重和阈值,可以使实验效果更好),因此实验的收敛次数是分散的,我们采用多次实验,取最小收敛次数作为依据。如图1所示。

图1 部分实验过程

实验过程如图1所示,多次执行算法,通过观察其收敛次数和测试结果的效果来决定是否采集本次数据。

2.实验结果:

本实验中,样本数据如表一所示,默认配置:最大迭代次数为10000,最大误差为0.001,学习因子为0.5,动量为0.9。实验结果在实验内容部分给出。

经过大量实验表明:

(1)一般来说,当算法迭代次数越多时,实验结果越精确,然而也存在特例,即算法陷入局部最小,迭代次数的增加并不带来精确度的提高。

python源码

# -*- coding: UTF-8 -*-
import random
import math
class bp:def init_w(self,w,x,y):#初始化偏置值for i in range(x):for j in range(y):w[i][j]=random.random()if(w[i][j]<0.5):w[i][j]=-w[i][j];def init_se(self,w,x):#初始化权值for i in range(x):w[i]=random.random()if(w[i]<0.5):w[i]=-w[i]def  forward(self,   inp,  outp,w, x, y, se):#向前传播输入for j in range(y):outp[j]=0for i in range(x):outp[j]+=inp[i]*w[i][j]outp[j] = outp[j]+se[j];outp[j] = (1.0)/(1+math.exp(-outp[j]))def  reforward(self):#反向误差更新self.sumse = 0;#计算输出层误差for i in range(self.o_size):self.eo[i] = self.ouput[i] * (1.0-self.ouput[i]) * (self.ouputex[i]-self.ouput[i]);if(self.eo[i]<0.0):self.sumse -= self.eo[i];else:self.sumse += self.eo[i]#计算输入层误差  for i in range(self.h_size):self. eh[i] = 0;for j in range(self.o_size):self. eh[i]+= self.hidden[i] * (1-self.hidden[i]) * self.who[i][j] * self.eo[j];def  updatew(self):#更新隐含层与输出层权值for i in range(self.h_size):for j in range(self.o_size):self.upwho[i][j]=(self.L*self.hidden[i]*self.eo[j])+(self.Mom*self.upwho[i][j])self.who[i][j]+=self.upwho[i][j]#更新输入与隐含层权值for i in range(self.i_size):for j in range(self.h_size):self.upwih[i][j]=(self.L*self.input[i]*self.eh[j])+(self.Mom*self.upwih[i][j])self.wih[i][j]+=self.upwih[i][j]   #更新阈值def  updatefa(self):for i in range(self.i_size):self.seh[i]+=self.L*self.eh[i]for i in range(self.o_size):self.seo[i]+=self.L*self.eo[i]#训练函数def  train(self ,in1,out1):self.input=in1self.ouputex=out1self.forward(self.input, self.hidden, self.wih, self.i_size, self.h_size, self.seh)#向前传播输入self.forward(self.hidden, self.ouput, self.who, self.h_size, self.o_size, self.seo)self.reforward()#反向误差传播self.updatew()#更新网络权重self.updatefa()#更新阈值#测试函数def test(self,init1):self.input=init1self.forward(self.input, self.hidden, self.wih, self.i_size, self.h_size, self.seh)self.forward(self.hidden, self.ouput, self.who, self.h_size, self.o_size, self.seo)for i in range(self.o_size):print(self.ouput[i])#返回阈值def get_e(self,w,x):self.f=0for i in range(self.o_size):print(w[i],end="")self.f+=1if(self.f%2==0):print("")    print("")#返回权值          def get_w(self,w,x,y):self.f=0;for i in range(x):for j in range(y):print(w[i][j],end="")print("     ",end="")self.f+=1if(self.f%2==0):print("")         #类初始化                  def __init__(self,size,l,mom):self.L=l                        #学习因子                                                                                    self.Mom=mom;        #动量self.i_size=size[0];          #输入层数量self.h_size=size[1];        #隐含层数量self.o_size=size[2];          #输出层数量self.wih=[[0 for i in range(self.h_size)] for j in range(self.i_size)]    #输入层与隐含层权值self.who=[[0 for i in range(self.o_size)] for j in range(self.h_size)]     #隐含层与输出层权值self.upwih=[[0 for i in range(self.h_size)] for j in range(self.i_size)]    self.upwho=[[0 for i in range(self.o_size)] for j in range(self.h_size)]     # 动量更新self.input=[0 for i in range(self.i_size)]                      #输入层  self.hidden=[0 for i in range(self.h_size)]                #隐含层self.ouput=[0 for i in range(self.o_size)]                   #输出层self.ouputex=[0 for i in range(self.o_size)]                #期待输出self.seh= [0 for i in range(self.h_size)]                       #隐含层偏置self.seo= [0 for i in range(self.o_size)]                       #输出层偏置self.eh= [0 for i in range(self.h_size)]                       #隐含层误差self.eo= [0 for i in range(self.o_size)]                       #输出层误差self. init_w(self.wih,self.i_size,self.h_size)          #初始化 输入层到隐含层self. init_w(self.who,self.h_size,self.o_size)         #初始化 隐含层到输出层.self.init_se(self.seh, self.h_size)#初始化隐含层的偏置self.init_se(self.seo, self.o_size)#初始化输出层的偏置size =[2,2,1]
inputData = [[0.0,0.0],[0.0,1.0],[1.0,0.0],[1.0,1.0],[0.1,1.0],[0.1,1.0]]
outputData = [[0.0],[1.0],[1.0],[0.0],[1.0],[1.0]]
testData = [[0.05,0.1],[0.2,0.9],[0.86,0.95]]t=bp(size,0.5,0.9)for i in range(10000):for j in range(6):t.train(inputData[j],outputData[j])if(t.sumse<0.001): print("迭代次数:",i)breakprint("误差为:",t.sumse)
print("输入层与隐含层连接权值为:",end="")
t.get_w(t.wih,t.i_size,t.h_size)
print("隐含层与输出层连接权值为:",end="")
t.get_w(t.who,t.h_size,t.o_size)
print("隐含层神经元阈值为:",end="")
t.get_e(t.seh, t.h_size)
print("输出层神经元阈值为:",end="")
t.get_e(t.seo, t.o_size)for i in range(3):print("训练样本为:",testData[i],"        结果为:",end="")t.test(testData[i])

实验1 BP神经网络实验相关推荐

  1. bp神经网络实验报告郑航_bp神经网络实验报告

    bp神经网络实验报告 深 圳 大 学 实 验 报 告 实验课程名称: 人工神经网络技术 实验项目名称: BP 神经网络对蝴蝶花分类 学院: 专业: 软件工程 报告人: 学号: 班级: 同组人: 无 指 ...

  2. BP神经网络实验报告

    BP神经网络实验报告 实验要求 构造一个三层的BP神经网络,完成手写0-9数字的识别 实验步骤 1. 从网上下载MNIST数据集 从官网上得到的数据集有4个,以IDX3-UBYTE的文件类型保存 tr ...

  3. MATLAB实现智能计算方法实验:实验三 BP神经网络

    资源链接 MATLAB实现智能计算方法课程所有实验代码资源链接为:MATLAB实现智能计算方法课程所有实验代码资源 本实验代码和excel文件可在GitHub仓库和gitee仓库中进行下载 实验汇总 ...

  4. bp神经网络实验报告结论,bp神经网络实验报告

    bp神经网络 BP(Back Propagation)网络是1986年由Rumelhart和McCelland为首的科学家小组提出,是一种按误差逆传播算法训练的多层前馈网络,是目前应用最广泛的神经网络 ...

  5. 实验5 卷积神经网络实验

    一.实验要求 在计算机上验证和测试Pytorch卷积神经网络的原理和算法实现,测试卷积神经网络的训练效果,同时查阅相关资料. 实验目的 1.掌握PyTorch的基本使用: 2.掌握PyTorch的卷积 ...

  6. 实验2 som网实验

    传送门(所有的实验都使用python实现) 实验1 BP神经网络实验 实验2 som网实验 实验3 hopfield实现八皇后问题 实验4 模糊搜索算法预测薄冰厚度 实验5 遗传算法求解tsp问题 实 ...

  7. BP神经网络 MATLAB实验报告

    实验三 BP****神经网络 一.实验目的 掌握BP神经网络相关理论基础: 掌握BP神经网络的创建.训练及测试: 能够利用BP神经网络对数据进行分类. 二.实验内容 有60个数据,包含两个类别,每个数 ...

  8. BP神经网络设计与实现

    BP神经网络设计与实现 实验要求 基于Python原生实现,不调用深度学习框架函数,完成代码编写 实验内容 1.详细论述本次实验的算法设计及描述. 2.双月数据构建生成及使用方法. 3.根据误差反向传 ...

  9. 模式识别八--三层BP神经网络的设计与实现

    文章转自:http://www.kancloud.cn/digest/prandmethod/102850 本文的目的是学习和掌握BP神经网络的原理及其学习算法.在MATLAB平台上编程构造一个3-3 ...

最新文章

  1. php 引入其他文件中的变量
  2. angularjs与server交互
  3. get request uni 参数_uni-app 环境配置,uni.request封装,接口配置,全局配置,接口调用的封装...
  4. 算法设计与分析——递归与分治策略——最接近点对问题
  5. #ifdef,#ifndef,#define,#endif解析(原)
  6. 2017第四届中国国际大数据大会成功召开
  7. 剖析Caffe源码之Net---Net构造函数
  8. 一文快速理解23种经典设计模式
  9. 【es】es 分布式一致性原理剖析(二)-Meta篇
  10. 【细节实现题】LeetCode 57. Insert Interval
  11. 教你如何AMPL自动求解tsp问题
  12. python可以用于工业机器人编程_工业机器人四种编程技术
  13. 使用cd-hit对核酸序列或氨基酸序列聚类
  14. arcgis api for js绘制箭头图
  15. R语言--Cox模型校准曲线原理(一)数据来源
  16. Linux配置定时任务
  17. 获取执行程序的原路径(绝对路径)
  18. Spotfire 数据分析学习之一
  19. 免费手机号码归属地API查询接口
  20. 服务器系统壁纸,云服务器壁纸

热门文章

  1. C语言链接mysql数据库实现简易的学生信息增删改查
  2. java实现 一维装箱问题_装箱问题(Bin packing problem)
  3. Java 实现 蓝桥杯 生兔子问题
  4. 网页css实现文字竖向排版的几种方法
  5. alt标签的写法两种
  6. 成为明星程序员的独特秘密
  7. c语言arctan转换求pi,arctanx可以转换成什么
  8. 申请专利的费用能计入研发费吗
  9. R z-score 方法检测异常值
  10. 销售人员开发大客户技巧 大客户销售怎样做好