前言

在工业界混的人,每个人都有自己习惯的框架,有时为了部署不得不在框架之间进行模型转换。踩了几个坑之后,终于转换成功,这里记录一下分享一下。gayhub链接:

xggIoU/tensorflow_keras_to_caffe​github.com

envs/tools

tensorflow1.13.2、keras2.2.4、caffe1.0、python3.6、pycharm、Anoconda、MMdnn0.2.4、ubuntu18.04

准备工作

  • 如果你像我一样caffe只是转换过程需要,而平常不用它来train,你可以简单的利用conda安装编译好了的caffe,命令行:
python conda install caffe-gpu

  • 如果你的模型本身现在本来就是keras model,那么上述环境中所述的MMdnn就不需要了。
  • 如果你的模型现在是tensorflow model,例如ckpt model,那么就需要微软的MMdnn进行转换,虽然这个工具目前还不能无缝转换所有不同框架模型,但是tf与keras的互相转换还是无痛的,毕竟可以说是同一个框架。命令行转换示例:
python mmconvert -sf tensorflow -in your_model_name.ckpt.meta -iw your_model_name.ckpt --inNodeName input_name --inputShape 224,224,3 --dstNodeName output1 ouput2 -df keras -om your_keras_model.h5

开始转换

这里不讲具体的转换过程,你可以自己去看转换脚本,很容易就能看懂。并且对照着已有的脚本代码也容易就能实现自己用到的layer的转换。使用很简单,指定好你的keras模型路径,指定好你想要的caffe模型的输出prototxt、caffemodel名字,最后run就ok了。像这样:

if __name__=='__main__':config = tf.ConfigProto()config.gpu_options.allow_growth = Truesess = tf.Session(config=config)K.set_session(sess)kModel=load_keras_model('../your_keras_model.h5')prototxt='../your_caffe_model.prototxt'caffemodel='../your_caffe_model.caffemodel'generate_caffe_model(kModel, prototxt, caffemodel)

目前实现的可转换layer如下:

- InputLayer
- Dense
- Dropout
- ZeroPadding2D
- Multiply、Concatenate、Maximum、Add
- Conv2D、Conv2DTranspose
- BatchNormalization
- MaxPooling2D、AveragePooling2D、GlobalAveragePooling2D
- relu、prelu、elu、softmax、sigmoid、tanh

这样就已经能转换绝大部分模型了,如果没实现你用到的layer,你可自行在函数generate_layer(blobs, layer, n, net_params)添加你的layer即可。

Tips(坑)

  • 如果你的模型是tensorflow模型,并且使用了转置卷积conv2d_transpose(caffe中为Deconvolution),那么千万避免使用高级api,例如slim.conv2d_transpose,而是需要使用更低级的tf.nn.conv2d_transpose接口。否则会转换失败(看了下,貌似实现是不一样的)。
  • 另外,tf/keras中卷积的padding与caffe的padding方式不一样,tf/keras在padding方式为same情况下存在只pad右下的情况,而caffe是上下左右都pad,会导致结果有误差。tf中的same pad具体计算如下,以宽度为例:
width_padd=(new_width-1)*stride+kernel_size-ori_width
padd_left=width_padd//2
padd_right=width_padd-padd_left

为了解决这个问题,在tf/keras中建议对卷积改造一下,手动加pad,就像这样:

def conv2d(inputs, filters, kernel_size, strides=1,rate=1,biases_initializer=tf.zeros_initializer, activation_fn=tf.nn.relu):#stride>1时padding,valid卷积实现samedef _fixed_padding(inputs, kernel_size):pad_total = kernel_size - 1pad_beg = pad_total // 2pad_end = pad_total - pad_begpadded_inputs = tf.pad(inputs, [[0, 0], [pad_beg, pad_end],[pad_beg, pad_end], [0, 0]], mode='CONSTANT')return padded_inputsif strides > 1:inputs = _fixed_padding(inputs, kernel_size)inputs = slim.conv2d(inputs, filters, kernel_size, stride=strides,rate=rate,biases_initializer=biases_initializer,activation_fn=activation_fn,padding=('SAME' if strides == 1 else 'VALID'),weights_initializer=tf.initializers.he_normal())return inputs

如此一来,在转换过程中去掉pad层,(去掉keras中的ZeroPadding2D层),就能直接只使用caffe中的卷积层,实现一致的输出。

希望对你有帮助!

reference

keras2caffe,我修改了其中的bug,简化了代码,只转换为inference model。

caffe安装_keras/tensorflow1.x模型转换为caffe推理模型相关推荐

  1. caffe安装_【开源框架】caffe图像分类从模型自定义到测试

    这一次我们讲讲 Caffe 这个主流的开源框架,从训练到测试出结果的全流程. 到此,我必须假设大家已经有了深度学习的基础知识并了解卷积网络的工作原理. 相关的代码.数据都在我们 Git 上,希望大家 ...

  2. 测试caffe安装成功_用VSCODE调试Caffe程序

    电脑配置 1. ubuntu 16.04 LTS+Caffe 1.0.0+Vscond 1.43.2 2 anaconda 3 3 caffe 安装目录为 ~/.conda/envs/caffe/ca ...

  3. caffe安装详细完整过程(Ubuntu16.04、Ubuntu18.04系统)

    在ubuntu(Ubuntu16.04.ubuntu18.04)系统下成功安装caffe框架详细笔记 目录 Caffe编译安装指导 Caffe安装参考文档: 确认编译器版本 安装anaconda2 安 ...

  4. caffe安装_目标检测之caffe-ssd模型训练与测试

    最近把一个ssd网络的net..prototxt网络结构和自己生成的hdf5格式数据一起做训练时发现经常报错,因为ssd中一些层在caffe中并没有实现,需要自己写相应的.cpp,.cu文件重新编译, ...

  5. caffe安装,编译(包括CUDA和cuDNN的安装),并训练,测试自己的数据(caffe使用教程)

    caffe是一个非常清晰且高效的深度学习框架,目前有着不少的用户,也渐渐的形成了自己的社区,社区上可以讨论相关的问题. 我从开始看深度学习的相关内容到能够用caffe训练测试自己的数据,看了不少网站, ...

  6. 海思Hi3519AV100深度学习方案(一)darknet转caffmodel之caffe安装(基于Ubuntu16.04+python3.5+opencv3.4.0+cuda10.0)

    系列文章目录 海思Hi3519AV100深度学习方案(二)darknet转caffmodel之模型转换(yolov3+caffe+python3.5) 文章目录 系列文章目录 前言 一.系统已有环境检 ...

  7. 71 mac boook pro 无 gpu 下caffe 安装

    71 mac boook pro 无 gpu 下caffe 安装 1.首先安装homebrew工具,相当于Mac下的yum或apt ruby -e "$(curl -fsSL https:/ ...

  8. Caffe学习系列(17):模型各层特征和过滤器可视化

    转载自: Caffe学习系列(17):模型各层特征和过滤器可视化 - denny402 - 博客园 http://www.cnblogs.com/denny402/p/5105911.html cif ...

  9. 笔记:caffe安装编译,并用ssd gpu训练自己的数据集

    caffe ssd GPU训练自己的数据集 一.caffe环境搭建 二.数据集 三.训练和测试 一.caffe环境搭建 环境搭建过程网上有很多教程,可能要踩些坑吧,正常,这里不多赘述,主要是我当时也没 ...

最新文章

  1. $().html()对ie9无效,不注意这点,\9和\0就可能对hack IE11\IE9\IE8无效
  2. 计算机应用基础实验报告册,计算机应用基础实验报告(flash)
  3. instanceof 内部机制
  4. mysql创建外键级联更新_MySQL中利用外键实现级联删除、更新
  5. 脚本 sh 和 ./ 的区别,exec和source
  6. Exception in thread main java.io.IOException: (null) entry in command string: null chmod 0700 E:\t
  7. redhat bash: yum: 未找到命令..._常用linux yum 命令和 vim命令,这几个要熟记
  8. JavaScript开发中几个常用知识点总结
  9. mac自带python升级_mac升级Python失败?
  10. 搭建PC架构的ISCSI存储系统
  11. 四旋翼飞行器的研究方向
  12. Redis在本地安装与启动
  13. 由于区块链的影响,我决定转行!
  14. 为wpf中的DataGrid控件添加鼠标单击事件
  15. 百度Uditor富文本编辑器使用以及图片不显示问题
  16. python learning notes(柒)
  17. [SSL_CHX][2022-1-28]n皇后问题
  18. 亚马逊账号关联:一生只能有一个店铺
  19. xpath常见错误:Opening and ending tag mismatch: meta line 4 的处理方法【Python爬虫】
  20. 傻白探索Chiplet,关于EPYC Zen2 的一些理解记录(五)

热门文章

  1. IIS6.0发布后对路径“D:\xxx\xxxx\web.config”的访问被拒绝问题的解决方法
  2. PHP 利用PHPExcel到处数据到Excel;还有导出数据乱码的解决方案。
  3. Java ConcurrentModificationException异常原因和解决方法
  4. Python和JavaScript之间的JSON日期时间
  5. Python将新项添加到字典[重复]
  6. Mercurial和Git有什么区别?
  7. 如何在Visual Studio中“添加现有项”整个目录结构?
  8. jQuery / JavaScript:访问iframe的内容
  9. Python——拼接字符串
  10. 最新蓝牙版本助力实现“无连接式” 物联网