深度学习神经网络纯C语言基础版【转】
来源:互联网 发布:淘宝抢红包在哪 编辑:程序博客网 时间:2024/05/16 09:46
来自:http://blog.csdn.net/Calcular/article/details/47031417
/*深度学习神经网络V1.0made by xyt2015/7/23 使用语言:C本程序构建多层矩阵形神经网络多输入单输出学习策略:随机梯度下降激活函数:sigmoid使用前必须用srand((unsigned)time(NULL))取随机映射初始值*/#ifndef _DNN_H#define _DNN_H#include<stdio.h>#include<math.h>#include <stdlib.h>#include <time.h>#define DNN_VEC 8 //输入训练组组数#define DNN_INUM 5 //输入维度double dnn_sig(double in){ //sigmoid函数,此处不可变return 1.0/(1.0+exp(-1.0*in));}struct dnn_cell{ //神经元结构体double w[DNN_INUM];double wb;double in[DNN_INUM];double out;double error;double v;void SetCell_Default(){ //默认初始化,权值初始化很小int i;for(i=0;i<DNN_INUM;i++){w[i]=0.000001;}wb=0.000001;v=0.001;}void SetCell_InitWeight(double Initial){ //权值统一权值初始化int i;for(i=0;i<DNN_INUM;i++){w[i]=Initial;}wb=Initial;v=0.001;}void SetCell_InitAll(double Initial,double InV){ //权值统一初始化,学习速率初始化int i;for(i=0;i<DNN_INUM;i++){w[i]=Initial;}wb=Initial;v=InV;}void SetCell_Precise(double *InW,double InWb,double InV){ //权值精确初始化,学习速率初始化int i;for(i=0;i<DNN_INUM;i++){w[i]=InW[i];}wb=InWb;v=InV;}void SetIn(double *SIn){ //设定神经元输入int i;for(i=0;i<DNN_INUM;i++){in[i]=SIn[i];}}double GetOut(){ //获取、设定神经元输出int i;double sum=0;for(i=0;i<DNN_INUM;i++){sum+=w[i]*in[i];}sum+=wb;out=dnn_sig(sum);return out;}void UpdateWeight(){ //更新神经元权值int i;for(i=0;i<DNN_INUM;i++){w[i]-=v*error*out*(1-out)*in[i];}wb=v*error*out*(1-out);}void SetError(double InErr){ //设定神经元误差传播值error=InErr;}void SetSpeed(double InV){ //设定神经元学习速率v=InV;}};/* 获得前向传播得到的输出值,第一个参数为神经元结构体数组,第二个参数为神经网络层数。具体排列为:前0~DNN_INUM神经元为第一层,后面每DNN_INUM个神经元为一层,依次排列,直至最后一个输出神经元为单独一层,如果层数是4,DNN_INUM=5(5输入)则神经元数量应为(4-1)*5+1=16个。*in参数为输入网络的具有DNN_INUM个数据的数组*/double DNN_Cal(dnn_cell *incell,int deep,double *in) {double out=0;int dd=0,i,j,k,count=0;double tmp[DNN_INUM];for(i=0;i<DNN_INUM;i++) tmp[i]=in[i];for(j=0;j<deep-1;j++){for(i=j*DNN_INUM;i<(j*DNN_INUM+DNN_INUM);i++){incell[i].SetIn(tmp);incell[i].GetOut();count++;}k=0;for(i=j*DNN_INUM;i<(j*DNN_INUM+DNN_INUM);i++) {tmp[k]=incell[i].out; k++;}}incell[count].SetIn(tmp);out=incell[count].GetOut();return out;}/* 对输入矩阵训练,最后得到更新的神经网络,要求每组数据量限定为DNN_INUM数据组数限定为DNN_VEC输入神经原组为按层排列,除了最后一层的节点数为一其他节点数都限定为输入向量DNN_INUMdeep为网络层数至少2层,算上最后输出层,n为训练次数,expect为期望,返回训练后平均误差*/double DNN_Train(dnn_cell *cell,int deep,double InMat[DNN_VEC][DNN_INUM],double *expect,int n) {double out,devi,sum;double de[DNN_VEC];int co=n,kp=-1;int i,j,k,tt,l;for(i=0;i<DNN_VEC;i++) de[i]=9.9;while(co--){kp=(int)(rand()*(double)(DNN_VEC)/RAND_MAX);out=DNN_Cal(cell,deep,InMat[kp]);devi=out-expect[kp];de[kp]=devi;//printf("%lf %lf %lf %d\n",fabs(de[0]),fabs(de[3]),fabs(de[7]),kp);tt=(deep-1)*DNN_INUM;cell[tt].error=devi;l=0;for(i=(deep-2)*DNN_INUM;i<tt;i++) {cell[i].error=cell[tt].error*cell[tt].out*(1-cell[tt].out)*cell[tt].w[l];l++;}for(j=deep-2;j>0;j--){l=0;for(i=(j-1)*DNN_INUM;i<j*DNN_INUM;i++){sum=0;for(k=j*DNN_INUM;k<(j+1)*DNN_INUM;k++){sum+=cell[k].error*cell[k].out*(1-cell[k].out)*cell[k].w[l];}cell[i].error=sum;l++;}}for(i=0;i<=(deep-1)*DNN_INUM;i++){cell[i].UpdateWeight();}//变学习速率,可以自行更改===============================for(i=0;i<=(deep-1)*DNN_INUM;i++){cell[i].SetSpeed(fabs(devi));}//=======================================================}sum=0;for(i=0;i<DNN_VEC;i++) sum+=fabs(de[i]);return sum/DNN_VEC;}#endif
0 0
- 深度学习神经网络纯C语言基础版【转】
- 深度学习神经网络纯C语言基础版
- 深度学习神经网络纯C语言基础版
- 深度学习:卷积神经网络基础
- 深度学习基础(一)神经网络
- 深度学习基础1(神经网络)
- [深度学习基础] 3. 前馈神经网络
- [深度学习基础] 4. 卷积神经网络
- 深度学习:自编码器、神经网络基础
- [深度学习基础] 4. 卷积神经网络
- [深度学习基础] 3. 前馈神经网络
- 深度学习基础——神经网络起步
- 深度学习Day2(神经网络的基础编程)
- c语言深度学习
- [DeeplearningAI笔记]神经网络与深度学习2.1-2.4神经网络基础
- 吴恩达 神经网络和深度学习 第二周神经网络基础笔记
- 神经网络与深度学习(二)cpp-c++BP神经网络
- 吴恩达深度学习入门学习笔记之神经网络和深度学习(第二周:神经网络基础)
- 威佐夫博弈各大博客总结
- JDK、JRE、JVM的区别
- 带落角约束(变结构和比例)源代码
- 休闲小趣一一3Dmax“简易教程”一一1.1界面构成
- 并查集模板及对应模板题
- 深度学习神经网络纯C语言基础版【转】
- Android adb篇-2016/10/14
- apache2.4配置虚拟目录和虚拟主机
- C++模拟打印日历
- 【字符串系列】最长公共子序列(LCS)
- 攻击时间控制的动态逆三维制导律源代码
- Memcached分布式布置方案--一致性Hash分布机制及其改进
- 渲染流水线
- python小练习3:给定一个数,判断其是否为素数