テストフェーズでネットワークをロードしようとしています最初にメモリデータ層、次に畳み込み層を持つ構成。 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(t ype)== 1(0対1)不明なレイヤータイプ:畳み込み (既知のタイプ:MemoryData)
レジストリにはエントリが1つだけあり、実際にはMemoryDataがあります。 レジストリ作成関数にステップインすると、最初に(そしてこれはシングルトーンなので最後に)呼び出されたように見えます
REGISTER_LAYER_CLASS(MemoryData);
memory_data_later.cpp内。
私は似ていると思います REGISTER_LAYER_CLASS
サポートされている他のレイヤーを要求しますが、呼び出されないようです。 どうすれば解決できますか?
ありがとう!
回答:
回答№1の場合は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コンパイルのためにこれを完了するためだけに: 使用する / OPT:NOREF または /含める ターゲット実行可能ファイルまたはdllのリンカーオプション。
回答№2については2
置換 -l$(PROJECT)
〜と $(STATIC_LINK_COMMAND)
Makefileの適切な場所に配置し、不要になったランタイムロードパスを削除します。 -Wl,-rpath,$(ORIGIN)/../lib
.