Caffe编译中的in expansion of macro ‘STUB_GPU_BACKWARD’类型错误解决方案

[  1%] Building CXX object src/caffe/CMakeFiles/caffe.dir/layers/sigmoid_cross_entropy_loss_layer.cpp.o
In file included from /home/lzh/Caffe/hed-master/include/caffe/common.hpp:19:0,
                 from /home/lzh/Caffe/hed-master/include/caffe/blob.hpp:8,
                 from /home/lzh/Caffe/hed-master/include/caffe/layer.hpp:9,
                 from /home/lzh/Caffe/hed-master/src/caffe/layers/sigmoid_cross_entropy_loss_layer.cpp:5:
/home/lzh/Caffe/hed-master/include/caffe/util/device_alternate.hpp:30:39: error: no ‘void caffe::SigmoidCrossEntropyLossLayer<Dtype>::Backward_gpu(const std::vector<caffe::Blob<Dtype>*>&, const std::vector<bool>&, const std::vector<caffe::Blob<Dtype>*>&)’ member function declared in class ‘caffe::SigmoidCrossEntropyLossLayer<Dtype>const vector<Blob<Dtype>*>& bottom) { NO_GPU; } \
                                       ^
/home/lzh/Caffe/hed-master/src/caffe/layers/sigmoid_cross_entropy_loss_layer.cpp:121:1: note: in expansion of macro ‘STUB_GPU_BACKWARD’
 STUB_GPU_BACKWARD(SigmoidCrossEntropyLossLayer, Backward);
 ^
src/caffe/CMakeFiles/caffe.dir/build.make:566: recipe for target 'src/caffe/CMakeFiles/caffe.dir/layers/sigmoid_cross_entropy_loss_layer.cpp.o' failed
make[2]: *** [src/caffe/CMakeFiles/caffe.dir/layers/sigmoid_cross_entropy_loss_layer.cpp.o] Error 1
CMakeFiles/Makefile2:272: recipe for target 'src/caffe/CMakeFiles/caffe.dir/all' failed
make[1]: *** [src/caffe/CMakeFiles/caffe.dir/all] Error 2
Makefile:127: recipe for target 'all' failed
make: *** [all] Error 2

1.解决方案

这里以上面的错误为例,其他类似的错误解决方法大同小异!

首先打开include/caffe/loss_layers.hpp,然后找到SigmoidCrossEntropyLossLayer类,取消下面的注释即可

  //virtual void Backward_gpu(const vector<Blob<Dtype>*>& top,
      //const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom);

2.错误分析

同样还是以这个错误为例!

其实下面这句话已经说的很明白了,意思就是在SigmoidCrossEntropyLossLayer类里面没有Backward_gpu()这个函数

device_alternate.hpp:30:39: error: no ‘void caffe::SigmoidCrossEntropyLossLayer<Dtype>::Backward_gpu(const std::vector<caffe::Blob<Dtype>*>&, const std::vector<bool>&, const std::vector<caffe::Blob<Dtype>*>&)’ member function declared in class 

所以我们只要在定义SigmoidCrossEntropyLossLayer类的地方加上这个函数即可,一般在类的定义处都会有被注释的这个函数,若是没有,手动加上即可.

需要注意一点的是,loss类的layer定义在loss_layers.hpp里;卷积类的layer定义在vision_layers.hpp里;data类的layer定义在data_layers.hpp里

最后这是针对旧版caffe的,若是新版的caffe(每一个layer都有对应的hpp和cpp),大家自行变通一下,反正原理都差不多的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: “note: in expansion of macro” 的意思是“注意:在宏展开”。它通常出现在编程语言,表示在宏定义进行宏展开时需要注意的事项。在宏展开过程,可能会出现一些意想不到的问题,需要仔细检查和调试。 ### 回答2: “Expansion of macro”(宏的展开)这个概念很常见于程序设计,是指编写程序时使用的一种特殊的技术。在程序编写过程,我们经常需要编写一些重复性的代码,这些代码里面有一些变量是可以重复利用的,为了解决这类问题,程序员通常会使用“宏”技术。 宏是一种可以自动替换一段代码的语句。在宏的使用过程,程序员可以将一段代码封装起来,用宏的方式调用这段代码,使代码的可读性和可维护性都得到增强。 宏的展开是指,程序在运行时会将宏调用语句替换为对应的代码语句,这个过程就叫做宏的展开。展开过程一般是由编译器或解释器完成的,这个过程可以将程序编写时定义的宏自动转换成真正的代码片段。 因此,展开宏可以帮助程序员降低代码的复杂度,缩短代码的长度,最终提高程序的效率。同时,宏也是一种智能化的编程方式,可以在编写程序的过程提高效率,减少出错的可能性和避免代码的重复性。 总之,“宏的展开”在程序设计是一个非常重要的技术,它可以帮助程序员提高代码的可读性和可维护性,同时还能够帮助程序员有效地节约时间和精力,是程序开发不可或缺的一部分。 ### 回答3: “在宏扩展”意味着在计算机编程使用了宏来扩展代码。宏是一种用于自动化代码编写的预处理器指令,它们允许程序员在编译代码之前对代码进行转换。使用宏可以简化代码编写,使代码更容易维护和修改。 在宏扩展的过程,程序员可以使用预定义的宏或自己定义的宏。预定义的宏包括如下所示: 1. __FILE__:当前源文件的文件名。 2. __LINE__:当前源代码行号。 3. __DATE__:当前编译日期。 4. __TIME__:当前编译时间。 自定义宏通常使用#define指令定义。以下是一个简单的例子: #define MAX(x, y) ((x) > (y) ? (x) : (y)) 该宏定了一个比较大小的函数,可以比较两个数的大小并返回较大的值。 使用宏扩展时需要注意一些问题。例如,宏可以使代码更加难以阅读,因为它们可以使代码变得混乱且难以理解。此外,如果不小心定义了一个重复的宏,可能会导致代码出现错误,特别是在复杂的程序。 总之,在宏扩展,宏提供了一种有效的方法来自动化代码生成和转换。随着使用宏的经验增加,程序员可以更加熟练地使用宏来编写更高效、更易于维护的代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值