热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

BP神经网络的学习以及实现

一、算法背景及概述人工神经网络是由具有适应性的简单单元组成的广泛并行互连的网络,它的组织能够模拟生物神经系统对真实世界物体所做出的交互反应。它是一个由大量简单的处理单元广泛连接组成的非线性系统,具


一、算法背景及概述

  人工神经网络是由具有适应性的简单单元组成的广泛并行互连的网络,它的组织能够模拟生物神经系统对真实世界物体所做出的交互反应。它是一个由大量简单的处理单元广泛连接组成的非线性系统,具有良好的非线性映射能力、自适应学习能力和并行信息处理能力。人工神经网络早在上世纪就被提出,但并不受关注。近年来,随着计算机硬件性能的提高,人工神经网络的实现变得越来越简单,且实现复杂的人工神经网络也并不困难。尤其是近几年机器学习的兴起,人工神经网络将在智能控制、模式识别、自适应滤波和信号处理、传感技术和机器人、非线性优化、知识处理、生物医学工程、金融预测和管理等方面起着越来越大的作用。

   人工神经网络中最基本的模型是神经元模型,每个神经元与其它神经元相连,当它接受到的点位值高于它的阈值时它就会产生“兴奋”,即向相连的神经元发送信号。人工神经网络中的神经元即从生物神经元中抽象出来,作为一个接受多个参数的激活函数,而其函数值则作为神经元的输出。目前被广为采用的神经元模型是由心理学家McCulloch和数学家Pitts在1943年提出的阈值加权模型,简称MP模型。它接受多个参数的输入,在经过简单的线性运算后作为激活函数的加权输入值。而常见的激活函数有阶跃函数(y = sgn(x))和Sigmoid函数(y = 1/(1+exp(-x)))。前者是最为理想的激活函数,但它并不连续也不光滑,给研究带来诸多困扰。后者则是典型的激活函数,它连续且处处可导,而它也是本文中将要采用的激活函数。多个这样的神经元按一定的层次连接起来,就形成了神经网络。

   BP算法则由Rumelhart,Hinton和Williams在1986年提出,通常称为反向传播算法(back-propagation algorithm)。它是一种被广泛采用的训练神经网络的算法,基于梯度最速下降和delta法则。它主要思想即信号的正向传播与误差的反向传播。正向传播时,样本作为输入层的输入,经隐层传导后进入输出层处理输出。若输出层的输出结果与期望不符或者不满足误差的要求,接下来则进入误差的反馈阶段。误差反馈即将输出误差通过某种方式从输出层反向传导,各层根据接收的误差值进行调整以符合要求。经过反复迭代后最终达到期望要求。

BP算法可以根据模型参数的不同可以锁定极小值,稳定预测网络的准确性,为多层神经网络的实现与应用提供了有力支持。















#define INPUTDIMENSION(28*28)
#define HIDDENDIMENSION 15
#define OUTPUTDIMENSION 10
#define STUDYRATE0.05
double weightInHiddenLayer[HIDDENDIMENSION + 1][INPUTDIMENSION + 1];
double weightInOutLayer[OUTPUTDIMENSION + 1][HIDDENDIMENSION + 1];
double baisInHiddenLayer[HIDDENDIMENSION + 1];
double baisInOutLayer[OUTPUTDIMENSION + 1];
double outputInHiddenLayer[HIDDENDIMENSION + 1];
double outputInOutLayer[OUTPUTDIMENSION + 1];
double deltaInHiddenLayer[HIDDENDIMENSION + 1];
double deltaInOutLayer[OUTPUTDIMENSION + 1];


void train(dataset& s);//训练
void initialize();//初始化各数组
void forward(vector& v);//信号向前传播
void backprop(int expect);//误差向后传播
void updateWeightAndBais(vector& v);//更新权值与偏移量
double sigmoid(double x);//sigmoid函数
int assumpt(vector& v);//根据输入给出既有模型下的输出
double getError(int expOutput);//计算方差

void forward(vector& v)
{
for (int i = 1; i <= HIDDENDIMENSION; ++i)
{
double sum = 0;
for (unsigned int j = 1; j sum += weightInHiddenLayer[i][j] * v[j];
sum -= baisInHiddenLayer[i];
outputInHiddenLayer[i] = sigmoid(sum);
}
for (int i = 1; i <= OUTPUTDIMENSION; ++i)
{
double sum = 0;
for (int j = 1; j <= HIDDENDIMENSION; ++j)
sum += outputInHiddenLayer[j] * weightInOutLayer[i][j];
sum -= baisInOutLayer[i];
outputInOutLayer[i] = sigmoid(sum);
}
}

void backprop(int expect)
{
for (int i = 1; i <= OUTPUTDIMENSION; ++i)
{
deltaInOutLayer[i] = ((i - 1) == expect ? 0.9 : 0.1) - outputInOutLayer[i];
deltaInOutLayer[i] *= (1.0 - outputInOutLayer[i])*outputInOutLayer[i];
}
for (int i = 1; i <= HIDDENDIMENSION; ++i)
{
double sum = 0;
for (int j = 1; j <= OUTPUTDIMENSION; ++j)
sum += deltaInOutLayer[j] * weightInOutLayer[j][i];
sum *= (1.0 - outputInHiddenLayer[i])*outputInHiddenLayer[i];
deltaInHiddenLayer[i] = sum;
}
}

void updateWeightAndBais(vector& v)
{
for (int i = 1; i <= HIDDENDIMENSION; ++i)
{
baisInHiddenLayer[i] -= STUDYRATE*deltaInHiddenLayer[i];
for (int j = 1; j <= INPUTDIMENSION; ++j)
weightInHiddenLayer[i][j] += STUDYRATE*deltaInHiddenLayer[i] * v[j];
}
for (int i = 1; i <= OUTPUTDIMENSION; ++i)
{
baisInOutLayer[i] -= STUDYRATE*deltaInOutLayer[i];
for (int j = 1; j <= HIDDENDIMENSION; ++j)
weightInOutLayer[i][j] += STUDYRATE*deltaInOutLayer[i] * outputInHiddenLayer[j];
}
}








推荐阅读
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 本文介绍了在Python张量流中使用make_merged_spec()方法合并设备规格对象的方法和语法,以及参数和返回值的说明,并提供了一个示例代码。 ... [详细]
  • Learning to Paint with Model-based Deep Reinforcement Learning
    本文介绍了一种基于模型的深度强化学习方法,通过结合神经渲染器,教机器像人类画家一样进行绘画。该方法能够生成笔画的坐标点、半径、透明度、颜色值等,以生成类似于给定目标图像的绘画。文章还讨论了该方法面临的挑战,包括绘制纹理丰富的图像等。通过对比实验的结果,作者证明了基于模型的深度强化学习方法相对于基于模型的DDPG和模型无关的DDPG方法的优势。该研究对于深度强化学习在绘画领域的应用具有重要意义。 ... [详细]
  • 在本教程中,我们将看到如何使用FLASK制作第一个用于机器学习模型的RESTAPI。我们将从创建机器学习模型开始。然后,我们将看到使用Flask创建AP ... [详细]
  • Opencv提供了几种分类器,例程里通过字符识别来进行说明的1、支持向量机(SVM):给定训练样本,支持向量机建立一个超平面作为决策平面,使得正例和反例之间的隔离边缘被最大化。函数原型:训练原型cv ... [详细]
  • 人工智能推理能力与假设检验
    最近Google的Deepmind开始研究如何让AI做数学题。这个问题的提出非常有启发,逻辑推理,发现新知识的能力应该是强人工智能出现自我意识之前最需要发展的能力。深度学习目前可以 ... [详细]
  • keras归一化激活函数dropout
    激活函数:1.softmax函数在多分类中常用的激活函数,是基于逻辑回归的,常用在输出一层,将输出压缩在0~1之间,且保证所有元素和为1,表示输入值属于每个输出值的概率大小2、Si ... [详细]
  • 论文阅读:《Bag of Tricks for LongTailed Visual Recognition with Deep Convolutional Neural Networks》
    基于深度卷积神经网络的长尾视觉识别技巧包摘要近年来,挑战性长尾分布上的视觉识别技术取得了很大的进展,主要基于各种复杂的范式(如元学习)。除了这些复杂 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文介绍了贝叶斯垃圾邮件分类的机器学习代码,代码来源于https://www.cnblogs.com/huangyc/p/10327209.html,并对代码进行了简介。朴素贝叶斯分类器训练函数包括求p(Ci)和基于词汇表的p(w|Ci)。 ... [详细]
  • 2017亚马逊人工智能奖公布:他们的AI有什么不同?
    事实上,在我们周围,“人工智能”让一切都变得更“智能”极具讽刺意味。随着人类与机器智能之间的界限变得模糊,我们的世界正在变成一个机器 ... [详细]
  • 都会|可能会_###haohaohao###图神经网络之神器——PyTorch Geometric 上手 & 实战
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了###haohaohao###图神经网络之神器——PyTorchGeometric上手&实战相关的知识,希望对你有一定的参考价值。 ... [详细]
author-avatar
a58224227
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有