全连接神经网络C语言实现

yummy 阅读:68 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; 
}

image.png

本文 zblog模板 原创,转载保留链接!网址:https://xn--zqqs03dbu6a.cn/?id=8

可以去百度分享获取分享代码输入这里。
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。