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]

     

  • 相关阅读:
    JS BOM对象 History对象 Location对象
    JS 字符串对象 数组对象 函数对象 函数作用域
    JS 引入方式 基本数据类型 运算符 控制语句 循环 异常
    Pycharm Html CSS JS 快捷方式创建元素
    CSS 内外边距 float positio属性
    CSS 颜色 字体 背景 文本 边框 列表 display属性
    【Android】RxJava的使用(三)转换——map、flatMap
    【Android】RxJava的使用(二)Action
    【Android】RxJava的使用(一)基本用法
    【Android】Retrofit 2.0 的使用
  • 原文地址:https://www.cnblogs.com/unclelin/p/6984436.html
Copyright © 2011-2022 走看看