BP神经网络– C语言实现 下

上一篇 C语言实现上 中介绍了程序实现时定义的一些数据结构、程序执行的流程以及 程序的基本骨架(详情见 C语言实现上)。留下了两个关键函数computO(i) 和 backUpdate(i) 没有分析实现,参数 i 代表的是第 i 个样本,本篇我们一起来分析下这两个函数的实现。

BP神经网络输出

函数 computO(i) 负责的是通过BP神经网络的机制对样本 i 的输入,预测其输出。回想BP神经网络的基本模型(详情见 基本模型)对应的公式(1)还有 激活函数对应的公式(2):

BP神经网络-- C语言实现 下

BP神经网络-- C语言实现 下

在前篇设计的BP神经网络中,输入层与隐藏层权重对应的数据结构是w[Neuron][In],隐藏层与输出层权重对应的数据结构是v[Out][Neuron],并且数组 o[Neuron] 记录的是神经元通过激活函数对外的输出,BP神经网络预测的样本结果保存在OutputData[Out]中。由此,就可以得到以下实现的参考代码:

void computO(int var){

    int i,j;
    double sum,y;

        /*
            神经元输出
         */

        for (i = 0; i < Neuron; ++i){
        sum=0;
        for (j = 0; j < In; ++j)
            sum+=w[i][j]*d_in[var][j];
        o[i]=1/(1+exp(-1*sum));
    }

/*  隐藏层到输出层输出 */

    for (i = 0; i < Out; ++i){
        sum=0;
        for (j = 0; j < Neuron; ++j)
            sum+=v[i][j]*o[j];

        OutputData[i]=sum;
    }
}

BP神经网络的反馈学习

函数 backUpdate(i) 负责的是将预测输出的结果与样本真实的结果进行比对,然后对神经网络中涉及到的权重进行修正,也这是BP神经网络实现的关键所在。如何求到对于 w[Neuron][In] 和 v[Out][Neuron] 进行修正的误差量便是 关键所在!误差修正量的求法在基本模型一文中数学分析部分有解答, 具体问题具体分析,落实到我们设计的这个BP神经网络上来说,需要得到的是对w[Neuron][In] 和 v[Out][Neuron] 两个数据进行修正误差,误差量用数据结构 dw[Neuron][In] 和 dv[Out][Neuron] 来进行存储。那么来分析下这两个修正误差量是什么样的?推导的思路与基本模型中推导误差量的一致,这里仅列出对具体对于我们设计的BP神经网络中的数学推导过程:

BP神经网络-- C语言实现 下

如果你不想知道推导过程,那么只需要看上面中的两个 所以(有三个点的地方) 的内容,就可以知道所需要的误差量是什么样的了;如果想要想弄明白的话,或许需要自己在稿子上画画看推导推导。到这里完成了数学推导,实现的代码就很容易写了。在具体实现对误差修改中,我们再加上学习率,并且对先前学习到的修正误差量进行继承,直白的说就是都乘上一个0到1之间的数,具体的见如下实现参考代码:

#define A  0.2
#define B  0.4
#define a  0.2
#define b  0.3
void backUpdate(int var)
{
    int i,j;
    double t;
    for (i = 0; i < Neuron; ++i)
    {
        t=0;
        for (j = 0; j < Out; ++j){
            t+=(OutputData[j]-d_out[var][j])*v[j][i];

            dv[j][i]=A*dv[j][i]+B*(OutputData[j]-d_out[var][j])*o[i];
            v[j][i]-=dv[j][i];
        }

        for (j = 0; j < In; ++j){
            dw[i][j]=a*dw[i][j]+b*t*o[i]*(1-o[i])*d_in[var][j];
            w[i][j]-=dw[i][j];
        }
    }
}

好了,至此BP神经网络的C语言实现就全部完成了。最后,我们可以测试下BP神经网络的运行。我这里是这样给出数据的,两个输入a、b(10以内的数),一个输出 c,c=a+b。换句话说就是教BP神经网络加法运算。在 45个神经元,820个训练样例,样本平均误差小于0.01时完成训练(学习率等见参考代码)的条件下,最后预测 (6,8),(2.1,7),(4.3,8)实际输出结果如下:

BP神经网络-- C语言实现 下

最后附上参考实现代码,以及实验训练时的数据、和神经元信息。(本示例 仅为BP神经网络实现的 简单DEMO,若实际使用还需多加考虑!!!)

参考代码下载

Original: https://www.cnblogs.com/jzhlin/archive/2012/08/01/bp_c2.html
Author: Java研究者
Title: BP神经网络– C语言实现 下

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/615541/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 对象存储

    注意事项:如果文件类型是图片,则使用MultipartFile类的对象,如MultipartFile file(比较推荐) 适用于流式文件传输,在上传图片,音/视频,文档等,都可采…

    Java 2023年6月13日
    088
  • vue路由守卫用于登录验证权限拦截

    vue路由守卫用于登录验证权限拦截 to:进入到哪个路由去 from:从哪个路由离开 next:路由的控制参数,常用的有next(true)和next(false) home需要判…

    Java 2023年6月15日
    071
  • 【Elasticsearch】查询并删除匹配文档之_delete_by_query

    思路:先查询确认,后精准删除 假设我想删除title是”小明今晚真的不加班”这条记录,先查看一下现有的记录: (不加班不好吗?为什么要删除呢?) tips:…

    Java 2023年6月13日
    061
  • session 控制单点登录

    在我登录成功之后,我会 session.setAttribute("user", userMap);//设置session 所以就写了一个监听器来控制登录的。 …

    Java 2023年5月30日
    078
  • Maven仓库介绍以及私服搭建

    1 什么是Maven? 1.1 Maven的概念 Maven主要服务于基于Java平台的项目构建、依赖管理和项目信息开发,它是一个异常强大的构建工具,能够帮助我们自动化构建过程,从…

    Java 2023年6月6日
    071
  • Error:java: Compilation failed: internal java compiler error 解决办法

    具体参考:Error:java: Compilation failed: internal java compiler error 解决办法 – 程序猿的故事 &#82…

    Java 2023年5月29日
    067
  • Java 将Excel转为UOS

    以.uos为后缀的文件,表示Uniform Office Spreadsheet文件,是一种国产的办公文件格式,该格式以统一办公格式(UOF)创建,使用XML和压缩保存电子表格。既…

    Java 2023年6月7日
    086
  • 设计模式—原型模式

    类型:创建型 目的:通过拷贝快速创建相同或相似对象。 接下来我们看一个需要改进的案例。 优化案例 话不多说,先来看一个创建相同或相似对象的传统写法。 public class De…

    Java 2023年6月7日
    074
  • 分布式任务调度平台XXL-JOB安装及使用

    一、为什么需要任务调度平台 在Java中,传统的定时任务实现方案,比如Timer,Quartz等都或多或少存在一些问题: 不支持集群、不支持统计、没有管理平台、没有失败报警、没有监…

    Java 2023年6月5日
    086
  • 通过调试来理解形参与实参的区别

    刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊过,尤其是遇到形参名和实参名一样时,更加晕头转向,出现一种”是谁把值传给了我,而我又传给了谁”的疑惑…

    Java 2023年6月8日
    090
  • PHP 实现微信红包拆分算法

    php;gutter:true; handle(); * print_r($res); * * @author Flc * @see http://flc.ren | http:/…

    Java 2023年6月7日
    061
  • Nginx 源码分析– ngx_string 的一些简单分析

    对于一个web服务器程序来说,对字符串处理的需求是必须的。由于web环境下的各种编码,也导致了web服务器程序字符串处理的繁杂性。在nginx源码中,ngx_string.c这个文…

    Java 2023年6月15日
    096
  • 练习阅读新闻

    从小到大对新闻不敏感,直到现在复试面试时,老师可能会问到最近的一些热点新闻,才开始关注。可以这么说,我对于世界的认识,还停留在高中的历史课……可见我多么迂腐…

    Java 2023年6月5日
    082
  • 米哈游六月社招火热开启!500+岗位,超多HC,就在这个夏天(附内推方式)

    米哈游最近持续招人,hc多多,整体工作幸福度较高,内推通道随时为你打开,上海疫情刚刚结束,何不选择走动走动? 最近大厂都在裁员,看机会的小伙伴可以考虑下米哈游,这里没有裁员、没有末…

    Java 2023年6月8日
    0103
  • 创建一个springbootcloud项目

    前提软件安装 nacos 服务治理: github下载地址:https://github.com/alibaba/nacos/tags 码云下载地址:https://gitee.c…

    Java 2023年6月9日
    067
  • 【RocketMQ】NameServer的启动

    NameServer是一个注册中心,Broker在启动时向所有的NameServer注册,生产者Producer和消费者Consumer可以从NameServer中获取所有注册的B…

    Java 2023年6月8日
    080
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球