手撕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神经网络,虽然代码量上千行,但能让我们清晰地看到每一个算法的原理。这就像是拆解开一辆汽车,了解每一个零部件如何工作,对我们深入学习神经网络至关重要。不要好高骛远,打好基础,才能在深度学习的道路上走得更远。

相关推荐
游乐码4 小时前
c#泛型约束
开发语言·c#
hoiii1875 小时前
C# 基于 LumiSoft 实现 SIP 客户端方案
前端·c#
yongui478347 小时前
C# 与三菱PLC通讯解决方案
开发语言·c#
jerryinwuhan8 小时前
RDD第二次练习
开发语言·c#
aini_lovee12 小时前
C# 快速搜索磁盘文件解决方案
开发语言·c#
派葛穆14 小时前
汇川PLC-Unity3d与汇川easy521plc进行Modbustcp通讯
unity·c#
游乐码14 小时前
C#List
开发语言·c#·list
Paine Zeng17 小时前
C# + SolidWorks 二次开发 -监听退出草图事件并自动执行逻辑
c#·solidworks二次开发·solidworks api
游乐码17 小时前
C#Dicitionary
算法·c#
SunnyDays101117 小时前
C# 实战:如何高效地将 HTML 转换为可编辑 Word 文档
c#·html转word