Caffe层创建失败
Caffe layer creation failure
我正在尝试在测试阶段加载网络配置,该网络配置首先具有内存数据层,然后是卷积层。 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() << ")";
打印错误为:
F0519 14:54:12.494139 14504 layer_factory.hpp:77] Check failed:
registry.count(t ype) == 1 (0 vs. 1) Unknown layer type: Convolution
(known types: MemoryData)
registry只有一个条目,确实是MemoryData。
当进入注册表创建函数时,它看起来像是从
调用的第一个(也是最后一个,因为这是一个单例)
REGISTER_LAYER_CLASS(MemoryData);
在 memory_data_later.cpp.
我看到对其他受支持层的类似 REGISTER_LAYER_CLASS
调用,但看起来它们从未被调用过。
我该如何解决?
谢谢!
尝试将 link caffe 静态地转换为可执行文件时会发生此错误。您需要传递额外的 linker 标志以确保包含层注册代码。
如果您使用的是 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()
然后是创建目标的位置:
# target
add_executable(${name} ${source})
target_link_libraries(${name} ${Caffe_LINK})
一个快速的解决方案是构建 link caffe 作为共享库而不是静态库。
另见 this post。
只是为了在 Windows 上完成 MSVC 编译:
在目标可执行文件或 dll 上使用 /OPT:NOREF or /INCLUDE linker 选项。
在 Makefile 的适当位置用 $(STATIC_LINK_COMMAND)
替换 -l$(PROJECT)
,并删除现在不需要的运行时加载路径:-Wl,-rpath,$(ORIGIN)/../lib
。
我正在尝试在测试阶段加载网络配置,该网络配置首先具有内存数据层,然后是卷积层。 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() << ")";
打印错误为:
F0519 14:54:12.494139 14504 layer_factory.hpp:77] Check failed: registry.count(t ype) == 1 (0 vs. 1) Unknown layer type: Convolution (known types: MemoryData)
registry只有一个条目,确实是MemoryData。 当进入注册表创建函数时,它看起来像是从
调用的第一个(也是最后一个,因为这是一个单例)REGISTER_LAYER_CLASS(MemoryData);
在 memory_data_later.cpp.
我看到对其他受支持层的类似 REGISTER_LAYER_CLASS
调用,但看起来它们从未被调用过。
我该如何解决?
谢谢!
尝试将 link caffe 静态地转换为可执行文件时会发生此错误。您需要传递额外的 linker 标志以确保包含层注册代码。
如果您使用的是 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()
然后是创建目标的位置:
# target
add_executable(${name} ${source})
target_link_libraries(${name} ${Caffe_LINK})
一个快速的解决方案是构建 link caffe 作为共享库而不是静态库。
另见 this post。
只是为了在 Windows 上完成 MSVC 编译: 在目标可执行文件或 dll 上使用 /OPT:NOREF or /INCLUDE linker 选项。
在 Makefile 的适当位置用 $(STATIC_LINK_COMMAND)
替换 -l$(PROJECT)
,并删除现在不需要的运行时加载路径:-Wl,-rpath,$(ORIGIN)/../lib
。