caffe训练时候的 unknow solver type /unknown layer type错误

改进办法承接上一篇博文。这里主要记录一下解决的思路。

问题原因:好像是一些层的注册问题。

解决办法:

1. 写一个头文件,名称为caffe_reg.h,内容如下:

#pragma once
#ifndef CAFFE_REG_H
#define CAFFE_REG_H

//layer
#include<caffe/layers/conv_layer.hpp> 
#include<caffe/layers/pooling_layer.hpp>
#include<caffe/layers/lrn_layer.hpp>
#include<caffe/layers/relu_layer.hpp>
#include<caffe/layers/sigmoid_layer.hpp>
#include<caffe/layers/softmax_layer.hpp>
#include<caffe/layers/tanh_layer.hpp>
//#include<caffe/layers/python_layer.hpp>
#include<caffe/layers/absval_layer.hpp>
#include<caffe/layers/accuracy_layer.hpp>
#include<caffe/layers/argmax_layer.hpp>
#include<caffe/layers/batch_norm_layer.hpp>
#include<caffe/layers/batch_reindex_layer.hpp>
#include<caffe/layers/bias_layer.hpp>
#include<caffe/layers/bnll_layer.hpp>
#include<caffe/layers/concat_layer.hpp>
#include<caffe/layers/contrastive_loss_layer.hpp>
#include<caffe/layers/crop_layer.hpp>
#include<caffe/layers/data_layer.hpp>
#include<caffe/layers/deconv_layer.hpp>
#include<caffe/layers/dropout_layer.hpp>
#include<caffe/layers/dummy_data_layer.hpp>
#include<caffe/layers/eltwise_layer.hpp>
#include<caffe/layers/elu_layer.hpp>
#include<caffe/layers/embed_layer.hpp>
#include<caffe/layers/euclidean_loss_layer.hpp>
#include<caffe/layers/exp_layer.hpp>
#include<caffe/layers/filter_layer.hpp>
#include<caffe/layers/flatten_layer.hpp>
#include<caffe/layers/hdf5_data_layer.hpp>
#include<caffe/layers/hdf5_output_layer.hpp>
#include<caffe/layers/hinge_loss_layer.hpp>
#include<caffe/layers/im2col_layer.hpp>
#include<caffe/layers/image_data_layer.hpp>
#include<caffe/layers/infogain_loss_layer.hpp>
#include<caffe/layers/inner_product_layer.hpp>
#include<caffe/layers/input_layer.hpp>
//#include<caffe/layers/log_layer.hpp>
#include<caffe/layers/lstm_layer.hpp>
#include<caffe/layers/memory_data_layer.hpp>
#include<caffe/layers/multinomial_logistic_loss_layer.hpp>
#include<caffe/layers/mvn_layer.hpp>
#include<caffe/layers/parameter_layer.hpp>
#include<caffe/layers/power_layer.hpp>
#include<caffe/layers/prelu_layer.hpp>
#include<caffe/layers/reduction_layer.hpp>
#include<caffe/layers/reshape_layer.hpp>
#include<caffe/layers/rnn_layer.hpp>
#include<caffe/layers/scale_layer.hpp>
#include<caffe/layers/sigmoid_cross_entropy_loss_layer.hpp>
#include<caffe/layers/silence_layer.hpp>
#include<caffe/layers/slice_layer.hpp>
#include<caffe/layers/softmax_loss_layer.hpp>
#include<caffe/layers/split_layer.hpp>
#include<caffe/layers/spp_layer.hpp>
#include<caffe/layers/threshold_layer.hpp>
#include<caffe/layers/tile_layer.hpp>
#include<caffe/layers/window_data_layer.hpp>

#include<caffe/layers/margin_inner_product_layer.hpp> //sphereface中独有的层

//#include<caffe>
//solver
#include<caffe/sgd_solvers.hpp>


namespace caffe
{

    // 2 layer, 很奇怪,其他57个层可以通过extern,但这两个需要添加注册才可以。
    //extern INSTANTIATE_CLASS(DataLayer);
    //extern INSTANTIATE_CLASS(ParameterLayer);
    REGISTER_LAYER_CLASS(Data);
    REGISTER_LAYER_CLASS(Parameter);

    // 57 layers
    extern INSTANTIATE_CLASS(ConvolutionLayer);
	REGISTER_LAYER_CLASS(Convolution);
    extern INSTANTIATE_CLASS(PoolingLayer);
    extern INSTANTIATE_CLASS(LRNLayer);
    extern INSTANTIATE_CLASS(ReLULayer);
    extern INSTANTIATE_CLASS(SigmoidLayer);
    extern INSTANTIATE_CLASS(SoftmaxLayer);
	REGISTER_LAYER_CLASS(Softmax);
    extern INSTANTIATE_CLASS(TanHLayer);
    //extern INSTANTIATE_CLASS(PythonLayer);
    extern INSTANTIATE_CLASS(AbsValLayer);
    extern INSTANTIATE_CLASS(AccuracyLayer);
    extern INSTANTIATE_CLASS(ArgMaxLayer);
    extern INSTANTIATE_CLASS(BatchNormLayer);
    extern INSTANTIATE_CLASS(BatchReindexLayer);
    extern INSTANTIATE_CLASS(BiasLayer);
    extern INSTANTIATE_CLASS(BNLLLayer);
    extern INSTANTIATE_CLASS(ConcatLayer);
    extern INSTANTIATE_CLASS(ContrastiveLossLayer);
    extern INSTANTIATE_CLASS(CropLayer);


    extern INSTANTIATE_CLASS(DeconvolutionLayer);
    extern INSTANTIATE_CLASS(DropoutLayer);
    extern INSTANTIATE_CLASS(DummyDataLayer);
    extern INSTANTIATE_CLASS(EltwiseLayer);
    extern INSTANTIATE_CLASS(ELULayer);
    extern INSTANTIATE_CLASS(EmbedLayer);
    extern INSTANTIATE_CLASS(EuclideanLossLayer);
    extern INSTANTIATE_CLASS(ExpLayer);
    extern INSTANTIATE_CLASS(FilterLayer);
    extern INSTANTIATE_CLASS(FlattenLayer);
    extern INSTANTIATE_CLASS(HDF5DataLayer);
    extern INSTANTIATE_CLASS(HDF5OutputLayer);
    extern INSTANTIATE_CLASS(HingeLossLayer);
    extern INSTANTIATE_CLASS(Im2colLayer);
    extern INSTANTIATE_CLASS(ImageDataLayer);
    extern INSTANTIATE_CLASS(InfogainLossLayer);
    extern INSTANTIATE_CLASS(InnerProductLayer);
    extern INSTANTIATE_CLASS(InputLayer);
    //extern INSTANTIATE_CLASS(LogLayer);
    extern INSTANTIATE_CLASS(LSTMLayer);
    extern INSTANTIATE_CLASS(LSTMUnitLayer);
    extern INSTANTIATE_CLASS(MemoryDataLayer);
    extern INSTANTIATE_CLASS(MultinomialLogisticLossLayer);
    extern INSTANTIATE_CLASS(MVNLayer);
    extern INSTANTIATE_CLASS(PowerLayer);
    extern INSTANTIATE_CLASS(PReLULayer);
    extern INSTANTIATE_CLASS(ReductionLayer);
    extern INSTANTIATE_CLASS(ReshapeLayer);
    extern INSTANTIATE_CLASS(RNNLayer);
    extern INSTANTIATE_CLASS(ScaleLayer);
    extern INSTANTIATE_CLASS(SigmoidCrossEntropyLossLayer);
    extern INSTANTIATE_CLASS(SilenceLayer);
    extern INSTANTIATE_CLASS(SliceLayer);
    extern INSTANTIATE_CLASS(SoftmaxWithLossLayer);
    extern INSTANTIATE_CLASS(SplitLayer);
    extern INSTANTIATE_CLASS(SPPLayer);
    extern INSTANTIATE_CLASS(ThresholdLayer);
    extern INSTANTIATE_CLASS(TileLayer);
    extern INSTANTIATE_CLASS(WindowDataLayer);

	extern INSTANTIATE_CLASS(MarginInnerProductLayer);
	REGISTER_LAYER_CLASS(MarginInnerProduct);

    // 6 sovlers
    extern INSTANTIATE_CLASS(AdaDeltaSolver);
    extern INSTANTIATE_CLASS(AdaGradSolver);
    extern INSTANTIATE_CLASS(AdamSolver);
    extern INSTANTIATE_CLASS(NesterovSolver);
    extern INSTANTIATE_CLASS(RMSPropSolver);
    extern INSTANTIATE_CLASS(SGDSolver);
}

#endif

实现的功能主要是注册某些需要的层,例如刚开始冒出来的"unknown solver type SGD"错误,在加入6 solvers以后,就不会再报错了。后面又报出来的"unknown layer type"错误,只要在57个layers中包含需要的层就行,如果哪一层没有注册,就用REGISTER_LAYER_CLASS(Softmax)这样修改,类似第88、89行的注册层的写法。

2. 将caffe.reg.h保存到(caffe项目根目录)/include/caffe/caffe_reg.h中,并在此目录下的caffe.hpp中包含这个caffe_reg.h。

3. 重新编译caffe.lib。

4. 将编译好的caffe.lib改名,我改为caffe_r.lib。

5. 将caffe.bin属性的 链接器->输入中包含的caffe.lib改为caffe_r.lib。为防止“输出文件名匹配输入文件名”的错误。

6. 编译caffe.bin生成caffe.exe。

7. 调用caffe.exe,进行训练。

猜你喜欢

转载自blog.csdn.net/xiakejiang/article/details/85386340