Ошибка создания слоя кофеена

Я пытаюсь загрузить в фазе 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 вызывает другие поддерживаемые слои, но похоже, что они никогда не вызываются.
Как я мог решить это?

Спасибо!

7

Решение

Эта ошибка возникает при попытке статически связать 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.

7

Другие решения

замещать -l$(PROJECT) с $(STATIC_LINK_COMMAND) в вашем Makefile в соответствующих местах и ​​удалите ненужный теперь путь загрузки во время выполнения: -Wl,-rpath,$(ORIGIN)/../lib,

2