C++ 深度学习简单示例

发布时间 2023-12-29 13:56:04作者: 阿坦

这是一个简单的C++控制台程序示例,用于实现一个简单的神经网络,进行二进制分类任务。请注意,这只是一个基本示例,没有使用任何深度学习库,因此它可能不具备高度优化和效率。

#include <iostream>
#include <vector>
#include <cmath>

// 定义神经网络的层
struct Layer {
    std::vector<double> weights;
    double bias;
};

// 定义激活函数(这里使用sigmoid函数)
double sigmoid(double x) {
    return 1 / (1 + exp(-x));
}

// 前向传播函数
double forwardPropagation(const std::vector<double>& input, const Layer& layer) {
    double sum = 0.0;
    for (size_t i = 0; i < input.size(); ++i) {
        sum += input[i] * layer.weights[i];
    }
    sum += layer.bias;
    return sigmoid(sum);
}

int main() {
    // 定义训练数据
    std::vector<std::vector<double>> trainingData{
        {0, 0},
        {0, 1},
        {1, 0},
        {1, 1}
    };

    // 定义标签(对应每个训练数据的期望输出)
    std::vector<int> labels{ 0, 1, 1, 0 };

    // 定义神经网络的结构
    Layer hiddenLayer{ {1, 1}, 0 }; // 隐藏层
    Layer outputLayer{ {1, -1}, 0 }; // 输出层

    // 训练神经网络
    for (size_t epoch = 0; epoch < 1000; ++epoch) {
        for (size_t i = 0; i < trainingData.size(); ++i) {
            // 前向传播
            double hiddenOutput = forwardPropagation(trainingData[i], hiddenLayer);
            double output = forwardPropagation({ hiddenOutput }, outputLayer);

            // 计算误差
            double error = labels[i] - output;

            // 反向传播更新权重和偏置
            double delta = error * output * (1 - output);
            outputLayer.bias += delta;
            for (size_t j = 0; j < hiddenLayer.weights.size(); ++j) {
                hiddenLayer.weights[j] += delta * hiddenOutput * (1 - hiddenOutput) * trainingData[i][j];
            }
        }
    }

    // 测试神经网络
    std::cout << "Testing neural network:" << std::endl;
    for (size_t i = 0; i < trainingData.size(); ++i) {
        double hiddenOutput = forwardPropagation(trainingData[i], hiddenLayer);
        double output = forwardPropagation({ hiddenOutput }, outputLayer);
        std::cout << "Input: " << trainingData[i][0] << ", " << trainingData[i][1]
            << " Output: " << output << std::endl;
    }

    return 0;
}

运行结果