tensorflow ckpt文件转caffemodel时遇到的坑
来源:互联网 发布:淘宝网牛仔裤女款新款 编辑:程序博客网 时间:2024/05/18 23:12
转:
http://www.cnblogs.com/unclelin/p/6984436.html
tensorflow ckpt文件转caffemodel时遇到的坑
在做tensorflow模型转caffe模型时,遇到了几个坑。其中之一就是caffe的padding方式和tensorflow的padding方式有很大的区别,导致每一层的输出都无法对齐,让我一度怀疑转换模型的代码是错的。
卷积操作输出的形状计算公式是这样的:
output_shape = (image_shape-fileter_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投入实际应用中走不通了?
当然不是。只要稍微修改一下源码就好啦。
https://github.com/petewarden/tensorflow_makefile/blob/master/tensorflow/core/kernels/ops_util.cc
把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的转换。
- tensorflow ckpt文件转caffemodel时遇到的坑
- 从TensorFlow的.ckpt文件中读取网络的参数
- 查看tensorflow ckpt文件中的变量名和对应值
- tensorflow--使用freeze_graph.py将ckpt转为pb文件
- 查看tensorflow ckpt文件中的变量名和对应值
- DenseNet_161 caffemodel 转 tensorflow 手把手教程
- TensorFlow 中遇到的坑
- ckpt的工作机制
- CKPT的工作机制
- tensorflow ‘/biases/Adam_1’not in ckpt file
- Anaconda安装tensorflow时遇到的那些坑
- CKPT
- CKPT
- tensorflow安装过程中遇到的坑
- 安装tensorflow过程中遇到的坑
- ubuntu14.04安装tensorflow遇到的坑
- Tensorflow搭建中遇到的坑
- Tensorflow-Feature Column遇到的坑
- 在 Windows下用 Visual Studio 2013编译并调试 OpenSSL 1.1.0
- Python 调用 opencv 处理图像
- 数据结构之算法时间复杂度
- 110. Balanced Binary Tree
- xss初识
- tensorflow ckpt文件转caffemodel时遇到的坑
- SpringMVC+Maven开发最小“自然语言理解”项目攻略(附源码打包下载及详细说明)
- 最长公共子串@Java
- MySQL 中 delete 语句的子查询限制
- 9 月 16 日极光开发者沙龙北京站 | 如何构建安全稳定的系统架构
- 2017-09-11 LeetCode_023 Merge k Sorted Lists
- 自媒体淘客写爆文的秘诀
- 【Java并发编程】之二:线程中断(含代码)
- (剑指offer)丑数,只包含因子2、3和5的数称作丑数