手撕BP与CNN:不依赖外源库,探寻神经网络原理

基于C++的 BP/CNN神经网络算法(不调用外源库)二选一 此程序里面包括BP和CNN神经网络,接近上千行代码的,由于程序不调用任何外源库,所以读者可以看清楚每一个算法的原理,要想学好神经网络,必须打好基础,不要好高骛远 另外,程序都是有备注,应该很好理解的 在实际应用中(手写数字识别),BP准确率能达91.6%,CNN准确度能达96.4%。

在深度学习的世界里,BP(反向传播)和CNN(卷积神经网络)就像是两颗璀璨的明珠,照亮了无数应用领域前行的道路。今天,咱就抛开那些常用的外源库,纯手撸代码,深入探究这俩神经网络算法的奥秘。

BP神经网络:误差反向传播的智慧

BP神经网络是一种按照误差逆向传播算法训练的多层前馈神经网络。它的核心思想就是通过不断调整权重,使得输出尽可能接近真实值。

cpp 复制代码
// 定义一个简单的神经元类
class Neuron {
public:
    double output;
    double error;
    vector<double> weights;

    Neuron(int numInputs) {
        for (int i = 0; i < numInputs; ++i) {
            weights.push_back((double)rand() / RAND_MAX); // 随机初始化权重
        }
    }

    double sigmoid(double x) {
        return 1.0 / (1.0 + exp(-x));
    }

    void feedForward(const vector<double>& inputs) {
        double sum = 0.0;
        for (size_t i = 0; i < inputs.size(); ++i) {
            sum += inputs[i] * weights[i];
        }
        output = sigmoid(sum);
    }
};

// 定义一个简单的BP神经网络层
class Layer {
public:
    vector<Neuron> neurons;

    Layer(int numNeurons, int numInputsPerNeuron) {
        for (int i = 0; i < numNeurons; ++i) {
            neurons.emplace_back(numInputsPerNeuron);
        }
    }

    void feedForward(const vector<double>& inputs) {
        for (auto& neuron : neurons) {
            neuron.feedForward(inputs);
        }
    }
};

这段代码简单地构建了神经元和神经网络层的基本结构。神经元通过feedForward方法计算输出,而层则管理多个神经元的前馈过程。在实际应用中,还需要更多的代码来处理反向传播、权重更新等操作。

BP神经网络在手写数字识别中的准确率能达到91.6%。虽然相比CNN略低,但它为我们理解神经网络的基本原理提供了很好的入门。

CNN神经网络:卷积运算的魅力

CNN则是专门为处理具有网格结构的数据(如图像)而设计的。卷积层通过卷积核在数据上滑动,提取特征。

cpp 复制代码
// 定义卷积核
vector<vector<double>> convolutionKernel = {
    {1, 1, 1},
    {1, -8, 1},
    {1, 1, 1}
};

// 简单的卷积运算
vector<vector<double>> convolution(const vector<vector<double>>& image) {
    int imageHeight = image.size();
    int imageWidth = image[0].size();
    int kernelSize = convolutionKernel.size();
    int newHeight = imageHeight - kernelSize + 1;
    int newWidth = imageWidth - kernelSize + 1;
    vector<vector<double>> result(newHeight, vector<double>(newWidth, 0));

    for (int i = 0; i < newHeight; ++i) {
        for (int j = 0; j < newWidth; ++j) {
            double sum = 0.0;
            for (int ki = 0; ki < kernelSize; ++ki) {
                for (int kj = 0; kj < kernelSize; ++kj) {
                    sum += image[i + ki][j + kj] * convolutionKernel[ki][kj];
                }
            }
            result[i][j] = sum;
        }
    }
    return result;
}

上述代码实现了一个简单的卷积操作。卷积核在图像上滑动,对每个位置进行加权求和,从而得到特征图。CNN还有池化层、全连接层等组件,共同协作提高识别准确率。在手写数字识别中,CNN的准确度能达96.4%,展现出其在图像识别任务中的强大能力。

不调用外源库,亲手实现BP和CNN神经网络,虽然代码量上千行,但能让我们清晰地看到每一个算法的原理。这就像是拆解开一辆汽车,了解每一个零部件如何工作,对我们深入学习神经网络至关重要。不要好高骛远,打好基础,才能在深度学习的道路上走得更远。

相关推荐
iReachers5 分钟前
恒盾C#混淆加密大师 1.4.5 最新2026版本发布 (附CSDN下载地址)
c#·c#混淆·c#加密·wpf加密·winform加密
历程里程碑1 小时前
43. TCP -2实现英文查中文功能
java·linux·开发语言·c++·udp·c#·排序算法
月巴月巴白勺合鸟月半1 小时前
一次PDF文件的处理(二)
pdf·c#
摆烂的少年2 小时前
Asp .net web应用程序使用VS2022调试时打开文件选择器服务自动关闭问题
c#·.net
William_cl3 小时前
C# ASP.NET Identity 授权实战:[Authorize (Roles=“Admin“)] 仅管理员访问(避坑 + 图解)
开发语言·c#·asp.net
.NET修仙日记3 小时前
构建社区照护桥梁:.NET Core3.1+MVC社区呼叫系统设计与实现
c#·毕业设计·.net·.net core·社区照护平台
红黑色的圣西罗3 小时前
Lua和C#交互探究记录
c#·lua·交互
八苦18 小时前
如何用c# 做 mcp/ChatGPT app
c#·mcp
人工智能AI技术19 小时前
DeskClaw Windows上线|C#开发AI桌面助手,轻量内核源码解析
人工智能·c#
似水明俊德19 小时前
04-C#.Net-委托和事件-面试题
java·开发语言·面试·c#·.net