基于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

需要注意的是,这样的方法只能读取有训练参数层的权值,对于下采样、激活层等无训练参数的层,无法得到其层内权值(因为层内根本没有权值)。

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')

  但是这种方法的弊端也很明显,这种方法只能在原有的结构上进行权值的修改,而不能对原有结构进行修改,比如,删除原有结构中的某一层或增加新的层,或更改原有层的维度等。
  在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 python API for inference:
import caffe
caffe.set_mode_cpu()
net = caffe.Net(‘xx.prototxt’,‘xx.caffemodel’,caffe.TEST)
net.blobs[‘data’].data[…] = xxx(inference data)
res = net.forward()
res即为网络的inference结果,保存为一个字典.

读取和修改caffemodel文件里的参数相关推荐

  1. oracle数据库imp导入失败提示:“不是有效的导出文件, 标头验证失败”解决方法,修改dmp文件里oracle数据库版本号方法

    报错信息如下,该报错主要是因为原来导出时的数据库版本和现有的数据库版本不匹配所致. C:\Users\Administrator>imp ncc2005zdh_0602/ufida file=D ...

  2. java读取并修改xml文件

    java读取并修改xml文件 java如何读取xml并且修改xml文件呢?代码如下: //复制模板xnl File file = new File(xmlSavePath + "/mb.xm ...

  3. php读取大文件某行内容,PHP读取和修改大文件的某行内容_PHP教程

    最近碰到一个比较有趣的问题,就是修改某个文件的某一行字符,不过文件太大,file()直接读取是不可能的,我使用fgets来跳转到指定行,并用fwrite修改某个字符串: $fp = fopen(d:/ ...

  4. python关闭excel文件_利用Python读取和修改Excel文件(包括xls文件和xlsx文件)

    本文介绍一下使用Python对Excel文件的基本操作,包括使用xlrd模块读取excel文件,使用xlwt模块将数据写入excel文件,使用openpyxl模块读取写入和修改excel文件. 目录 ...

  5. Mac只能读取不能修改硬盘文件怎么办

    很多小伙伴在使用Mac系统的时候,往往会发现这样一个问题,插入移动硬盘后,在Mac上只能读取却不能对文件进行编辑.下面,小编将给您介绍一种便捷的解决办法. 图片1:Macbook 产生这个问题的原因大 ...

  6. java分类读txt里面的数据_java分别读取两个txt文件里的数据再进行比较。再分别列出这两个文件中共有的和分别独有的数据。...

    两个txt文件里存着不同数量的推文数据,每一行开头的一串数字是该条推文的ID,ID和推文内容用":"冒号隔开,根据ID比较两个txt文件中推文,再分别列出连个txt文件中共有的推文 ...

  7. java 读取带section_手把手教你实现类似ini4j的方式创建读取和修改.ini文件(支持section)...

    背景 由于这次任务是和c语言合作编写的,刚开始使用ini4j来操作.ini文件,然后由于ini4j对存储的数据做了转义处理,导致c无法正常读取,他们也是采用开源的框架,然后由于java方只有我一个人, ...

  8. 【Python】python读取doc、docx文件里的表格内容并存入excel中

    效果 先展示下基本的效果,首先我们只有一个doc文件,与python的代码: 我这里用的是doc的word文档,文档内表格如下: 通过python读取后打印: 我这里没有专门按照表格内往excel中写 ...

  9. 读取网络抓包文件data得到参数

    #include <fstream> #include <iostream> #include <iomanip> //I/O流控制头文件 #include < ...

最新文章

  1. 研究生实名举报深圳大学导师强迫学生延迟毕业,违规报销,各方回应
  2. 社会科技奖不是新鲜事?如何真正做大
  3. 360:中国为什么没有自主研发的浏览器内核?
  4. C++双冒号::的作用
  5. java中的后台线程、前台线程、守护线程区别
  6. Ecplise切换项目里面的包的显示样式
  7. 算法—2,记一个自己的算法题 计算数字k在0到n中的出现的次数,k可能是0~9的一个值
  8. 安卓imageView加载MYSQL图片_Android调用相机拍摄照片并显示到 ImageView控件中
  9. 教育部计算机科学,关于批准计算机科学与技术专业教学改革与实践项目立项的通知...
  10. sklearn应用—高斯混合
  11. dojo 的DOM操作 dojo/dom
  12. 计算机不小心删除怎么找回桌面,如何将桌面上误删的文件找回
  13. 要比惨吗?看看这个女人
  14. 【云笔记搭建】Visual Code + Github仓库 + Git
  15. 基于python的MUSIC算法
  16. 【云原生】设备云之前端可视化编程
  17. scratch——贪吃蛇(变量、克隆、可连手柄)
  18. 英语 名词复数的变化及其发音
  19. R语言系列学习(各种检验)
  20. pbr发光 unity_【学习笔记】Unity PBR的实现

热门文章

  1. 【Java】总结Java数组的拷贝和输出
  2. 函数式编程语言:LISP/Scheme 小语种简介
  3. 设置mysql从库延迟主库一小时
  4. BZOJ2017[USACO 2009 Nov Silver 1.A Coin Game]——DP+博弈论
  5. 未来5年人工智能将取代6%工作职位
  6. java你可能不知道的事(2)--堆和栈
  7. 插入排序(java版)
  8. IIS配置教程。。。。。
  9. 我的log4net使用手册(转自 http://blog.csdn.net/lyjcn/archive/2009/08/11/4432833.aspx)
  10. 为托管应用程序添加DPI Aware支持