【边喝caffee边Caffe 】(三) Check failed: registry.count(t ype) == 1 (0 vs. 1) Unknown layer type

    自己建立一个工程,希望调用libcaffe.lib ,各种配置好,也能成功编译,但是运行就会遇到报错


F0519 14:54:12.494139 14504 layer_factory.hpp:77] Check failed: registry.count(t ype) == 1 (0 vs. 1) Unknown layer type: Input (known types: Input )


   各种跟踪调试都找不到原因,相同的代码在microsoft版本的caffe里使用就没有问题,自己新建一个项目就出

错。


   网上找了一下原因,大概是libcaffe.lib是静态库的方式编译的,有一些东西没法使用,暂时只能肤浅的这么


理解。我试过改成动态库,编译都通不过了。


一些参考方案:

http://stackoverflow.com/questions/30325108/caffe-layer-creation-failure

http://stackoverflow.com/questions/32416226/create-layer-error-at-layer-factory-hpp

https://groups.google.com/forum/#!topic/caffe-users/Py6IwMQvtqo/discussion


尝试了不少,都不怎么给力。


我甚至在github项目下提问




官方答复是只能在解决方案里面新建项目。


当然,最后我找到了一个办法,



一开始没有太看明白这是什么意思。


  后来仔细看了一下libcaffe工程的目录结构,发现有个layer目录,里面放的都是各种层,什么ArgMaxLayer,


ScaleLayer,当然也有InputLayer,感觉很有可能问题就出在这些代码里面,仔细阅读input_layer.cpp,果然发现


有一句

INSTANTIATE_CLASS(InputLayer);
 REGISTER_LAYER_CLASS(Input);


所以解决方案就是,新建一个头文件,例如head.h,将他提示你没有的层的头文件包含进去,在添加类似于


extern INSTANTIATE_CLASS(InputLayer);的这句话


后来发现有的层添加了也会报错,那是因为他们没有类似于REGISTER_LAYER_CLASS(Input);这句话。可以想象,


REGISTER_LAYER_CLASS这句话作用就是注册layer。可以添加进去。


我贴上我的head.h,添加了我使用到的layer

#include "caffe/common.hpp"
#include "caffe/layers/input_layer.hpp"
#include "caffe/layers/inner_product_layer.hpp"
#include "caffe/layers/dropout_layer.hpp"
#include "caffe/layers/conv_layer.hpp"
#include "caffe/layers/relu_layer.hpp"

#include "caffe/layers/pooling_layer.hpp"
#include "caffe/layers/lrn_layer.hpp"
#include "caffe/layers/softmax_layer.hpp"


namespace caffe
{

	extern INSTANTIATE_CLASS(InputLayer);
	extern INSTANTIATE_CLASS(InnerProductLayer);
	extern INSTANTIATE_CLASS(DropoutLayer);
	extern INSTANTIATE_CLASS(ConvolutionLayer);
	REGISTER_LAYER_CLASS(Convolution);
	extern INSTANTIATE_CLASS(ReLULayer);
	REGISTER_LAYER_CLASS(ReLU);
	extern INSTANTIATE_CLASS(PoolingLayer);
	REGISTER_LAYER_CLASS(Pooling);
	extern INSTANTIATE_CLASS(LRNLayer);
	REGISTER_LAYER_CLASS(LRN);
	extern INSTANTIATE_CLASS(SoftmaxLayer);
	REGISTER_LAYER_CLASS(Softmax);

}


你所使用的layer可能跟我不一样,但是解决方法是一样的,提示哪个layer找不到,就把那个layer添加进来就是


了。


彻底一点的方案是把所有的layer全写进来。


   我在添加过程中,之前在每个extern INSTANTIATE_CLASS 后面都添加 REGISTER_LAYER_CLASS,结果报错,说


重复注册。于是删掉了。


所以,如果你以后遇到没有注册的layer,就照上面做就好了,万一遇到重复注册,也应该会举一反三,知道如何解


决,例如把判断重复注册的语句修改一下等等。





  • 11
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 49
    评论
### 回答1: 将PyTorch模型转换为Caffe模型的主要原因可能是因为Caffe在某些领域具有优势,例如在嵌入式设备上的部署。Caffe是一个轻量级的框架,适用于在移动设备或低功耗设备上运行。另外,某些硬件加速器(如NVIDIA的TensorRT)也支持Caffe模型的部署。因此,如果需要将模型部署到这些硬件上,将PyTorch模型转换为Caffe模型可能是有意义的。 ### 回答2: 将PyTorch模型转换为Caffe主要有以下几个原因: 1. 平台兼容性:Caffe是一款广泛使用的深度学习框架,拥有大量的用户和应用案例。将PyTorch模型转换为Caffe格式可以使模型在Caffe平台上运行,便于与其他Caffe用户进行交流和分享。同时,Caffe支持多种硬件平台,如CPU和GPU,可以提供更大的灵活性和可移植性。 2. 部署效率:Caffe是一个高效的深度学习框架,拥有高度优化的计算和内存管理,适用于快速、有效的部署。通过将PyTorch模型转换为Caffe,可以获得更好的推理性能,在一些资源有限的场景中能够更快速地进行模型推理。 3. 模型优化:转换为Caffe格式后,可以利用Caffe提供的一些模型优化工具。例如,Caffe提供了网络剪枝和量化算法,可以减少模型的参数和计算量,提高模型的推理速度和效率。另外,Caffe还支持模型融合和层级特征提取等技术,可以对模型进行更深入的性能优化。 需要注意的是,将PyTorch转换为Caffe并不是一项简单的任务,因为两个框架的计算图和模型定义方式存在差异。转换过程需要考虑到各种层次的差异,如网络结构、参数传递和激活函数等。因此,转换的过程可能需要一些手动的调整和微调,才能保持模型的正确性和性能。
评论 49
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值