私はSVM(opencvのtrain_auto)を2回トレーニングしています。SVMトレーニングの時間は入力データの内容に依存しますか?
私は同じパラメータ: C = 0.01,100000反復、32個のフィーチャ、および24550個のサンプルを使用します。 しかし、異なる入力サンプル。初めてトレーニングデータと2回目のトレーニングデータを使用するのは初めてですが、最初の手順と同じ量のトレーニングデータが含まれています。
最初のトレーニングは約2時間後に終了します。 2番目は無限に(10時間以上)実行されます。これはどのように可能で、どのように問題を解決することができますか?
挨拶、 シュテフィ
編集いくつかのコード:
void SVMtrain(bool retraining) {
int factor_pos = 5;
int factor_neg = 10;
std::string line;
int N_pos = 2474;
N_pos *= factor_pos;
int N_neg = 0;
std::ifstream myfile2(LIST_NEG);
while (std::getline(myfile2, line))
++N_neg;
N_neg *= factor_neg;
Mat points = createFirstSet(N_pos, N_neg, factor_pos, factor_neg);
Mat labels = createFirstLabels(N_pos, N_neg);
Mat all_neg;
if (retraining) {
Mat hardNegatives = find_hardNegatives();
hardNegatives.copyTo(points(Rect(0, points.rows - (MAX_HARD_NEG+1), hardNegatives.cols, hardNegatives.rows)));
}
// Train with SVM
CvSVMParams params;
params.svm_type = CvSVM::C_SVC;
params.kernel_type = CvSVM::LINEAR;
params.C = 0.01; //best option according to Dalal and Triggs
params.term_crit = cvTermCriteria(CV_TERMCRIT_ITER, iterations, 1e-6);
CvSVM SVM;
if (retraining) {
cout << "Training SVM with " << points.rows << " Datapoints... (" << N_pos << ", " << points.rows - N_pos << ") since: " << getTimeFormatted()<< endl;
SVM.train_auto(points, labels, Mat(), Mat(), params);
SVM.save(SVM_2_LOCATION);
}
else {
cout << "Training SVM with " << points.rows << " Datapoints... (" << N_pos << ", " << N_neg << ") since: " << getTimeFormatted() << endl;
SVM.train_auto(points, labels, Mat(), Mat(), params);
SVM.save(SVM_LOCATION);
}
cout << "finished training at " << getTimeFormatted() << endl << endl;
}
データが線形に分離できないと思うなら、** RBF **カーネルを試してみることをお勧めします。また、フラグの組み合わせを試すこともできます(例:iterations + EPS)。 –
しかしRBFは通常線形より時間がかかりますね。しかし、私は試してみる。あなたのおかげでありがとう。あなたの答えは – Steffi