Я пытаюсь загрузить в фазе 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() << ")";
Напечатанная ошибка:
F0519 14: 54: 12.494139 14504 layer_factory.hpp: 77] Проверка не удалась:
registry.count (тип) == 1 (0 против 1) Неизвестный тип слоя: свертка
(известные типы: MemoryData)
Реестр имеет только одну запись, действительно с MemoryData.
При входе в функции создания реестра, он выглядит первым (и последним, поскольку это одиночный пакет), вызываемым из
REGISTER_LAYER_CLASS(MemoryData);
в 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()
И тогда, где вы создаете свою цель:
# target
add_executable(${name} ${source})
target_link_libraries(${name} ${Caffe_LINK})
Быстрое решение состоит в том, чтобы создать и связать caffe как общую библиотеку вместо статической.
Также см эта почта.
Просто для завершения этого для компиляции MSVC на Windows:
использование / OPT: NOREF или же /ВКЛЮЧАЮТ Параметры компоновщика на целевой исполняемый файл или DLL.
замещать -l$(PROJECT)
с $(STATIC_LINK_COMMAND)
в вашем Makefile в соответствующих местах и удалите ненужный теперь путь загрузки во время выполнения: -Wl,-rpath,$(ORIGIN)/../lib
,