int main(void) { DBN mdbn; mdbn.load("mixed_hmm2.dbn"); std::vector<Node*> nodes = mdbn.getNodes0(); Node *h1 = nodes[0]; Node *o1 = nodes[1]; cout << "*** LOADED MODEL WITH PARAMETERS ***" << endl; cout << "h1: " << *h1 << endl; cout << "o1: " << *o1 << endl; return EXIT_SUCCESS; }
int main(void) { mocapy_seed((uint)5556575); // Number of trainining sequences int N = 500; // Sequence lengths int T = 100; // Gibbs sampling parameters int MCMC_BURN_IN = 10; // HMM hidden and observed node sizes uint H_SIZE=2; bool init_random=false; CPD th0_cpd; th0_cpd.set_shape(2); th0_cpd.set_values(vec(0.1, 0.9)); CPD th1_cpd; th1_cpd.set_shape(2,2); th1_cpd.set_values( vec(0.95, 0.05, 0.1, 0.9)); // The target DBN (This DBN generates the data) Node* th0 = NodeFactory::new_discrete_node(H_SIZE, "th0", init_random, th0_cpd); Node* th1 = NodeFactory::new_discrete_node(H_SIZE, "th1", init_random, th1_cpd); Node* to0 = NodeFactory::new_kent_node("to0"); DBN tdbn; tdbn.set_slices(vec(th0, to0), vec(th1, to0)); tdbn.add_intra("th0", "to0"); tdbn.add_inter("th0", "th1"); tdbn.construct(); // The model DBN (this DBN will be trained) // For mh0, get the CPD from th0 and fix parameters Node* mh0 = NodeFactory::new_discrete_node(H_SIZE, "mh0", init_random, CPD(), th0, true ); Node* mh1 = NodeFactory::new_discrete_node(H_SIZE, "mh1", init_random); Node* mo0 = NodeFactory::new_kent_node("mo0"); DBN mdbn; mdbn.set_slices(vec(mh0, mo0), vec(mh1, mo0)); mdbn.add_intra("mh0", "mo0"); mdbn.add_inter("mh0", "mh1"); mdbn.construct(); cout << "*** TARGET ***" << endl; cout << *th0 << endl; cout << *th1 << endl; cout << *to0 << endl; cout << "*** MODEL ***" << endl; cout << *mh0 << endl; cout << *mh1 << endl; cout << *mo0 << endl; vector<Sequence> seq_list; vector< MDArray<eMISMASK> > mismask_list; cout << "Generating data" << endl; MDArray<eMISMASK> mismask; mismask.repeat(T, vec(MOCAPY_HIDDEN, MOCAPY_OBSERVED)); // Generate the data double sum_LL(0); for (int i=0; i<N; i++) { pair<Sequence, double> seq_ll = tdbn.sample_sequence(T); sum_LL += seq_ll.second; seq_list.push_back(seq_ll.first); mismask_list.push_back(mismask); } cout << "Average LL: " << sum_LL/N << endl; GibbsRandom mcmc = GibbsRandom(&mdbn); EMEngine em = EMEngine(&mdbn, &mcmc, &seq_list, &mismask_list); cout << "Starting EM loop" << endl; double bestLL=-1000; uint it_no_improvement(0); uint i(0); // Start EM loop while (it_no_improvement<10) { em.do_E_step(1, MCMC_BURN_IN, true); double ll = em.get_loglik(); cout << "LL= " << ll; if (ll > bestLL) { cout << " * saving model *" << endl; mdbn.save("kent_hmm.dbn"); bestLL = ll; it_no_improvement=0; } else { it_no_improvement++; cout << endl; } i++; em.do_M_step(); } cout << "DONE" << endl; mdbn.load("kent_hmm.dbn"); cout << "*** TARGET ***" << endl; cout << *th0 << endl; cout << *th1 << endl; cout << *to0 << endl; cout << "*** MODEL ***" << endl; cout << *mh0 << endl; cout << *mh1 << endl; cout << *mo0 << endl; delete th0; delete th1; delete to0; delete mh0; delete mh1; delete mo0; return EXIT_SUCCESS; }
void execute(DBN& dbn, task& task, const std::vector<std::string>& actions) { print_title("Network"); dbn.display(); using dbn_t = std::decay_t<DBN>; //Execute all the actions sequentially for (auto& action : actions) { if (action == "pretrain") { print_title("Pretraining"); if (task.pretraining.samples.empty()) { std::cout << "dllp: error: pretrain is not possible without a pretraining input" << std::endl; return; } std::vector<Container> pt_samples; //Try to read the samples if (!read_samples<Three>(task.pretraining.samples, pt_samples)) { std::cout << "dllp: error: failed to read the pretraining samples" << std::endl; return; } if (task.pt_desc.denoising) { std::vector<Container> clean_samples; //Try to read the samples if (!read_samples<Three>(task.pretraining_clean.samples, clean_samples)) { std::cout << "dllp: error: failed to read the clean samples" << std::endl; return; } //Pretrain the network cpp::static_if<dbn_t::layers_t::is_denoising>([&](auto f) { f(dbn).pretrain_denoising(pt_samples.begin(), pt_samples.end(), clean_samples.begin(), clean_samples.end(), task.pt_desc.epochs); }); } else { //Pretrain the network dbn.pretrain(pt_samples.begin(), pt_samples.end(), task.pt_desc.epochs); } } else if (action == "train") { print_title("Training"); if (task.training.samples.empty() || task.training.labels.empty()) { std::cout << "dllp: error: train is not possible without samples and labels" << std::endl; return; } std::vector<Container> ft_samples; std::vector<std::size_t> ft_labels; //Try to read the samples if (!read_samples<Three>(task.training.samples, ft_samples)) { std::cout << "dllp: error: failed to read the training samples" << std::endl; return; } //Try to read the labels if (!read_labels(task.training.labels, ft_labels)) { std::cout << "dllp: error: failed to read the training labels" << std::endl; return; } using last_layer = typename dbn_t::template layer_type<dbn_t::layers - 1>; //Train the network cpp::static_if<sgd_possible<last_layer>::value>([&](auto f) { auto ft_error = f(dbn).fine_tune(ft_samples, ft_labels, task.ft_desc.epochs); std::cout << "Train Classification Error:" << ft_error << std::endl; }); } else if (action == "test") { print_title("Testing"); if (task.testing.samples.empty() || task.testing.labels.empty()) { std::cout << "dllp: error: test is not possible without samples and labels" << std::endl; return; } std::vector<Container> test_samples; std::vector<std::size_t> test_labels; //Try to read the samples if (!read_samples<Three>(task.testing.samples, test_samples)) { std::cout << "dllp: error: failed to read the test samples" << std::endl; return; } //Try to read the labels if (!read_labels(task.testing.labels, test_labels)) { std::cout << "dllp: error: failed to read the test labels" << std::endl; return; } auto classes = dbn_t::output_size(); etl::dyn_matrix<std::size_t, 2> conf(classes, classes, 0.0); std::size_t n = test_samples.size(); std::size_t tp = 0; for (std::size_t i = 0; i < test_samples.size(); ++i) { auto sample = test_samples[i]; auto label = test_labels[i]; auto predicted = dbn.predict(sample); if (predicted == label) { ++tp; } ++conf(label, predicted); } double test_error = (n - tp) / double(n); std::cout << "Error rate: " << test_error << std::endl; std::cout << "Accuracy: " << (1.0 - test_error) << std::endl << std::endl; std::cout << "Results per class" << std::endl; double overall = 0.0; std::cout << " | Accuracy | Error rate |" << std::endl; for (std::size_t l = 0; l < classes; ++l) { std::size_t total = etl::sum(conf(l)); double acc = (total - conf(l, l)) / double(total); std::cout << std::setw(3) << l; std::cout << "|" << std::setw(10) << (1.0 - acc) << "|" << std::setw(12) << acc << "|" << std::endl; overall += acc; } std::cout << std::endl; std::cout << "Overall Error rate: " << overall / classes << std::endl; std::cout << "Overall Accuracy: " << 1.0 - (overall / classes) << std::endl << std::endl; std::cout << "Confusion Matrix (%)" << std::endl << std::endl; std::cout << " "; for (std::size_t l = 0; l < classes; ++l) { std::cout << std::setw(5) << l << " "; } std::cout << std::endl; for (std::size_t l = 0; l < classes; ++l) { std::size_t total = etl::sum(conf(l)); std::cout << std::setw(3) << l << "|"; for (std::size_t p = 0; p < classes; ++p) { std::cout << std::setw(5) << std::setprecision(2) << 100.0 * (conf(l, p) / double(total)) << "|"; } std::cout << std::endl; } std::cout << std::endl; } else if (action == "save") { print_title("Save Weights"); dbn.store(task.w_desc.file); std::cout << "Weights saved" << std::endl; } else if (action == "load") { print_title("Load Weights"); dbn.load(task.w_desc.file); std::cout << "Weights loaded" << std::endl; } else { std::cout << "dllp: error: Invalid action: " << action << std::endl; } } //TODO }