全连接神经网络C语言实现
yummy
阅读:579
2022-03-29 22:05:12
评论:0
首先手写体输入为28*28的图片,所以输入为784个x
输出为识别0-9的数字概率,所以有10个输出
输入只能是-1~1的小数,主要是防止计算溢出
#include "stdio.h" #include "input_0.h" #include "input_1.h" #include "input_2.h" #include "input_3.h" #include "input_4.h" #include "input_5.h" #include "input_6.h" #include "input_7.h" #include "input_8.h" #include "input_9.h" #include "layer1_bais.h" #include "layer1_weight.h" #include "layer2_bais.h" #include "layer2_weight.h" //输入图像数据 28*28 //第一层的神经元64个 ,对应的权重w1:784*64, 由于一个神经元对应一个偏置项 b1:64个 //第二层的神经元10个 ,对应的权重w2:64*10, 由于一个神经元对应一个偏置项 b2:10个 //查询最大概率的结果输出,识别0-9的图片 int predict(float *img ,float *w1,float *b1,float *w2,float *b2) { int i,j,k,temp=0; float y = 0.0; float a1[64]={0},a2[10]={0}; //第一层全连接神经网络 for(j=0;j<64;j++) { y = 0.0; //单个神经元计算 y = w0*x0+w1*x1+w2*x2+...+w783*x783+b for(i=0;i<784;i++) { y = y + w1[j+i*64]*img[i]; //w1[0+1*64]*1+w1[0+2*64]*2+...+w1[0+783*64]*783, } //加偏置 y = y + b1[j]; //加激活relu 将线性转化为非线性 y = (y>0)?y:0; a1[j] = y; //保存单个神经元的值 } //第二层全连接神经网络 for(j=0;j<10;j++) { y = 0.0; //第二层的神经元10个 对应的权重w2:64*10, 由于一个神经元对应一个偏置项 b2:10个 for(i=0;i<64;i++) { y = y + w2[j+i*10]*a1[i]; } //加偏置 y = y + b2[j]; a2[j] = y;//保存单个神经元的值 } //查询概率最大值 找到a2概率最大的下标并返回 比大小 for(i=0;i<10;i++) { if(temp < a2[i]) { temp = a2[i]; k = i; } } return k; } int main() { int ret,i; float *imgx[10]={input_0,input_1,input_2,input_3,input_4,input_5,input_6,input_7,input_8,input_9}; for(i=0;i<10;i++) { ret = predict(imgx[i],layer1_weight,layer1_bais,layer2_weight,layer2_bais); printf("input_%d,predict result:%d \n",i,ret); } return 0; }
本文 zblog模板 原创,转载保留链接!网址:http://xn--zqqs03dbu6a.cn/?id=8
声明
1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。