• modernC++手撸任意层神经网络22前向传播反向传播&梯度下降等23代码补全的例子0901b


    以下神经网络代码,请添加输入:{{1,0},{1,1}},输出{1,0};添加反向传播,梯度下降等训练!

    1. 以下神经网络代码,请添加输入:{{1,0},{1,1}},输出{1,0};添加反向传播,梯度下降等训练!
    2. #include
    3. #include
    4. #include
    5. #include
    6. #include
    7. using namespace std;
    8. Eigen::MatrixXd forwardPropagation(const std::vector& weights, const Eigen::VectorXd& input) {
    9. Eigen::MatrixXd output = input;
    10. for (const auto& w : weights) {
    11. output.conservativeResize(output.rows(), 1); // Make sure it's a column vector
    12. output = w * output;
    13. output = output.unaryExpr([](double x) { return 1.0 / (1.0 + std::exp(-x)); }); // Activation function (sigmoid)
    14. }
    15. return output;
    16. }//Eigen::MatrixXd forwardPropagation(
    17. int main()
    18. {
    19. // Read network architecture from file
    20. std::vector<int> layers = readLayers("\\s.txt");
    21. // Initialize weights randomly
    22. std::default_random_engine generator;
    23. std::normal_distribution<double> distribution(0.0, 1.0);
    24. std::vector weights;
    25. for (size_t i = 0; i < layers.size() - 1; ++i) {//for110i
    26. Eigen::MatrixXd w(layers[i + 1], layers[i]);
    27. w = w.unaryExpr([&](double x) { return distribution(generator); });
    28. weights.push_back(w);
    29. }//for110i
    30. // Initialize input (example)
    31. Eigen::VectorXd input(layers[0]);
    32. input << 0.5, 0.6;
    33. // Perform forward propagation
    34. Eigen::MatrixXd output = forwardPropagation(weights, input);
    35. std::cout << "Output:\n" << output << endl;
    36. std::cout << "Hello World!\n";
    37. }//main(

    硬盘 本盘,根目录的:

    s1.txt文本文件中的内容:

    {2,8,4,1}

    1. // modernC++手撸任意层神经网络22前向传播&反向传播等神经网络230901b.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
    2. #include
    3. #include
    4. #include
    5. #include
    6. #include //ifstream file1(fileName);//getline(file1, line01);
    7. using namespace std;
    8. vector<int> readLayers(const string& fileName) {
    9. ifstream file1(fileName);
    10. string line01;
    11. vector<int> layers1;
    12. getline(file1, line01);
    13. //---------------------------------
    14. //找大括号位置
    15. size_t start_pos = line01.find('{');
    16. size_t end_pos = line01.find('}');
    17. //确保找到大括号
    18. if (string::npos == start_pos || string::npos == end_pos || start_pos >= end_pos) {
    19. cout << "没有大括号!" << endl;
    20. }//if110
    21. // 截取大括号之间的内容
    22. string content = line01.substr(start_pos + 1, end_pos - start_pos - 1);
    23. // cout << "Line55:" << content << endl;
    24. // 使用istringstream和getline进行分割
    25. std::istringstream ss(content);
    26. std::string token;
    27. while (std::getline(ss, token, ',')) {
    28. // 使用stoi将字符串转换为整数,并添加到结果vector中
    29. layers1.push_back(std::stoi(token));
    30. cout << std::stoi(token) << std::endl;
    31. }
    32. return layers1;
    33. }//vector readLayers(
    34. Eigen::MatrixXd forwardPropagation(const std::vector& weights, const Eigen::VectorXd& input) {
    35. Eigen::MatrixXd output = input;
    36. for (const auto& w : weights) {
    37. output.conservativeResize(output.rows(), 1); // Make sure it's a column vector
    38. output = w * output;
    39. output = output.unaryExpr([](double x) { return 1.0 / (1.0 + std::exp(-x)); }); // Activation function (sigmoid)
    40. }
    41. return output;
    42. }//Eigen::MatrixXd forwardPropagation(
    43. //重载
    44. Eigen::MatrixXd forwardPropagation(const std::vector& weights, const Eigen::VectorXd& input, std::vector& activations) {
    45. Eigen::MatrixXd output = input;
    46. activations.push_back(output);
    47. for (const auto& w : weights) {
    48. output.conservativeResize(output.rows(), 1); // Make sure it's a column vector
    49. output = w * output;
    50. output = output.unaryExpr([](double x) { return 1.0 / (1.0 + std::exp(-x)); }); // Activation function (sigmoid)
    51. activations.push_back(output);
    52. }
    53. return output;
    54. }
    55. Eigen::MatrixXd sigmoidDerivative(const Eigen::MatrixXd& x) {
    56. return x.unaryExpr([](double y) { return y * (1.0 - y); });
    57. }
    58. void backwardPropagation(const Eigen::MatrixXd& predicted, const Eigen::MatrixXd& target, const std::vector& activations, const std::vector& weights, std::vector& gradients) {
    59. Eigen::MatrixXd delta = (predicted - target).cwiseProduct(sigmoidDerivative(activations.back()));
    60. gradients.push_back(delta * activations[activations.size() - 2].transpose());
    61. for (int i = weights.size() - 2; i >= 0; --i) {
    62. delta = (weights[i + 1].transpose() * delta).cwiseProduct(sigmoidDerivative(activations[i + 1]));
    63. gradients.push_back(delta * activations[i].transpose());
    64. }
    65. std::reverse(gradients.begin(), gradients.end());
    66. }//void backwardPropagation(
    67. void Loss_backwardPropagation(const Eigen::MatrixXd& predicted, const Eigen::MatrixXd& target, const std::vector& activations, const std::vector& weights, std::vector& gradients) {
    68. Eigen::MatrixXd delta = (predicted - target);
    69. double sum_of_squares = delta.array().square().sum();
    70. std::cout << "Sum of squares of all elements: " << sum_of_squares << std::endl;
    71. }//void backwardPropagation(
    72. int main()
    73. {
    74. // Read network architecture from file
    75. std::vector<int> layers = readLayers("\\s1.txt");
    76. // Initialize weights randomly
    77. std::default_random_engine generator;
    78. std::normal_distribution<double> distribution(0.0, 1.0);
    79. std::vector weights;
    80. for (size_t i = 0; i < layers.size() - 1; ++i) {//for110i
    81. Eigen::MatrixXd w(layers[i + 1], layers[i]);
    82. w = w.unaryExpr([&](double x) { return distribution(generator); });
    83. weights.push_back(w);
    84. }//for110i
    85. // Initialize input (example)
    86. Eigen::VectorXd input(layers[0]);
    87. input << 1, 0;// 0.5, 0.6;
    88. // Perform forward propagation
    89. Eigen::MatrixXd output = forwardPropagation(weights, input);
    90. std::cout << "Output:\n" << output << endl;
    91. std::cout << "Hello World!\n";
    92. //----------------------------------------------------
    93. // Training data
    94. vector inputs = {
    95. (Eigen::VectorXd(2) << 1, 0).finished(),
    96. (Eigen::VectorXd(2) << 0,0).finished(),
    97. (Eigen::VectorXd(2) << 0,1).finished(),
    98. (Eigen::VectorXd(2) << 1, 1).finished(),
    99. };
    100. vector targets = {
    101. (Eigen::VectorXd(1) << 1).finished(),
    102. (Eigen::VectorXd(1) << 0).finished(),
    103. (Eigen::VectorXd(1) << 1).finished(),
    104. (Eigen::VectorXd(1) << 0).finished()
    105. };
    106. double learningRate = 0.01;
    107. int epochs = 50000;
    108. for (int epoch = 0; epoch < epochs; ++epoch) {
    109. for (size_t i = 0; i < inputs.size(); ++i) {
    110. std::vector activations;
    111. Eigen::MatrixXd output = forwardPropagation(weights, inputs[i], activations);
    112. std::vector gradients;
    113. backwardPropagation(output, targets[i], activations, weights, gradients);
    114. for (size_t j = 0; j < weights.size(); ++j) {
    115. weights[j] -= learningRate * gradients[j];
    116. }//for3300j
    117. if (0 == epoch % 1000) {//if4400
    118. std::vector activations;
    119. std::vector gradients;
    120. Loss_backwardPropagation(output, targets[i], activations, weights, gradients);
    121. }//if4400
    122. }//for2200i
    123. }//for110epoch
    124. // Testing trained model
    125. for (size_t i = 0; i < inputs.size(); ++i) {
    126. std::vector activations;
    127. Eigen::MatrixXd output = forwardPropagation(weights, inputs[i], activations);
    128. std::cout << "Input:\n" << inputs[i] << "\nOutput:\n" << output << "\n";
    129. }
    130. return 0;
    131. //=======================================================
    132. }//main(

  • 相关阅读:
    select组件使用clearable后参数变成undefined
    字符设备驱动注册的本质及注册注销步骤,struct inode/file结构体作用
    矩阵的模和内积
    使用C语言实现散列表中的冲突处理方法
    网上商城项目(加入购物车)
    给你 2 万条数据,怎么快速导入到 MySQL?
    R语言实践——rWCVP:世界维管植物名录的R包
    使用CNI网络插件(calico)实现docker容器跨主机互联
    【JavaEE初阶】进程篇
    神经网络的图像识别技术,神经网络图像角度分析
  • 原文地址:https://blog.csdn.net/aw344/article/details/132676987