人工智能之BP人工神经网络C语言实现内附实现代码
原文: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语言实现内附实现代码相关推荐
- 【五】 C语言基础知识学习回顾 | 一篇搞定C语言基础 | 内附详细代码以及注释
一 .C语言学习第一天 1.1 编写C语言代码:hello.c #include<stdio.h> #include<stdlib.h> //调用system系统函数需要包含的 ...
- 基于BP人工神经网络的手写英文字符识别
0 前言 基于Matlab-R2009a实现BP神经网络来训练和识别26个英文字母. 1 程序 alphabet_train.m如下所示: clear clc [alphabet,targets]=p ...
- BP人工神经网络案例
#BP人工神经网络实现 #1.读取数据 #2.导入keras.models Sequential /keras.layers.core Dense,Activation #3.Squential 建立 ...
- 人工智能导论(7)——人工神经网络(Machine Learning)
文章目录 一. 概述 二. 重点内容 三. 思维导图 四. 重点知识笔记 概述 1. 神经元模型 2. 单层感知机 3. 多层感知机 4. BP误差逆传播算法 5. 深度神经网络简介 5.1 卷积神经 ...
- BP人工神经网络的介绍与实现
神经网络概念与适合领域 神经网络最早的研究是 40 年代心理学家 Mcculloch 和数学家 Pitts 合作提出的 ,他们提出的MP模型拉开了神经网络研究的序幕. 神经网络的发展大致经过 3 个阶 ...
- 用BP人工神经网络识别手写数字——《Python也可以》之三
赖勇浩(http://laiyonghao.com) 这是我读工程硕士的时候完成课程作业时做的,放在 dropbox 的角落中生尘已经有若干年头了,最近 @shugelee 同学突然来了兴致搞验证码识 ...
- 看懂自适应模糊神经网络(ANFIS)并附ANFIS代码
ANFIS (Adaptive-Network-Based Fuzzy Inference System)--自适应模糊神经网络,最早于1993年由Jyh-Shing Roger Jang提出.采用模 ...
- php实现人工神经网络算法,BP人工神经网络实现
我给你发一个实例 你可以学习一下 采用Matlab工具箱函数建立神经网络,对一些基本的神经网络参数进行了说明,深入了解参考Matlab帮助文档. % 例1 采用动量梯度下降算法训练 BP 网络. % ...
- 【语音识别】基于BP神经网络实现语音特征信号分类附matlab代码
✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信.
最新文章
- 第十六届全国大学生智能车竞赛赛题规划
- 花40分钟写一个-CBIR引擎-代码公开
- 是否是一个新的机会?
- cmd命令启动mysql服务
- Ubuntu 9.04下安装source navigator---linux下看代码工具
- 音视频技术开发周刊 | 165
- 如何取消IE“已限制此网页运行可以访问计算机的脚本或ActiveX控件”(小技巧)...
- linux之systemctl设置自定义服务
- linux系统扩展名大全,Linux系统文件扩展名学习
- TensorFlow 2.0 - tf.data.Dataset 数据预处理 猫狗分类
- POJ 3111 K Best 贪心 二分
- FileZilla Server图文安装教程
- Error while building/deploying project QTtest (kit: Desktop Qt 5.9.0 MinGW 32bit)When executing~
- linux awk比较大小,linux基础只是之awk命令使用,统计最大长度
- BUUCTF之Ping Ping Ping
- 解决JupyterLab或者Jupyter Notebook无法跳转到浏览器的问题
- 深入探究js中无所不在的this
- PrintDocument打印、预览、打印机设置和打印属性的方法(较完整)
- 自动驾驶-第10届蓝桥杯Scratch省赛真题第5题
- python画名侦探柯南_【儿童节特辑】风格迁移——让你的照片秒变手绘日漫风