Esempio n. 1
0
 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_
    << "}";
}