最近在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

[cpp] view plaincopy
  1. import numpy as np
  2. import scipy.io as sio
  3. import caffe
  4. def load():
  5. # Load the net
  6. caffe.set_mode_cpu()
  7. # You may need to train this caffemodel first
  8. # There should be script to help you do the training
  9. net = caffe.Net(root + 'lenet.prototxt', root + 'lenet_iter_10000.caffemodel',\
  10. caffe.TEST)
  11. conv1_w = net.params['conv1'][0].data
  12. conv1_b = net.params['conv1'][1].data
  13. conv2_w = net.params['conv2'][0].data
  14. conv2_b = net.params['conv2'][1].data
  15. ip1_w = net.params['ip1'][0].data
  16. ip1_b = net.params['ip1'][1].data
  17. ip2_w = net.params['ip2'][0].data
  18. ip2_b = net.params['ip2'][1].data
  19. sio.savemat('conv1_w', {'conv1_w':conv1_w})
  20. sio.savemat('conv1_b', {'conv1_b':conv1_b})
  21. sio.savemat('conv2_w', {'conv2_w':conv2_w})
  22. sio.savemat('conv2_b', {'conv2_b':conv2_b})
  23. sio.savemat('ip1_w', {'ip1_w':ip1_w})
  24. sio.savemat('ip1_b', {'ip1_b':ip1_b})
  25. sio.savemat('ip2_w', {'ip2_w':ip2_w})
  26. sio.savemat('ip2_b', {'ip2_b':ip2_b})
  27. if __name__ == "__main__":
  28. # You will need to change this path
  29. root = '/caffe/examples/mnist/'
  30. load()
  31. print 'Caffemodel loaded and written to .mat files successfully!'

parse_param.m

[cpp] view plaincopy
  1. clear;close all;clc
  2. %% Parse the ConvNet parameters loaded from caffe into better fit version
  3. % Author: Yuliang Zou
  4. % Date: 06/14/2016
  5. %% Load parameters
  6. load('conv1_w.mat');
  7. load('conv1_b.mat');
  8. load('conv2_w.mat');
  9. load('conv2_b.mat');
  10. load('ip1_w.mat');
  11. load('ip1_b.mat');
  12. load('ip2_w.mat');
  13. load('ip2_b.mat');
  14. %% Parse parameters into better fit version
  15. % conv1 has 20 filters with 5 * 5 size
  16. W1 = zeros(5,5,20);
  17. for i = 1:20
  18. W1(:,:,i) = conv1_w(i,1,:,:);
  19. end
  20. b1 = double(conv1_b');
  21. % conv2 has 50 filters with 5 * 5 size
  22. W2 = zeros(5,5,20,50);
  23. for k = 1:20
  24. for i = 1:50
  25. W2(:,:,k,i) = conv2_w(i,k,:,:);
  26. end
  27. end
  28. b2 = double(conv2_b');
  29. % fc layers
  30. ip1W = double(ip1_w);
  31. ip1b = double(ip1_b');
  32. ip2W = double(ip2_w);
  33. ip2b = double(ip2_b');
  34. save('parsed_param.mat','W1','W2','b1','b2','ip1W','ip1b','ip2W','ip2b');

========================================分割线===================================

基于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参数相关推荐

  1. 使用pycaffe读取caffemodel参数(保存到txt文件)

    #!/usr/bin/env python # 引入"咖啡" import caffe import numpy as np # 使输出的参数完全显示 # 若没有这一句,因为参数太 ...

  2. OpenCV导出模板参数文件

    OpenCV导出模板参数文件 导出模板参数文件 目标 代码 解释 导出模板参数文件 目标 在本教程中,您将学习如何 创建一个简单的参数文件模板. 代码 #include <opencv2/cor ...

  3. caffe中solver.prototxt文件参数解释

    在训练或者微调网络时我们需要设置一些参数,在caffe中这些参数保存在sovler.prototxt文件中(当然这只是一个文件名,你也可以随意换成其他的名称).在下面的代码中以注释的形式解释每一个参数 ...

  4. caffe上手2:使用INRIA行人数据集对BVLC Caffe进行fine-tuning

    上次使用mnist对caffe进行了初步了解,这一次就要开始对毕设的任务进行尝试了.这次打算对ImageNet进行fine tune,使用的是行人检测数据集INRIA. 首先下载下来INRIA数据集, ...

  5. tensorflow2caffe(3) : 如何将tensorflow框架下训练得到的权重转化为caffe框架下的权重参数

    版权声明:本文为博主原创文章,转载时请附加博文链接. https://blog.csdn.net/jiongnima/article/details/78382972 在前两期专栏tensorflow ...

  6. tensorflow2caffe(1) : 如何将tensorflow框架下训练得到的权重转化为caffe框架下的权重参数

    在前两期专栏tensorflow2caffe(1)和tensorflow2caffe(2)中,笔者向大家介绍了caffemodel文件类型下的参数架构和如何取出tensorflow框架下训练参数.在本 ...

  7. 剖析Caffe源码之Net---NetParameter参数

    前面几篇文章主要分析了Caffe中的Blob和Layer源码,了解到了Caffe中的参数数据结构文件caffe.proto,掌握了各个Layer是如何注册到Caffe中,下面将分析Net层. 在分析N ...

  8. caffe学习日记--lesson7:caffemodel可视化的两种方法

    在Caffe中,目前有两种可视化prototxt格式网络结构的方法: 使用Netscope在线可视化 使用Caffe提供的draw_net.py 本文将就这两种方法加以介绍 Netscope:支持Ca ...

  9. caffe 网络模型文件中的参数含义(top bottom lr_mult decay_mult)与模型编写以及模型自定义

    文章目录 基本概念 数据层 Convolution Layer Deconvolution 反卷积层 Batch Normalization 层 Polling Layer crop层 裁剪 全连接层 ...

  10. 从.caffemodel/.caffemodel.h5提取Caffe模型的参数

    系列博客目录:Caffe转Pytorch模型系列教程 概述 目录 一.通用的提取参数方法 1.编译Caffe 2.打印.caffemodel的网络参数 3.保存.caffemodel的网络参数 二.提 ...

最新文章

  1. solvepnp.cpp:92: error: (-215:Assertion failed) ( (npoints = 4) || (npoints == 3
  2. 比较两个引用的几种方法
  3. windowsXPsp3怎样恢复桌面IE图标(非快捷方式)
  4. Node.js 官方文档中文版
  5. 分针网——每日推荐:PHTML解析原理
  6. linux初学者-DNS集群篇
  7. 华为员工实力炫富,工作六年有房有豪车,存款六十万
  8. GB-T2260-2020 <中华人民共和国县以上行政区划代码>
  9. jenkins+donet core持续集成环境搭建
  10. 2018年6月2日 星期六 天气晴
  11. R语言和医学统计学(4):秩和检验
  12. 编一程序,将两个字符串连接起来,不要用strcat函数。C语言
  13. xc7k325tffg900芯片手册_XC7K325TFFG900_Spartan-3【太航半导体】闻喜县
  14. Java for Web学习笔记(六七):Service和Repository(2)抽象分层例子
  15. 21天学会Linux----Day1:Linux环境搭建
  16. 程序员遇到人生低谷期怎么做?
  17. Python利用Opencv读取图片
  18. 计算机校本培训心得,校本研修学习心得体会范文3篇
  19. [北大肖臻-区块链技术与应用笔记]第三节课——共识机制
  20. 甘特图,看这篇就够了

热门文章

  1. moss form验证 配置文件关键部分
  2. Python Web开发 Django框架下开发一个博客
  3. 47-高级路由:BGP 镜子实验
  4. 异构计算全新升级,阿里云全方位释能人工智能产业
  5. 【安全牛学习笔记】SSL、TLS拒绝服务***和补充概念
  6. openresty 前端开发入门一
  7. Mybatis源码研究7:缓存的设计和实现
  8. 实习阶段修改的第一个bug(完成了一个需求)
  9. 高级装饰器---验证用户登录
  10. 在Linux上显示某个进程的线程的几种方式