There is a small bug in the softtarget trainer.
After the pre-run cross validation, the qnmultitrn stopped and gave out the error "segmentation fault".
This bug is simply because that in the file "QN_trn.cc", in the function(begins at line 598):
////////////////////////////////////////////////////////////////
// "Soft training" object - trains using continuous targets.
QN_SoftSentTrainer::QN_SoftSentTrainer(int a_debug, const char* a_dbgname,
int a_verbose,
QN_MLP* a_mlp,
QN_InFtrStream* a_train_ftr_str,
QN_InFtrStream* a_train_targ_str,
QN_InFtrStream* a_cv_ftr_str,
QN_InFtrStream* a_cv_targ_str,
QN_RateSchedule* a_lr_sched,
float a_targ_low, float a_targ_high,
const char* a_wlog_template,
QN_WeightFileType a_wfile_format,
const char* a_ckpt_template,
QN_WeightFileType a_ckpt_format,
unsigned long a_ckpt_secs,
size_t a_bunch_size,
float* a_lrscale)
: clog(a_debug, "QN_SoftSentTrainer", a_dbgname),
...
Two variable
debug and
dbgname is not initialized. As debug is an integer, the uninitialized variable did not cause big problem. However, dbgname is a pointer which casued the "Segmentation fault".
To fix this bug only add the following two blue lines in the code.
:
debug(a_debug),
dbgname(a_dbgname), clog(a_debug, "QN_SoftSentTrainer", a_dbgname),
...