当我运行Caffe.exe,它这样做:Caffe是否包含静态初始化失败?
cudaDeviceProp deviceProp;
cudaGetDeviceProperties(&deviceProp, 0);
Caffe::SetDevice(0);
Caffe::set_mode(Caffe::GPU);
Net<float> caffe_net(modelFile, caffe::TEST);
caffe_net.CopyTrainedLayersFrom(weightsFile);
和所有层静态加入到LayerRegistry,一切运行正常。
但是,如果我做网络的封闭类的指针成员,并把构造函数中初始化,那么层是不静态加入到LayerRegistry:
class Foo
{
Foo();
std::unique_ptr< Net<float> > net;
}
Foo::Foo()
{
cudaDeviceProp deviceProp;
cudaGetDeviceProperties(&deviceProp, 0);
Caffe::SetDevice(0);
Caffe::set_mode(Caffe::GPU);
Net<float> caffe_net(modelFileName, caffe::TEST);
net.reset(new Net<float>(modelFileName, caffe::TEST));
net->CopyTrainedLayersFrom(weightsFileName);
}
在layer_factory *我见该层具有在宏被定义为宏REGISTER_LAYER_CREATOR:
#define REGISTER_LAYER_CREATOR(type, creator) \
static LayerRegisterer<float> g_creator_f_##type(#type, creator<float>); \
static LayerRegisterer<double> g_creator_d_##type(#type, creator<double>) \
确实来自Caffe含有static initialization fiasco?
我根本不知道'Caffe',所以带上一粒盐吧。 'Foo :: Foo()'和'REGISTER_LAYER_CREATOR'中的代码之间有什么关系? –
@RSahu Net包含静态初始化的层注册表,该注册表基于宏进行静态初始化。 Caffe是......复杂的,所以有知识的人可能需要回答。 – empty
您是否试过用'-Wl, - 不需要的(或者MSVC相当于什么)编译? –