7

最初にメモリ データ レイヤー、次に畳み込みレイヤーを持つネットワーク構成を 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(type) == 1 (0 対 1) 不明なレイヤー タイプ: 畳み込み (既知のタイプ: MemoryData)

レジストリには、実際には MemoryData を使用して、1 つのエントリしかありません。レジストリ作成関数にステップインすると、最初に (そして最後に、これはシングルトーンであるため) 呼び出されたように見えます。

REGISTER_LAYER_CLASS(MemoryData);

memory_data_later.cpp で。

サポートされている他のレイヤーでも同様REGISTER_LAYER_CLASSの呼び出しが見られますが、呼び出されていないようです。どうすれば解決できますか?

ありがとう!

4

2 に答える 2

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 をビルドしてリンクすることです。

この投稿も参照してください。

Windows での MSVC コンパイルのためにこれを完了するには:ターゲットの実行可能ファイルまたは dll で/OPT:NOREFまたは/INCLUDEリンカー オプションを使用します。

于 2015-05-22T10:50:11.197 に答える