Python-深度学习-学习笔记(20):获取并导出keras中某一层权重参数的方法

Python-深度学习-学习笔记(20):获取并导出keras中某一层权重参数的方法

1.模型的保存与加载

我们通过keras对网络进行训练之后会发现其内部参数以及训练方法是封装好的,用户只需要调用keras提供的API即可实现网络的搭建和训练。通过训练我们能够获得我们所需的较优的网络结构,并且我们可以通过使用:

model.save(filepath of h5)		#模型保存

即可实现对模型的保存,这里包括模型中的所有参数。
之后只需将模型导入,即可使用该模型。

from keras.models import load_model
model = load_model(filepath of h5)	#模型导入

使用方法示例:
在这里插入图片描述

2.模型权重的查看

这里的h5文件(model_weights.h5)里面存储了该model的权重参数,但是他是以group形式封装好的。
我们可以通过h5文件查看其内部信息:

f = h5py.File(filepath)					#打开h5文件
for key in f.keys():					#查看内部的键
    print(key)
f['model_weights'].attrs.keys()			#查看键的属性
f['model_weights'].attrs['layer_names']	#查看层的名称

在这里插入图片描述
我们可以发现这里的array内的名称与我们model.summary()打印出的名称相同。
在这里插入图片描述
假如我们想获取dense_1层的权重信息,可以使用该方法进行获取。

weight_Dense_1,bias_Dense_1=model.get_layer('dense_1').get_weights()

此时权重和偏差都存储在了array中。

weight_Dense_1			#这里存储的是dense_1的权重
bias_Dense_1			#这里存储的是dense_1的偏差

在这里插入图片描述

3.参数的保存

在一些情况下,我们需要将参数保存下来导入到入到其他地方使用,譬如用C语言改写网络。首先我们要先知道权重矩阵的形状:
在这里插入图片描述
根据形状一层一层地将参数存储在bin文件中。

#保存为bin文件
import struct
f = open('E:\\conv1.bin','wb')	#打开一个bin文件
for i in range(640):
     for j in range(64):
        f.write(struct.pack('f',weight_Dense_1[i][j]))	#将权重按照权重矩阵的顺序保存到文件中
for i in range(64):
    f.write(struct.pack('f',bias_Dense_1[i]))	#保存偏差矩阵
f.close()	#写入完成后关闭文件

此时bin文件产生:
在这里插入图片描述
接下来用C语言将该bin文件打开,并以存储时的顺序将bin文件中保存的参数重新读取到C语言数组中。

#include <stdio.h>
#include<stdlib.h>
int main()
{
	int i,j;
	int k = 0;
    FILE* pFile;
	float read[40960];
	float arr[640][64];
    pFile = fopen("conv1.bin" , "rb"); // 重新打开文件读操作
    fread(read , 1 , sizeof(read) , pFile); // 从文件中读数据
    //按照存的顺序取(这里千万不能乱)
	for(i=0;i<640;i++){
		for(j=0;j<64;j++){
			//printf("%d",k);		//测试read的取值顺序
			arr[i][j] = read[k];
			k++;
		}
	}
    fclose(pFile); // 关闭文件
    //打印几个参数验证一下
	printf("%f\t%f\t%f\t\n",arr[0][0],arr[1][0],arr[0][2]);
    return 0;
}

通过验证,可以发现在h5文件中保存的权重矩阵被挪到了C语言的数组中。
在这里插入图片描述

发布了55 篇原创文章 · 获赞 76 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_42826337/article/details/103519605
今日推荐