网络训练 这个部分比较简单,用的单S激活函数,mse能到的最小值有限,后来试了下双S激活函数,mse可以很小。不过实际测试时单S激活函数的识别率已经够用了 - input=input';
- net = newff( minmax(input) , [mid_layer,output_layer] , { 'logsig' 'logsig' } ,'traingdx') ;
- net.trainparam.show = 50 ;
- net.trainparam.epochs = 500 ;
- net.trainparam.goal = 0.00001 ;
- net.trainParam.lr = 0.001 ;
网络导出- w_i2l=net.IW{1,1};%输入层到中间层的权值
- b_i2l=net.b{1,1};%输入层到中间层的阈值
- w_l2o=net.LW{2,1};%中间层到输出层的权值
- b_l2o=net.b{2,1};%中间层到输出层的阈值
- % 导出函数 start
- ...
- % 导出函数 end
单片机上网络计算函数
- void layer_to_layer(
- int lin_num,
- int lout_num,
- float32_t* input,
- float32_t* output,
- float32_t* w,
- float32_t* b
- )
- {
- float32_t *temp;
- memset(output, 0,
- lout_num * sizeof(float32_t));
- temp = (float32_t *)malloc(lin_num * sizeof(float32_t));
- for (int i=0;i<lout_num;i++)
- {
- #ifdef ARM_M4
- arm_mult_f32(input,w+i*lin_num,temp,lin_num); //CMSIS-DSP库 向量相乘
- #else
- for (int i=0;i<lin_num;i++) //非DSP指令
- {
- *(temp+i)=*(input)*(*(w+i*lin_num))
- }
- #endif
- for (int j=0;j<lin_num;j++)
- {
- *(output+i)=*(output+i)+*(temp+j);
- }
- *(output+i)=*(output+i)+*(b+i);
- *(output+i)=logsig_fun(*(output+i));
- }
- free(temp);
- }
CMSIS-DSP库上的说明和例子都很详细
|