背景:
今天下了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成功跑起来: