zoukankan      html  css  js  c++  java
  • 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]

     

  • 相关阅读:
    新一轮人工智能的兴起引发的思考
    企业应用架构的发展演进
    利用poi插件,把Excel内容读入Java,把Java中的内容输出到Exce
    mysql免安装被指
    正则表达式大全
    开发数据库步骤
    JVM
    Java面试题一
    java集合总结
    JAVA WEB回顾一
  • 原文地址:https://www.cnblogs.com/unclelin/p/6984436.html
Copyright © 2011-2022 走看看