python的前向传播改写为C语言并仿真的过程

1.在导出神经网络的权重和偏差时遇到的问题及解决办法

在导权重和偏差的时候不是很顺利,原因是整个神经网络层全部被封装在一个层里,即图4.1中的model_1层,

import h5py
from keras.models import load_model
model = load_model('pathname\\xxx.h5')	#模型导入
f = h5py.File('pathname\\xxx.h5')					#打开h5文件
for key in f.keys():					#查看内部的键
    print(key)
f['model_weights'].attrs.keys()			#查看键的属性
f['model_weights'].attrs['layer_names']	#查看层的名称

得到结果:
在这里插入图片描述

那如何将权重和偏差打印出来并保存呢?打印方法是:

c1w,c1b,c2w,c2b,c3w,c3b,d1w,d1b,d2w,d2b= model.get_layer('model_1').get_weights() #将权重和偏差赋值给左侧
c1w    #打印第一层卷积的权重
c1w.shape   #打印数组维度(c1w的数组维度为(5,1,4))

保存第一层卷积的权重的方法是:

#保存为bin文件
import struct
f = open('pathname\\conv1_weight.bin','wb')	#打开一个bin文件
for k in range(4):
    for j in range(1):
        for i in range(5):
            f.write(struct.pack('f',c1w[i][j][k]))	#将权重按照权重矩阵的顺序保存到文件中
f.close()	#写入完成后关闭文件

保存第一层卷积的偏差的方法是:

#保存为bin文件
import struct
f = open('pathname\\conv1_bias.bin','wb')	#打开一个bin文件
for i in range(4):
    f.write(struct.pack('f',c1b[i]))	#保存第一层卷积的偏差矩阵
f.close()	#写入完成后关闭文件

其它层的查看和保存权重和偏差的方法与第一层一样。

2.在导出中间结果时遇到的问题及解决办法

在导出中间结果时,同样因为整个神经网络层全部被封装在一个层里,中间结果获取困难。为了解决这一问题,teacher Liu提出将神经网络单独拎出来,通过输入单边数据,然后重新训练获取权重、偏差和中间结果,与C语言每层网络的权重、偏差和中间结果进行对比,以此来验证改写是否成功。
所以就有了以下两个文件夹:
在这里插入图片描述

3.C语言导入权重和偏差的方法

打开,读取并打印权重文件的方法:

	void a_init_conv1_kernel(float *c1_weight_p){
//	int number;
//	int ch;
//	int size;
	//初始化卷积核1参数
	FILE* pFile1 = NULL;
	//初始化c1 kernel
	pFile1 = fopen("pathname/xxx.bin" , "rb");   //打开conv1的权重文件	
	fread(c1_weight_p, sizeof(float), C1_NUMBER*C1_CHNNEL*C1_KERNEL, pFile1);	//从文件中读取数据
	fclose(pFile1); // 关闭文件

#if 0          //将0改成1就进入调试状态
	//打印卷积核
	printf("The conv1 kernel:\n");
	for (number = 0; number < C1_NUMBER; ++number){
		printf("No.%d: ",number+1);
		for(ch = 0; ch<C1_CHNNEL; ++ch){
			for (size = 0; size < C1_KERNEL; ++size){
				printf("%f ",c1_weight_p[number*C1_CHNNEL*C1_KERNEL+ch*C1_KERNEL+size]);
			}
		}
		printf("\n");
	}
#endif
}

打开,读取并打印第三层卷积的偏差的文件的方法:

void a_init_conv3_bias(float *c3_bias_p){
	FILE* pFile3 = NULL;
//	int number;
	//初始化c3 bias
	pFile3 = fopen("pathname/xxx.bin" , "rb");   //打开偏差文件
	fread(c3_bias_p , sizeof(float) , C3_NUMBER, pFile3);	//从文件中读取数据
	fclose(pFile3); // 关闭文件

#if 0
	//打印偏差
	printf("The conv3 bias:\n");
	for (number = 0; number < C3_NUMBER; ++number){
		printf("%f ", c3_bias_p[number]);
	}
	printf("\n");
#endif
}

4.Vivado HLS的C仿真、C综合

C仿真时候要添加顶层文件,所以把两侧网络的.c文件合成了一个文件,添加顶层文件时候就只有一个uw_predict.c待添加。

C综合之前,要添加接口。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值