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语言的数组中。