Commit 73551a87 authored by Davis King's avatar Davis King

This is a minor change. All it does is slightly change the stopping condition

used by the svm_c_linear_trainer so that the epsilon value is not implicitly
scaled by the C values given by the user.  This should make this object
slightly easier to use.
parent 835e0bd8
...@@ -48,8 +48,9 @@ namespace dlib ...@@ -48,8 +48,9 @@ namespace dlib
) : ) :
samples(samples_), samples(samples_),
labels(labels_), labels(labels_),
Cpos(C_pos), C(std::min(C_pos,C_neg)),
Cneg(C_neg), Cpos(C_pos/C),
Cneg(C_neg/C),
be_verbose(be_verbose_), be_verbose(be_verbose_),
eps(eps_), eps(eps_),
max_iterations(max_iter) max_iterations(max_iter)
...@@ -61,7 +62,7 @@ namespace dlib ...@@ -61,7 +62,7 @@ namespace dlib
virtual scalar_type get_c ( virtual scalar_type get_c (
) const ) const
{ {
return 1; return C;
} }
virtual long get_num_dimensions ( virtual long get_num_dimensions (
...@@ -292,6 +293,7 @@ namespace dlib ...@@ -292,6 +293,7 @@ namespace dlib
const in_sample_vector_type& samples; const in_sample_vector_type& samples;
const in_scalar_vector_type& labels; const in_scalar_vector_type& labels;
const scalar_type C;
const scalar_type Cpos; const scalar_type Cpos;
const scalar_type Cneg; const scalar_type Cneg;
...@@ -349,7 +351,7 @@ namespace dlib ...@@ -349,7 +351,7 @@ namespace dlib
Cpos = 1; Cpos = 1;
Cneg = 1; Cneg = 1;
verbose = false; verbose = false;
eps = 0.001; eps = 0.0001;
max_iterations = 10000; max_iterations = 10000;
learn_nonnegative_weights = false; learn_nonnegative_weights = false;
last_weight_1 = false; last_weight_1 = false;
...@@ -370,7 +372,7 @@ namespace dlib ...@@ -370,7 +372,7 @@ namespace dlib
Cpos = C; Cpos = C;
Cneg = C; Cneg = C;
verbose = false; verbose = false;
eps = 0.001; eps = 0.0001;
max_iterations = 10000; max_iterations = 10000;
learn_nonnegative_weights = false; learn_nonnegative_weights = false;
last_weight_1 = false; last_weight_1 = false;
......
...@@ -49,7 +49,7 @@ namespace dlib ...@@ -49,7 +49,7 @@ namespace dlib
- #get_oca() == oca() (i.e. an instance of oca with default parameters) - #get_oca() == oca() (i.e. an instance of oca with default parameters)
- #get_c_class1() == 1 - #get_c_class1() == 1
- #get_c_class2() == 1 - #get_c_class2() == 1
- #get_epsilon() == 0.001 - #get_epsilon() == 0.0001
- this object will not be verbose unless be_verbose() is called - this object will not be verbose unless be_verbose() is called
- #get_max_iterations() == 10000 - #get_max_iterations() == 10000
- #learns_nonnegative_weights() == false - #learns_nonnegative_weights() == false
...@@ -68,7 +68,7 @@ namespace dlib ...@@ -68,7 +68,7 @@ namespace dlib
- #get_oca() == oca() (i.e. an instance of oca with default parameters) - #get_oca() == oca() (i.e. an instance of oca with default parameters)
- #get_c_class1() == C - #get_c_class1() == C
- #get_c_class2() == C - #get_c_class2() == C
- #get_epsilon() == 0.001 - #get_epsilon() == 0.0001
- this object will not be verbose unless be_verbose() is called - this object will not be verbose unless be_verbose() is called
- #get_max_iterations() == 10000 - #get_max_iterations() == 10000
- #learns_nonnegative_weights() == false - #learns_nonnegative_weights() == false
......
...@@ -110,7 +110,7 @@ namespace ...@@ -110,7 +110,7 @@ namespace
svm_c_linear_trainer<sparse_linear_kernel<sparse_sample_type> > trainer; svm_c_linear_trainer<sparse_linear_kernel<sparse_sample_type> > trainer;
trainer.set_c(1e4); trainer.set_c(1e4);
//trainer.be_verbose(); //trainer.be_verbose();
trainer.set_epsilon(1e-8); trainer.set_epsilon(1e-11);
double obj; double obj;
...@@ -182,13 +182,13 @@ namespace ...@@ -182,13 +182,13 @@ namespace
svm_c_linear_trainer<linear_kernel<sample_type> > trainer; svm_c_linear_trainer<linear_kernel<sample_type> > trainer;
trainer.set_c(1e4); trainer.set_c(1e4);
//trainer.be_verbose(); //trainer.be_verbose();
trainer.set_epsilon(1e-8); trainer.set_epsilon(1e-11);
double obj; double obj;
decision_function<linear_kernel<sample_type> > df = trainer.train(samples, labels, obj); decision_function<linear_kernel<sample_type> > df = trainer.train(samples, labels, obj);
dlog << LDEBUG << "obj: "<< obj; dlog << LDEBUG << "obj: "<< obj;
DLIB_TEST_MSG(abs(obj - 0.72222222222) < 1e-8, obj); DLIB_TEST_MSG(abs(obj - 0.72222222222) < 1e-8, abs(obj - 0.72222222222));
// There shouldn't be any margin violations since this dataset is so trivial. So that means the objective // There shouldn't be any margin violations since this dataset is so trivial. So that means the objective
// should be exactly the squared norm of the decision plane (times 0.5). // should be exactly the squared norm of the decision plane (times 0.5).
DLIB_TEST_MSG(abs(length_squared(df.basis_vectors(0))*0.5 + df.b*df.b*0.5 - 0.72222222222) < 1e-8, DLIB_TEST_MSG(abs(length_squared(df.basis_vectors(0))*0.5 + df.b*df.b*0.5 - 0.72222222222) < 1e-8,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment