1 Star 1 Fork 0

GoodMorning/rbfneuralnetwork

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
main.c 3.78 KB
一键复制 编辑 原始数据 按行查看 历史
GoodMorning 提交于 2018-12-29 20:28 . modify some function name
/**
******************************************************************************
* @file main.c
* @author 古么宁
* @brief 径向基 rbf 神经网络测试函数
* 使用方法:
* 1. RBFNN_CREATE(NAME,INN,OUTN,NRNN) ;创建一个神经网络
* 2. struct rbfnntrain rbftrcfg; 定义训练参数
* 3. rbfnn_init(&rbfnn);对神经网络的内存进行初始化
* 4. rbfnn_train(&rbfnn,&traincfg,sample_in,sample_out,size);用样点训练神经网络
* 5. rbfnn_calculate() ;用此函数进行计算预测
* <注:此文件用到变长数组,要C99以上或GNUC版本编译器支持>
******************************************************************************
*
* COPYRIGHT(c) 2018 GoodMorning
*
******************************************************************************
*/
/* Includes ---------------------------------------------------*/
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
#include "rbfNeuralNetwork.h"
#define NetIn 2 //两个输入
#define NetOut 1 //输出端个数,此处可以改为 2 作多输出 demo
#define NeuronNum 60 //神经元个数
//测试曲面 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 个刻度值
//样点个数,取样方式可以用随机数的方式,这里选用固定 x 、y 以网格状取点
#define SampleSize (SampleScaleXnum * SampleScaleYnum)
#define SampleScaleXs 0.0
#define SampleScaleXe 20.0 // x 向范围为 0 - 20 ,分为 SampleScaleXnum 个刻度值
#define SampleScaleYs 0.0
#define SampleScaleYe 20.0 // y 向范围为 0 - 20 ,分为 SampleScaleYnum 个刻度值
//1.创建一个神经网络
RBFNN_CREATE(demorbfnn,NetIn,NetOut,NeuronNum) ;
//2.定义训练参数
struct rbfnntrain rbftrcfg =
{
// 最大训练次数
.maxt = 40000,
// 学习结束界限,总误差方差
.limit = SampleSize * 0.1 ,
//学习速率因子
.eta = 0.0001 ,
};
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();//初始化样点
// 3.对神经网络的内存进行初始化
rbfnn_init(&demorbfnn);
// 4.用样点训练 demorbfnn 神经网络
rbfnn_train(&demorbfnn , &rbftrcfg , 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]);
rbfnn_calculate(&demorbfnn ,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;
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/somebug/rbfneuralnetwork.git
[email protected]:somebug/rbfneuralnetwork.git
somebug
rbfneuralnetwork
rbfneuralnetwork
master

搜索帮助