代码拉取完成,页面将自动刷新
/**
******************************************************************************
* @file main.c
* @author 古么宁
* @brief 两层隐含层 bp 神经网络
* 使用方法:
* 1. BPNN_CREATE(NAME,INN,OUTN,LY1NN,LY2NN) ;创建一个神经网络
* 2. struct bpnntrain bptrcfg; 定义训练参数
* 3. bpnn_init(NAME);对神经网络的内存进行初始化
* 4. bpnn_train(&bpnn,&traincfg,sample_in,sample_out,size);用样点训练神经网络
* 5. bpnn_calulate() ;用此函数进行计算预测
* <注:此文件用到变长数组,要C99以上或GNUC版本编译器支持>
******************************************************************************
*
* COPYRIGHT(c) 2018 GoodMorning
*
******************************************************************************
*/
/* Includes ---------------------------------------------------*/
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
#include "bpNeuralNetwork2.h"
#define NetIn 2 //两个输入
#define NetOut 1 //输出端个数,此处可以改为 2 作多输出 demo
#define Layer1NeuronNum 30
#define Layer2NeuronNum 30
//测试曲面 x*x - y*y/5 为马鞍面
#define CurveRz(x,y) (x*x - y*y/5) //(x*y+1) // (x + y)////
#define CurveRs(x,y) (x*2 + 3*y)
#define SampleScaleXnum 15 //在 x 轴取 SampleScaleXnum 个刻度值
#define SampleScaleYnum 15 //在 y 轴取 SampleScaleYnum 个刻度值
#define SampleSize (SampleScaleXnum * SampleScaleYnum) //样点个数,取样方式可以用随机数的方式,这里选用固定 x 、y 以网格状取点
#define SampleScaleXs 0.0
#define SampleScaleXe 20.0 // x 向范围为 0 - 20 ,分为 SampleScaleXnum 个刻度值
#define SampleScaleYs 0.0
#define SampleScaleYe 20.0 // y 向范围为 0 - 20 ,分为 SampleScaleYnum 个刻度值
BPNN_CREATE(demobpnn,NetIn,NetOut,Layer1NeuronNum,Layer2NeuronNum) ;
struct bpnntrain bptrcfg =
{
// 最大训练次数
.maxt = 40000,
// 学习结束界限
.limit = SampleSize * 0.1 ,
//各层学习速率因子
.ly1WiA = 0.4 ,
.ly1WiB = 0.15 ,
.ly1WoA = 0.4 ,
.ly1WoB = 0.15 ,
.ly2WoA = 0.4 ,
.ly2WoB = 0.15
};
double samplein[SampleSize][NetIn];//样点输入
double sampleout[SampleSize][NetOut];//样点输出
void sample_init(void)//初始化训练样点
{
int iCntx = 0;
int iCnty = 0;
int iIndex = 0;
double dSampleX = SampleScaleXs;
double dSampleY = SampleScaleYs;
double dSampleX_d = SampleScaleXe - SampleScaleXs;
double dSampleY_d = SampleScaleYe - SampleScaleYs;
double dStepX = dSampleX_d / (SampleScaleXnum - 1);
double dStepY = dSampleY_d / (SampleScaleYnum - 1);
for (iCnty = 0; iCnty < SampleScaleYnum; iCnty++) //初始化样点,网格状取样点
{
dSampleX = SampleScaleXs;
for (iCntx = 0; iCntx < SampleScaleXnum; iCntx++)
{
samplein[iIndex][0] = dSampleX; //先初始化 (x,y) 向量的 x
samplein[iIndex][1] = dSampleY; //固定 (x,y) 的 y 不变
sampleout[iIndex][0] = CurveRz(dSampleX,dSampleY);
#if (2 == NetOut) //多输出 demo
sampleout[iIndex][1] = CurveRs(dSampleX,dSampleY);
#endif
iIndex++;
dSampleX += dStepX;
}
dSampleY += dStepY;
}
}
int main(void)
{
double netin[NetIn];
double netout[NetOut];
sample_init();//初始化样点
//初始化神经网络内存
bpnn_init(&demobpnn);
// 用样点训练 demobpnn 神经网络
bpnn_train(&demobpnn , &bptrcfg , samplein , sampleout , SampleSize);
while (1) // 输入两个数字测试神经网络效果
{
printf("\r\n(%f< x <%f)(%f < y < %f)\r\nplease input x y:",SampleScaleXs,SampleScaleXe,SampleScaleYs,SampleScaleYe);
scanf("%lf %lf", &netin[0], &netin[1]);
bpnn_calculate(&demobpnn ,netin,netout);
#if (1 == NetOut) //单输出 demo
printf("rbfnn:%f\n", netout[0]);
printf(" Rz :%f\n", CurveRz(netin[0], netin[1]));
#else //多输出 demo
printf("rbfnn:%f,%f\n", netout[0], netout[1]);
printf("Rz,Rs:%f,%f\n", CurveRz(netin[0], netin[1]), CurveRs(netin[0], netin[1]));
#endif
}
return 0;
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。