NeuralNetwork::NeuralNetwork(std::vector<int> sizes) : nlayers_(sizes.size()), sizes_(sizes) { random_gen_ = boost::mt11213b(time(0)); // 高斯分布生成器 boost::normal_distribution<> nd(0.0, 1.0); boost::variate_generator<boost::mt11213b&, boost::normal_distribution<>> var_gen(random_gen_, nd); // 初始化基向量 for (size_t i = 1; i < sizes_.size(); ++i) { // 每一层都有一个基向量,向量中的元素对应这一层的每一个神经元 Vector biases(sizes_[i]); for (int j = 0; j < sizes_[i]; ++j) { biases(j) = var_gen(); } biases_.push_back(biases); } // 初始化权重向量 for (size_t i = 0; i < sizes_.size() - 1; ++i) { // 相邻两个层之间都有一个权重矩阵,如果第 i 层和第 i + 1 层分别有 m 和 n 个神经元, // 那么两层之间的权重矩阵的维度为 m * n Matrix weights(sizes_[i + 1], sizes_[i]); for (int row = 0; row < sizes_[i + 1]; ++row) { for (int col = 0; col < sizes_[i]; ++ col) { weights(row, col) = var_gen(); } } weights_.push_back(weights); } if (biases_.size() != weights_.size()) { std::cout << "Biases and weights size not equal!"; } }
// // visit_struct // void Stub_Dump_Generator::visit_struct (const OASIS_PDL_Struct & s) { this->hfile_ << "/// Stub_Dump method for for ::" << s.fq_name ("::") << std::endl << "void dump (std::ostream & output);" << std::endl; this->cppfile_ << function_header ("dump") << "void ::" << s.fq_name ("::") << "::" << "dump (std::ostream & output) {" << std::endl; Stub_Dump_Variable_Generator var_gen (this->hfile_, this->cppfile_); var_gen.parent_is_probe (false); std::vector <OASIS_PDL_Complex_Type_Member *>::const_iterator iter = s.members ().begin (), iter_end = s.members ().end (); for (; iter != iter_end; ++ iter) { var_gen.name ((*iter)->name ()); // Call accept on the actual child type (*iter)->type ()->accept (var_gen); } this->cppfile_ << "}"; }
// // visit_probe // void Stub_Dump_Generator::visit_probe (const OASIS_PDL_Probe & p) { // Make sure we know the base probe type. const std::string base_probe = p.has_base_probe () ? ("::" + p.base_probe ()->fq_name ("::")) : "::OASIS::Software_Probe"; const std::string & name = p.name (); this->hfile_ << std::endl << "public:" << std::endl << "/// Stub_Dump the software probe's data." << std::endl << "virtual void dump (std::ostream & output);" << std::endl; // Implementation of the dump method. this->cppfile_ << function_header ("dump") << "void " << name << "::" << "dump (std::ostream & output) {" << base_probe << "::dump (output);"; if (!p.members ().empty ()) { Stub_Dump_Variable_Generator var_gen (this->hfile_, this->cppfile_); var_gen.parent_is_probe (true); std::vector <OASIS_PDL_Complex_Type_Member *>::const_iterator iter = p.members ().begin (), iter_end = p.members ().end (); for (; iter != iter_end; ++ iter) { var_gen.name ((*iter)->name ()); // Call accept on the actual child type (*iter)->type ()->accept (var_gen); } } this->cppfile_ << "}"; }