rke*_*erm 7 c++ layer deep-learning caffe
我试图在TEST阶段加载一个网络配置,首先是一个内存数据层,然后是一个卷积层.MemoryData层创建成功,但卷积层的创建在以下位置失败:
LOG(INFO) << "Creating layer " << param.name();
const string& type = param.type();
CreatorRegistry& registry = Registry();
CHECK_EQ(registry.count(type), 1) << "Unknown layer type: " << type
<< " (known types: " << LayerTypeList() << ")";
Run Code Online (Sandbox Code Playgroud)
印刷错误是:
F0519 14:54:12.494139 14504 layer_factory.hpp:77]检查失败:registry.count(t ype)== 1(0对1)未知图层类型:卷积(已知类型:MemoryData)
注册表只有一个条目,确实有MemoryData.当进入注册表创建函数时,它看起来像是第一个(也就是最后一个,因为这是一个单一的)来自
REGISTER_LAYER_CLASS(MemoryData);
Run Code Online (Sandbox Code Playgroud)
在memory_data_later.cpp中.
我看到REGISTER_LAYER_CLASS其他支持的图层的类似调用,但看起来它们从未被调用过.我该怎么解决?
谢谢!
尝试将caffe静态链接到可执行文件时发生此错误.您需要传递额外的链接器标志以确保包含层注册代码.
如果您正在使用cmake,请查看Targets.cmake:
###########################################################################################
# Defines global Caffe_LINK flag, This flag is required to prevent linker from excluding
# some objects which are not addressed directly but are registered via static constructors
if(BUILD_SHARED_LIBS)
set(Caffe_LINK caffe)
else()
if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
set(Caffe_LINK -Wl,-force_load caffe)
elseif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
set(Caffe_LINK -Wl,--whole-archive caffe -Wl,--no-whole-archive)
endif()
endif()
Run Code Online (Sandbox Code Playgroud)
然后在哪里创建目标:
# target
add_executable(${name} ${source})
target_link_libraries(${name} ${Caffe_LINK})
Run Code Online (Sandbox Code Playgroud)
一个快速的解决方案是构建和链接caffe作为共享库而不是静态.
另见这篇文章.
只是为了在Windows上完成MSVC编译:在目标可执行文件或dll上使用/ OPT:NOREF或/ INCLUDE链接器选项.