caffe上手:如何导出caffemodel参数
最近在github上看到一个导出mnist的model参数的Matlab和Python的脚本,比较简单,以后可能用得到,记录一下。
load_caffemodel.py: 使用python脚本加载lenet的参数。
conv*.mat: 在blob数据中相同结构定义的层的参数。
parse_param.m: Matlab脚本,将加载到的每层参数保存出来的mat文件整合成一个parsed_param.mat文件。
parsed_param.mat: Matlab保存生成的mat文件。
如果github打不开的话,我这里把这几个脚本的代码贴出来。
================================================================================
load_caffemodel.py
![](https://code.csdn.net/assets/CODE_ico.png)
- import numpy as np
- import scipy.io as sio
- import caffe
- def load():
- # Load the net
- caffe.set_mode_cpu()
- # You may need to train this caffemodel first
- # There should be script to help you do the training
- net = caffe.Net(root + 'lenet.prototxt', root + 'lenet_iter_10000.caffemodel',\
- caffe.TEST)
- conv1_w = net.params['conv1'][0].data
- conv1_b = net.params['conv1'][1].data
- conv2_w = net.params['conv2'][0].data
- conv2_b = net.params['conv2'][1].data
- ip1_w = net.params['ip1'][0].data
- ip1_b = net.params['ip1'][1].data
- ip2_w = net.params['ip2'][0].data
- ip2_b = net.params['ip2'][1].data
- sio.savemat('conv1_w', {'conv1_w':conv1_w})
- sio.savemat('conv1_b', {'conv1_b':conv1_b})
- sio.savemat('conv2_w', {'conv2_w':conv2_w})
- sio.savemat('conv2_b', {'conv2_b':conv2_b})
- sio.savemat('ip1_w', {'ip1_w':ip1_w})
- sio.savemat('ip1_b', {'ip1_b':ip1_b})
- sio.savemat('ip2_w', {'ip2_w':ip2_w})
- sio.savemat('ip2_b', {'ip2_b':ip2_b})
- if __name__ == "__main__":
- # You will need to change this path
- root = '/caffe/examples/mnist/'
- load()
- print 'Caffemodel loaded and written to .mat files successfully!'
parse_param.m
![](https://code.csdn.net/assets/CODE_ico.png)
- clear;close all;clc
- %% Parse the ConvNet parameters loaded from caffe into better fit version
- % Author: Yuliang Zou
- % Date: 06/14/2016
- %% Load parameters
- load('conv1_w.mat');
- load('conv1_b.mat');
- load('conv2_w.mat');
- load('conv2_b.mat');
- load('ip1_w.mat');
- load('ip1_b.mat');
- load('ip2_w.mat');
- load('ip2_b.mat');
- %% Parse parameters into better fit version
- % conv1 has 20 filters with 5 * 5 size
- W1 = zeros(5,5,20);
- for i = 1:20
- W1(:,:,i) = conv1_w(i,1,:,:);
- end
- b1 = double(conv1_b');
- % conv2 has 50 filters with 5 * 5 size
- W2 = zeros(5,5,20,50);
- for k = 1:20
- for i = 1:50
- W2(:,:,k,i) = conv2_w(i,k,:,:);
- end
- end
- b2 = double(conv2_b');
- % fc layers
- ip1W = double(ip1_w);
- ip1b = double(ip1_b');
- ip2W = double(ip2_w);
- ip2b = double(ip2_b');
- save('parsed_param.mat','W1','W2','b1','b2','ip1W','ip1b','ip2W','ip2b');
![](http://static.blog.csdn.net/images/save_snippets.png)
========================================分割线===================================
基于caffe 的卷积神经网络模型训练后得到的权值是通过Google Protobuf来存储的后缀名为.caffemodel的二进制文件,这类文件一般很难直接打开进行权值的读取和修改。有的时候我们希望直观的看到网络中每个神经元的权值,或者希望更改网络的部分结构来得到新的结构进行finetune。在这样的情况下我们就需要对caffemodel文件进行操作。好在caffe的Python接口提供了针对caffemodel文件的修改方法,用户可以从caffemodel文件中读取参数,并对参数进行修改以得到新的caffemodel文件。
1、读取caffemodel里的权值
首先caffe要先进行pycaffe 的编译并安装好pycaffe的依赖环境。然后用下述python文件可以查看caffemodel文件中各个层的参数,以查看lenet-5权值为例。
import caffeif __name__ == "__main__":#文件的存放路径root = '/home/xhq11/caffe-master/examples/mnist/'caffe.set_mode_cpunet = caffe.Net(root+'lenet.prototxt',\root+'lenet_iter_10000.caffemodel',caffe.TEST')#第一个卷基层的权值conv1_w = net.params['conv1'][0].data#第一个卷基层的偏置值conv1_b = net.params['conv1'][1].data#可以打印相应的参数和参数的维度等信息print conv1_w,conv1_bprint conv1_w.size,conv1_b.size
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
需要注意的是,这样的方法只能读取有训练参数层的权值,对于下采样、激活层等无训练参数的层,无法得到其层内权值(因为层内根本没有权值)。
2、修改caffemodel内的权值并保存为新的caffemodel
有的时候我们需要修改原caffemodel来得到新的caffemodel文件用于finetune等工作,可通过下述python文件实现,以修改lenet-5权值为例。
import caffeif __name__ == "__main__":#文件的存放路径root = '/home/xhq11/caffe-master/examples/mnist/'caffe.set_mode_cpunet = caffe.Net(root+'lenet.prototxt',\root+'lenet_iter_10000.caffemodel',caffe.TEST')#在这部分做任何你希望的对权值的修改net.save('/path of your new caffemodel/newname.caffemodel')
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
但是这种方法的弊端也很明显,这种方法只能在原有的结构上进行权值的修改,而不能对原有结构进行修改,比如,删除原有结构中的某一层或增加新的层,或更改原有层的维度等。
在caffe 的官方文档中提供了一种修改caffemodel文件的方法,具体参考http://nbviewer.jupyter.org/github/BVLC/caffe/blob/master/examples/net_surgery.ipynb(需翻墙)。这里面的案例是讲caffenet的后三个全连接层(fc6/fc7/fc8)改成全卷基层(fc6-conv/fc7-conv/fc8-conv)以形成新的网络权值文件bvlc_caffenet_full_conv.caffemodel。值得注意的是,这里面的案例也仅仅是将原来后三个全连接层的权值“摊平”(文中的写法为flat)并赋给卷积层,由于全连接层和卷基层的参数个数是相同的,因此这个案例本质上也属于权值的进一步修改。文中最后有这么一段话:
Note that this model isn’t totally appropriate for sliding-window detection since it was trained for whole-image classification. Nevertheless it can work just fine. Sliding-window training and finetuning can be done by defining a sliding-window ground truth and loss such that a loss map is made for every location and solving as usual. (This is an exercise for the reader.)
caffe上手:如何导出caffemodel参数相关推荐
- 使用pycaffe读取caffemodel参数(保存到txt文件)
#!/usr/bin/env python # 引入"咖啡" import caffe import numpy as np # 使输出的参数完全显示 # 若没有这一句,因为参数太 ...
- OpenCV导出模板参数文件
OpenCV导出模板参数文件 导出模板参数文件 目标 代码 解释 导出模板参数文件 目标 在本教程中,您将学习如何 创建一个简单的参数文件模板. 代码 #include <opencv2/cor ...
- caffe中solver.prototxt文件参数解释
在训练或者微调网络时我们需要设置一些参数,在caffe中这些参数保存在sovler.prototxt文件中(当然这只是一个文件名,你也可以随意换成其他的名称).在下面的代码中以注释的形式解释每一个参数 ...
- caffe上手2:使用INRIA行人数据集对BVLC Caffe进行fine-tuning
上次使用mnist对caffe进行了初步了解,这一次就要开始对毕设的任务进行尝试了.这次打算对ImageNet进行fine tune,使用的是行人检测数据集INRIA. 首先下载下来INRIA数据集, ...
- tensorflow2caffe(3) : 如何将tensorflow框架下训练得到的权重转化为caffe框架下的权重参数
版权声明:本文为博主原创文章,转载时请附加博文链接. https://blog.csdn.net/jiongnima/article/details/78382972 在前两期专栏tensorflow ...
- tensorflow2caffe(1) : 如何将tensorflow框架下训练得到的权重转化为caffe框架下的权重参数
在前两期专栏tensorflow2caffe(1)和tensorflow2caffe(2)中,笔者向大家介绍了caffemodel文件类型下的参数架构和如何取出tensorflow框架下训练参数.在本 ...
- 剖析Caffe源码之Net---NetParameter参数
前面几篇文章主要分析了Caffe中的Blob和Layer源码,了解到了Caffe中的参数数据结构文件caffe.proto,掌握了各个Layer是如何注册到Caffe中,下面将分析Net层. 在分析N ...
- caffe学习日记--lesson7:caffemodel可视化的两种方法
在Caffe中,目前有两种可视化prototxt格式网络结构的方法: 使用Netscope在线可视化 使用Caffe提供的draw_net.py 本文将就这两种方法加以介绍 Netscope:支持Ca ...
- caffe 网络模型文件中的参数含义(top bottom lr_mult decay_mult)与模型编写以及模型自定义
文章目录 基本概念 数据层 Convolution Layer Deconvolution 反卷积层 Batch Normalization 层 Polling Layer crop层 裁剪 全连接层 ...
- 从.caffemodel/.caffemodel.h5提取Caffe模型的参数
系列博客目录:Caffe转Pytorch模型系列教程 概述 目录 一.通用的提取参数方法 1.编译Caffe 2.打印.caffemodel的网络参数 3.保存.caffemodel的网络参数 二.提 ...
最新文章
- solvepnp.cpp:92: error: (-215:Assertion failed) ( (npoints = 4) || (npoints == 3
- 比较两个引用的几种方法
- windowsXPsp3怎样恢复桌面IE图标(非快捷方式)
- Node.js 官方文档中文版
- 分针网——每日推荐:PHTML解析原理
- linux初学者-DNS集群篇
- 华为员工实力炫富,工作六年有房有豪车,存款六十万
- GB-T2260-2020 <中华人民共和国县以上行政区划代码>
- jenkins+donet core持续集成环境搭建
- 2018年6月2日 星期六 天气晴
- R语言和医学统计学(4):秩和检验
- 编一程序,将两个字符串连接起来,不要用strcat函数。C语言
- xc7k325tffg900芯片手册_XC7K325TFFG900_Spartan-3【太航半导体】闻喜县
- Java for Web学习笔记(六七):Service和Repository(2)抽象分层例子
- 21天学会Linux----Day1:Linux环境搭建
- 程序员遇到人生低谷期怎么做?
- Python利用Opencv读取图片
- 计算机校本培训心得,校本研修学习心得体会范文3篇
- [北大肖臻-区块链技术与应用笔记]第三节课——共识机制
- 甘特图,看这篇就够了