博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
tensorflow ckpt文件转caffemodel时遇到的坑
阅读量:2032 次
发布时间:2019-04-28

本文共 1080 字,大约阅读时间需要 3 分钟。

转自:

tensorflow ckpt文件转caffemodel时遇到的坑

在做tensorflow模型转caffe模型时,遇到了几个坑。其中之一就是caffe的padding方式和tensorflow的padding方式有很大的区别,导致每一层的输出都无法对齐,让我一度怀疑转换模型的代码是错的。

卷积操作输出的形状计算公式是这样的:

output_shape = (image_shape-filter_shape+2*padding)/stride+1

因为padding前面的系数是2,所以在padding时,一般是对称地补,左/右各padding一列 或者 上下各padding一行。

那么问题来了,如果stride是2,而括号里算出来的值刚好是奇数怎么办?那就再偷偷摸摸补一列padding或者补一行padding。

于是,caffe和tensorflow的区别就出来了。

caffe偷偷摸摸地把一行0补在上面 或者 把一列0补在左边,tensorflow正好镜像对称,把一行0补在下面或者把一列0补在右边。这就是导致输出对齐不了的原因,前面几层输出的feature map的中间还能勉强对上,随着网络结构的加深,到fc之前已经完全对不上了。

那tensorflow转caffe岂不是无解?想基于tensorflow训练模型再转成caffe投入实际应用中走不通了?

当然不是。只要稍微修改一下源码就好啦。

把60行的*pad_top 改成 *pad_bottom,把61行的*pad_bottom改成*pad_top

把65行的*pad_left 改成 *pad_right ,把66行的*pad_right 改成 *pad_left

然后重新编译一下,就可以让tensorflow和caffe的padding方式保持一致了。

除了padding方式外,卷积层和fc层的通道顺序也需要注意一下
卷积层的通道顺序:在caffe里是[N,C,H,W],而tensorflow是[H,W,C,N]
fc层的通道顺序:在caffe 里是[c_in,c_out],而tensorflow是[c_out,c_in]

@ johntian

你好,tensorflow转caffe的工作没有开源。解析tensorflow的ckpt文件而获得网络的结构图难度比较大,我们现在做的只是写一些简单的python脚本,并且在网络命名上有严格的限制。脚本的逻辑大概就是1 根据ckpt文件生成deploy文件 2 用pycaffe进行ckpt到caffemodel的转换。

转载地址:http://wtxaf.baihongyu.com/

你可能感兴趣的文章
内存管理初始化源码2:setup_arch
查看>>
树二:二叉树定义及性质
查看>>
排序五:希尔排序
查看>>
树四:遍历二叉树
查看>>
树一:定义及存储
查看>>
树五:线索化二叉树
查看>>
树三:创建二叉树
查看>>
内存管理初始化源码3:bootmem
查看>>
内存管理初始化源码4:add_active_range
查看>>
初等函数——幂函数(Power Function)
查看>>
内存管理初始化源码5:free_area_init_nodes
查看>>
初等函数——指数函数(Exponential Function)
查看>>
自然常数e的含义
查看>>
[Binder深入学习一]Binder驱动——基础数据结构
查看>>
初等函数——三角函数
查看>>
[Binder深入学习二]Binder驱动——基础数据结构二
查看>>
1. QCamera2基础组件——cam_semaphore
查看>>
Java 四种线程池
查看>>
java8 JDK1.8 API 中文 翻译版 java帮助文档
查看>>
【Java】【40】Long类型和long类型的大小比较
查看>>