2017-11-08 33 views
0

私はdlibライブラリの変更例を持っています。私はone_vs_one_trainerを訓練し、派生した関数をシリアル化しようとしています。ここに私のコードの例です:Dlibで学習した関数をシリアライズできません

typedef matrix<double, 2, 1> SampleType; 
typedef radial_basis_kernel<SampleType> Kernel; 
typedef normalized_function<one_vs_one_decision_function<one_vs_one_trainer<any_trainer<SampleType>>>> LearnedFunction; 

std::vector<double> labels; 
std::vector<SampleType> samples; 

for (int r = -20; r <= 20; ++r) 
{ 
    for (int c = -20; c <= 20; ++c) 
    { 
     SampleType samp(2); 
     samp(0) = r; 
     samp(1) = c; 
     samples.push_back(samp); 

     if (sqrt((double)r*r + c*c) <= 5) 
      labels.push_back(1.0); 
     else if (sqrt((double)r*r + c*c) <= 10) 
      labels.push_back(2.0); 
     else 
      labels.push_back(3.0); 

    } 
} 

vector_normalizer<SampleType> normalizer; 
normalizer.train(samples); 
for (auto& s : samples) { 
    s = normalizer(s); 
} 

one_vs_one_trainer<any_trainer<SampleType>> trainer; 
krr_trainer<Kernel> rbf_trainer; 
rbf_trainer.set_kernel(Kernel(0.1)); 
trainer.set_trainer(rbf_trainer); 

LearnedFunction learnedFunction; 
learnedFunction.normalizer = normalizer; 
learnedFunction.function = trainer.train(samples, labels); 

serialize("saved_function.dat") << learnedFunction; 

しかし、最後の行でエラーが発生します:直列化が失敗した理由を

terminate called after throwing an instance of 'dlib::serialization_error' 
    what(): Can't serialize one_vs_one_decision_function. Not all decision functions defined. 
    while serializing an object of type one_vs_one_decision_function 
    while serializing object of type normalized_function 

あなたは知っていますか?私はどんな助けにも感謝します。

+1

これは例で説明しています:http://dlib.net/multiclass_classification_ex.cpp.html –

答えて

1

@ davis-kingのコメントのおかげで解決策が見つかりました。私は決定関数のタイプを指定する必要があります:

typedef normalized_function< 
    one_vs_one_decision_function< 
     one_vs_one_trainer<any_trainer<SampleType>>, decision_function<Kernel> 
>> LearnedFunction; 
関連する問題