dlib官方使用resnet訓練人臉識別,訓練了300萬的數據,網絡參數保存在dlib_face_recognition_resnet_model_v1.dat中。
測試中識別lfw數據時,準確率能達到99.13%,可是在識別本身的數據時,準確率有點低,想在此基礎上使用本身的數據經行微調。
通過一番瞎搞,最終失敗了(本人是個AI小白)。c++
緣由是訓練網絡和測試網絡不同,dlib_face_recognition_resnet_model_v1.dat中保存的是測試網絡的序列化參數。
訓練網絡和測試網絡的代碼實現以下web
template <template <int,template<typename>class,int,typename> class block, int N, template<typename>class BN, typename SUBNET> using residual = add_prev1<block<N,BN,1,tag1<SUBNET>>>; template <template <int,template<typename>class,int,typename> class block, int N, template<typename>class BN, typename SUBNET> using residual_down = add_prev2<avg_pool<2,2,2,2,skip1<tag2<block<N,BN,2,tag1<SUBNET>>>>>>; template <int N, template <typename> class BN, int stride, typename SUBNET> using block = BN<con<N,3,3,1,1,relu<BN<con<N,3,3,stride,stride,SUBNET>>>>>; template <int N, typename SUBNET> using res = relu<residual<block,N,bn_con,SUBNET>>; template <int N, typename SUBNET> using ares = relu<residual<block,N,affine,SUBNET>>; template <int N, typename SUBNET> using res_down = relu<residual_down<block,N,bn_con,SUBNET>>; template <int N, typename SUBNET> using ares_down = relu<residual_down<block,N,affine,SUBNET>>; // ---------------------------------------------------------------------------------------- template <typename SUBNET> using level0 = res_down<256,SUBNET>; template <typename SUBNET> using level1 = res<256,res<256,res_down<256,SUBNET>>>; template <typename SUBNET> using level2 = res<128,res<128,res_down<128,SUBNET>>>; template <typename SUBNET> using level3 = res<64,res<64,res<64,res_down<64,SUBNET>>>>; template <typename SUBNET> using level4 = res<32,res<32,res<32,SUBNET>>>; template <typename SUBNET> using alevel0 = ares_down<256,SUBNET>; template <typename SUBNET> using alevel1 = ares<256,ares<256,ares_down<256,SUBNET>>>; template <typename SUBNET> using alevel2 = ares<128,ares<128,ares_down<128,SUBNET>>>; template <typename SUBNET> using alevel3 = ares<64,ares<64,ares<64,ares_down<64,SUBNET>>>>; template <typename SUBNET> using alevel4 = ares<32,ares<32,ares<32,SUBNET>>>; // training network type using net_type = loss_metric<fc_no_bias<128,avg_pool_everything< level0< level1< level2< level3< level4< max_pool<3,3,2,2,relu<bn_con<con<32,7,7,2,2, input_rgb_image >>>>>>>>>>>>; // testing network type (replaced batch normalization with fixed affine transforms) using anet_type = loss_metric<fc_no_bias<128,avg_pool_everything< alevel0< alevel1< alevel2< alevel3< alevel4< max_pool<3,3,2,2,relu<affine<con<32,7,7,2,2, input_rgb_image >>>>>>>>>>>>;
訓練網絡net_type和測試網絡anet_type的主要卻別是,affine代替了bn_con(用固定仿射變換代替批量標準化)shell
若是將dlib_face_recognition_resnet_model_v1.dat並行化到net_type上運行時會報錯,而後崩潰網絡
terminate called after throwing an instance of 'dlib::serialization_error' what(): An error occurred while trying to read the first object from the file dlib_face_recognition_resnet_model_v1.dat. ERROR: Unexpected version 'affine_' found while deserializing dlib::bn_. Aborted (core dumped)
從錯誤打印能夠看出dlib_face_recognition_resnet_model_v1.dat中保存的是affine_,即測試網絡。ide
在dlib官方demo:dnn_metric_learning_on_images_ex.cpp中有svg
anet_type testing_net = net;
說明 訓練網絡net_type 能夠自動轉換成 測試網絡anet_type
緣由是dlib源碼中有bn_轉affine_的代碼測試
class affine_ { public: template < layer_mode bnmode > affine_( const bn_<bnmode>& item ) ...
將dlib_face_recognition_resnet_model_v1.dat並行化到測試網絡anet_type上能夠正常運行,若是能將測試網絡anet_type轉化成訓練網絡net_type,就能夠實現了。
本人小白,尚未找到方法。。。spa