caffe编译DenseBlock层出错集合及解决办法

本博客记录编译caffe内存优化版的Densenet的层DenseBlock。

使用的DenseBlock层来自https://github.com/Tongcheng/caffe/tree/master/src/caffe/layers

错误汇总

1、错误    13    error : too few arguments in function call  

解决:加上CUDNN_DATA_FLOAT这个参数就可以了,参考https://blog.youkuaiyun.com/roach_zfq/article/details/78505815

2、错误    4    error : "#" not expected here   

解决:画框的地方注释掉

3、static const DimCheckMode STRICT = ParamSpec_DimCheckMode_STRICT;  这一行报错expected an identifier

解决:参考https://www.jianshu.com/p/cfb50d0e6d3d ,将STRICT替换成_STRICT,PERMISSIVE替换成_PERMISSIVE

4、inline float min() const; 报语法错误

解决:参考 https://blog.youkuaiyun.com/dongb5lz/article/details/45171187

同时把调用的地方也改掉:

5、错误    35    error denseblock_param”: 不是“caffe::LayerParameter”的成员

打开caffe.pb.h查找denseblock_param,找不到,这是因为在编译之前需要先编译caffe.proto,需要先执行protocompile.cmd,这个命令需要调用protoc。

,但是在scriptDir文件夹下没有这个命令,但是有个generatePB.bat,内容如下:这个bat主要执行的也是编译caffe.proto文件,然后复制到include/caffe文件夹下面,同上面的protocomplie.cmd做的是一样的事。

可以直接将预先生成事件的命令行参数改为这个bat,也可以在proto文件夹下,手动编译caffe.proto,然后复制caffe.pb.h到include/caffe文件夹下(上面出错的那些错误代码,可能还得对应修改一下) 。

6、无法解析的外部符号 cudaConfigureCall,cudaSetupArgument 等和cuda相关的库无法解析。

解决:查找网上的答案:

但是检查了下,项目的附加依赖项里面有这个文件,但是一直报错,无法解析,想想应该是版本不对吧,后面查了下项目下的cudart.lib(这里的cudart_1.lib就是本项目下的,后来用了本机安装的cuda自带的cudart.lib替换),大小是77k

再看看本机安装的cuda9.0的cudart.lib,大小为56k,明显版本不一致

后面想想这个caffe项目是别人给我的,他用的是cuda10.1,所以项目里面的cudart.lib就不能在我的环境下用了,替换后重新编译,通过~

训练一个densenet试试,结果报错了,loss=0,#QNAN了。debug_info设置为true,检查中间数据结果,发现从网络开始的DenseBlock1开始,部分卷积参数就变为0了,所以感觉是DenseBlock层写的有问题(暂时觉得可能是)。

这个问题后来发现是因为原始的denseNet网络的train.prototxt里面的卷积没有初始化,我是直接在原始的densenet的prototxt中直接修改的,所以没注意卷积是否初始化了。下图左边是没有初始化的,右边是初始化的。

初始化后的训练loss正常了,训练imagenet200类数据集:

============================================================================================

换同事发给我的他那边可以成功训练的DenseBlock层的相关文件,有点小错,提示没有变量gpu_inited,注释掉重新编译,编译成功,但是运行到DenseBlock时,新的错误出现:cudaSuccess(11 vs 0) 查找我之前博客中的cuda错误汇总,找到解决办法:https://github.com/rbgirshick/rcnn/issues/28

就是将vs中的编译架构和cuda的算力对应起来,按如下设置:

我的显卡是GTX1060,算力为6.0,所以设置compute_60,sm_60,重新编译成功。重新训练,之前的错误又出现了

有点迷,取cuda官网查了查:

眼瞎了,1060的算力是6.1啊~~~~,修改compute_61,sm_61,重新编译成功,再次训练:

还是这个错误,估计不是算力这个地方出错,但是绝对是cuda的错误(暂时搁置)

==============================================================================================

接上面的错误,后来发现这个工程的cuda依赖库整个文件夹下的lib文件都是cuda10.1的,我的环境是9.0的,而我之前只是替换了其中一个cudart.lib文件,其他文件没替换。所以,需要把这个cuda依赖库全部换成cuda9.0版本的就可以了。

接下来重新训练就ok了。 

结语

优化内存后的densenet训练快多了,batch_size可以设置16,24,但是32就不行了,会提示out of  memory。densenet-121训练为例,batch_size=16,显存占用如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值