caffe深度学习【十四】训练出错:Message type "caffe.PoolingParameter" has no field named "ceil_mode".

背景:

今天下了DPN的源码,想自己跑一跑,源码如下:

https://github.com/soeaver/caffe-model/tree/master/cls/dpn

但是caffe运行时出现了Message type “caffe.PoolingParameter” has no field named “ceil_mode”.的错误

主要是参考  https://github.com/BVLC/caffe/pull/3057/files

错误原因:

由于caffe的版本的原因,现用的caffe的源码中的pooling层没有ceil_mode 
这个函数,因此解决办法也是在现在的源码中向 pooling 层中添加这个参数以及相关的代码,并重新编译caffe即可

解决办法:

主要是修改3个caffe的文件,重然后新编译caffe

下面逐一介绍:

1、修改pooling_layer.hpp文件PoolingLayer类

文件位置:caffe/include/caffe/layers/pooling_layer.hpp

修改如下:

打开pooling_layer.hpp文件,然后ctrl+F 搜索:      bool global_pooling_;

在其下新加入一行:       bool ceil_mode_;        #这里新加入这一行

具体如下:

  int height_, width_;
  int pooled_height_, pooled_width_;
  bool global_pooling_;
  bool ceil_mode_;        #这里新加入这一行
  Blob<Dtype> rand_idx_;
  Blob<int> max_idx_;
};

(前面+号代表新加入的) 

 然后保存退出。

2、修改pooling_layer.cpp文件中相关参数

文件位置:caffe/src/caffe/layers/pooling_layer.cpp

这里有2个地方需要修改的,请注意!!!

修改如下:

打开pooling_layer.cpp文件

(1)然后ctrl+F 搜索:      global_pooling_ = pool_param.global_pooling();

在其下新加入一行:       ceil_mode_ = pool_param.ceil_mode();        #这里新加入这一行

(2)然后ctrl+F 搜索:      if (pad_h_ || pad_w_) {

将其上方的4行代码:      

  pooled_height_ = static_cast<int>(ceil(static_cast<float>(
      height_ + 2 * pad_h_ - kernel_h_) / stride_h_)) + 1;
  pooled_width_ = static_cast<int>(ceil(static_cast<float>(
      width_ + 2 * pad_w_ - kernel_w_) / stride_w_)) + 1;

全部删去;

然后替换成下面的12行代码:

  // Specify the structure by ceil or floor mode
  if (ceil_mode_) {
    pooled_height_ = static_cast<int>(ceil(static_cast<float>(
        height_ + 2 * pad_h_ - kernel_h_) / stride_h_)) + 1;
    pooled_width_ = static_cast<int>(ceil(static_cast<float>(
        width_ + 2 * pad_w_ - kernel_w_) / stride_w_)) + 1;
  } else {
    pooled_height_ = static_cast<int>(floor(static_cast<float>(
        height_ + 2 * pad_h_ - kernel_h_) / stride_h_)) + 1;
    pooled_width_ = static_cast<int>(floor(static_cast<float>(
        width_ + 2 * pad_w_ - kernel_w_) / stride_w_)) + 1;
  }

具体如下:(前面-号代表删除,前面+号代表新加入的)

然后保存退出。

3、修改caffe.proto文件中PoolingParameter的定义

文件位置:caffe/src/caffe/proto/caffe.proto

修改如下:

打开caffe.proto文件,然后ctrl+F 搜索:      optional bool global_pooling = 12 [default = false];

在其下新加入两行(其实有一行是注释而已):      

  // Specify floor/ceil mode
  optional bool ceil_mode = 13 [default = true];

具体如下:

然后保存退出。

4、重新编译caffe

返回到caffe的根目录,输入:

make clear
make all
make pycaffe

如果make all中间如果出现   caffe.proto:1:1: Interpreting non ascii codepoint 239.   问题

原因在于修改了caffe.proto后编码的问题

请参考我的另一篇博文  https://blog.csdn.net/qq_38451119/article/details/81980292    解决!

结果:

编译成功:

DPN成功跑起来:

猜你喜欢

转载自blog.csdn.net/qq_38451119/article/details/82252027