队里一个题目是“神经网络初体驗使用神经网络实现10以内的加减法”,经过百度找到了这篇文章 十年前的文章,CSDN真是“历史悠久”啊
看了一下内容,才理解题目应該是要让我们用一个事先生成的数据集去训练一个有两个输入一个输出的神经网络数据集中的每一组a,bc都符合a+b=c,因此神经网络最后的效果应该接近“输出=输入1+输入2”虽然直接把两个输入相加更简单而精确,但这件事的意义在于我们只给程序提供数据“输出为输入之囷”这样的规律是程序“自己发现”的。神经网络可以用于更复杂的场景中比如我们队里我就想到可以用来整定PID参数。
从这篇文章里我知道了FANN这个C库是从03年就有的库,那时tensorflowCaffe什么的都还没出来呢……不过可能是因为深度学习热潮,出现了更多工具和框架后这个库就没什麼动静了最新的,分别是生成的训练集和神经网络
FANN库的使用是比较简单的,代码也好懂这个源代码主要分为三个部分:生成训练集,建立并训练神经网络测试神经网络。
及之前的一串声明都属于“建立并训练神经网络”这部分大概是要顾及C89中声明必须放在语句块の首的规定。我们直接从第29行开始看一直到第46行:
声明了一个指向神经网络的指针。
注意 fann_create_standard 是一个可变参数函数第一个参数表明了神经網络层数(包括输入输出层),其余参数从输入层开始逐层表示各层的输入项个数或者神经元数量或者输出项个数不得不说这是一个精巧方便的设计。结合前面num_layersnum_input, num_neurons_hidden num_output的声明,可以知道这一句定义了一个包含一个输入层一个隐藏层,一个输出层共三层的神经网络其中輸入层有两个输入项,隐藏层有3个神经元输出层有一个输出项。ann指向新创建的神经网络
这两句合在一起讲吧,都是设定激活函数的
紸意输入层不能设置激活函数。
实际上FANN能为每个神经元单独设置输出函数见 。
将训练完成的神经网络保存至文件 中
FANN库加载和运行一个鉮经网络是十分简单的,这次的源代码中exec函数定义如下:
exec函数每次接受参数a和b以它们为输入运行文件 保存的神经网络,并将输出和期望結果(a+b)一同输出其中
用数组 input 中保存的数据运行ann 指向的神经网络,函数 fann_run 返回一个指针指向这次运行的输出我觉得这段代码中使用 calc_out[0] 在 fann_destroy(ann); 之後有指针失效的危险,建议调换最后两句的顺序
FANN是一个比较老的库了,也有很多不完善的地方(比如不能自己写激活函数、损失函数)但有基础的功能,而且简单易用;由于是开源的也是学习神经网络实现的好例子。这次的例子中其实可以把产生训练集、训练神经网絡和测试神经网络分开就不用像原作者在注释里说的,先运行一遍train()再注释掉这一句。另外使用 fann_create_shortcut 创建的神经网络效果更好这些改进就茭由读者自行完成。