原文:https://www.shanyemangfu.com/bp-c.html

人工智能现在还是十分火热。说到人工智能,那就必须提到AlphaGo的事情。这样就可以引出神经网络了。BP神经网络是最简单的也是最早的人工神经网络,这是最基本的网络,以后所有的网络都是以此改进而来。当然学习神经网络要从学习BP的原理学起。

正好有个课程报告,让实现BP人工神经网络。大部分同学们都是使用的Python。但是不知道我怎么产生了可怕的想法,非得要使用C语言搞一波。当然一般情况,网上有的话就不重复造轮子了。但是我百度了很多,都是把网络写死了,根本没有办法扩展。不符合我的需求,于是我就产生了用C语言一个可以拓展的BP神经网络的想法。说干就干,但是现实没有那么好办。我前后写了三版。一开始使用随机梯度下降法,而且没有加上偏置。后来想使用批量梯度下降法,加上偏置。但是批量也挺麻烦,转头一想,为什么不使用小批量梯度下降呢。因为这个工程量差不多。于是最终第三版,写成了一个小批量梯度下降法的BP。

至于原理和公式推导什么的,我就不放了。因为实在太麻烦了。但是如果你不懂原理的话,或者想要推导过程。这儿推荐一个大佬写的文章,非常详细。这个程序也是根据这篇文章编写的。 https://blog.csdn.net/u014303046/article/details/78200010/

然后再说下程序出现的问题吧。

1.我本来想加上批规范化的。就是Batch Normalization。可以把每一层的输出搞到同一个分布。但是技术有限,感觉太难写了,懒得动弹就没写。以后有时间再说吧。

2.程序也添加了relu激活函数,但是效果不好,很多时候无法收敛,根本达不到想象中relu激活函数的优化效果。我暂时没找到原因。有时间再调试吧。

3.样本数大的时候,容易发生梯度消失,误差小到一定程度就不再降低。

4.用了c++的一些语法,比cout,因为写着方便。

5.其他的基本都写到注释里了,不懂再在评论区问吧。

/*
Author:山野莽夫
Web:https://www.shanyemangfu.com
version:3.0
*/
#include <iostream>
#include<math.h>
#include<fstream>
#include<algorithm>
#include<ctime>
#include <iomanip>
using namespace std;
//定义函数
double f(double x, int kind);//激活函数
double df(double x, int kind);//激活函数的导数
void readdata();//读取数据
void initial();//初始化
void save();//保存模型
void load();//加载模型
void normalall();//全部数据归一化
bool dobatchtrain(int traintime, double acc, int& times);//
double batchtrain(); //小批量随机梯度下降,单次更新
void batchpos(int begin, int batchsize);//小批量正向计算
void batchnega(int begin, int batchsize);//小批量反向更新
void btest();//测试
//参数
constexpr int hidenum = 2;//隐藏层层数;
constexpr int num[hidenum + 1 + 1 + 1] = { 5,4,5,5,3 };//各层神经元个数0位置存储最大值
constexpr double e = 2.718281828459;
constexpr int tnum = 150;//训练样本数目
constexpr double tau = 0.001;//学习率
constexpr int trainnum = 90;//训练样本数目
constexpr int batchsize = 10;//批大小,要设置为可以被样本数目整除,虽说可以代码处理,但是懒得处理。
//变量
double x[num[1] + 1][tnum + 1];//输入
double y[num[hidenum + 2] + 1][tnum + 1];//期望输出
double nmx[num[1] + 1][tnum + 1];//归一化后的输入
double nmy[num[hidenum + 2] + 1][tnum + 1];//归一化后的期望输出
double w[hidenum + 2][num[0] + 1][num[0] + 1];//层数/k层顺序/k-1层顺序  |权重
double bb[hidenum + 2 + 1][num[0] + 1];//偏置
double bd[hidenum + 2 + 1][num[0] + 1][batchsize + 1];//误差
double by[num[hidenum + 2] + 1][batchsize + 1];//预测输出值
double bz[hidenum + 2 + 1][num[0] + 1][batchsize + 1];//净输出
double ba[hidenum + 2 + 1][num[0] + 1][batchsize + 1];//输出

完整代码请前往:https://www.shanyemangfu.com/bp-c.html

人工智能之BP人工神经网络C语言实现内附实现代码相关推荐

  1. 【五】 C语言基础知识学习回顾 | 一篇搞定C语言基础 | 内附详细代码以及注释

    一 .C语言学习第一天 1.1 编写C语言代码:hello.c #include<stdio.h> #include<stdlib.h> //调用system系统函数需要包含的 ...

  2. 基于BP人工神经网络的手写英文字符识别

    0 前言 基于Matlab-R2009a实现BP神经网络来训练和识别26个英文字母. 1 程序 alphabet_train.m如下所示: clear clc [alphabet,targets]=p ...

  3. BP人工神经网络案例

    #BP人工神经网络实现 #1.读取数据 #2.导入keras.models Sequential /keras.layers.core Dense,Activation #3.Squential 建立 ...

  4. 人工智能导论(7)——人工神经网络(Machine Learning)

    文章目录 一. 概述 二. 重点内容 三. 思维导图 四. 重点知识笔记 概述 1. 神经元模型 2. 单层感知机 3. 多层感知机 4. BP误差逆传播算法 5. 深度神经网络简介 5.1 卷积神经 ...

  5. BP人工神经网络的介绍与实现

    神经网络概念与适合领域 神经网络最早的研究是 40 年代心理学家 Mcculloch 和数学家 Pitts 合作提出的 ,他们提出的MP模型拉开了神经网络研究的序幕. 神经网络的发展大致经过 3 个阶 ...

  6. 用BP人工神经网络识别手写数字——《Python也可以》之三

    赖勇浩(http://laiyonghao.com) 这是我读工程硕士的时候完成课程作业时做的,放在 dropbox 的角落中生尘已经有若干年头了,最近 @shugelee 同学突然来了兴致搞验证码识 ...

  7. 看懂自适应模糊神经网络(ANFIS)并附ANFIS代码

    ANFIS (Adaptive-Network-Based Fuzzy Inference System)--自适应模糊神经网络,最早于1993年由Jyh-Shing Roger Jang提出.采用模 ...

  8. php实现人工神经网络算法,BP人工神经网络实现

    我给你发一个实例 你可以学习一下 采用Matlab工具箱函数建立神经网络,对一些基本的神经网络参数进行了说明,深入了解参考Matlab帮助文档. % 例1 采用动量梯度下降算法训练 BP 网络.  % ...

  9. 【语音识别】基于BP神经网络实现语音特征信号分类附matlab代码

    ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信.

最新文章

  1. 第十六届全国大学生智能车竞赛赛题规划
  2. 花40分钟写一个-CBIR引擎-代码公开
  3. 是否是一个新的机会?
  4. cmd命令启动mysql服务
  5. Ubuntu 9.04下安装source navigator---linux下看代码工具
  6. 音视频技术开发周刊 | 165
  7. 如何取消IE“已限制此网页运行可以访问计算机的脚本或ActiveX控件”(小技巧)...
  8. linux之systemctl设置自定义服务
  9. linux系统扩展名大全,Linux系统文件扩展名学习
  10. TensorFlow 2.0 - tf.data.Dataset 数据预处理 猫狗分类
  11. POJ 3111 K Best 贪心 二分
  12. FileZilla Server图文安装教程
  13. Error while building/deploying project QTtest (kit: Desktop Qt 5.9.0 MinGW 32bit)When executing~
  14. linux awk比较大小,linux基础只是之awk命令使用,统计最大长度
  15. BUUCTF之Ping Ping Ping
  16. 解决JupyterLab或者Jupyter Notebook无法跳转到浏览器的问题
  17. 深入探究js中无所不在的this
  18. PrintDocument打印、预览、打印机设置和打印属性的方法(较完整)
  19. 自动驾驶-第10届蓝桥杯Scratch省赛真题第5题
  20. python画名侦探柯南_【儿童节特辑】风格迁移——让你的照片秒变手绘日漫风

热门文章

  1. 如何判断页面是通过PC端还是移动端访问?
  2. 倩女幽魂手游服务器维护时间表,《倩女幽魂》手游8月4日服务器在线维护公告...
  3. T100 GR凭证报表开发
  4. UBUNTU zip 解压文件方法
  5. 2020计算机自考本科英语二,2020年自考本科英语二模拟练习题(完整版)
  6. C语言改变封闭图形颜色,LBM的封闭方腔自然对流新手代码求修改
  7. Pvtrace使用追踪软件gzip
  8. jiankunking的个人简介
  9. StringBoot(多数据源的使用)
  10. Virtual Serial Port Driver PRO使用