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

相关推荐
c#上位机2 小时前
halcon图像分割之动态阈值分割
图像处理·人工智能·计算机视觉·c#·halcon
崇文殿大学士2 小时前
C# MediatR 中介者模式 观察者模式
观察者模式·c#·中介者模式
derive_magic3 小时前
wwwwwwjava
开发语言·c#
代数狂人3 小时前
【秒懂C#14 第一章:C#简介】
开发语言·c#
web3.08889993 小时前
淘宝客API调用折扣商品搜索及商品详情示例代码
开发语言·c#
张人玉3 小时前
C#编写西门子S7PLC通信的相关知识点
microsoft·c#·wpf·plc·西门子s7通信
Byron Loong4 小时前
【C#】离线场景检测系统时间回拨
开发语言·c#
CodeCraft Studio4 小时前
Excel处理控件Aspose.Cells教程:使用C#在Excel中创建漏斗图
ui·c#·excel·aspose·excel开发·excel漏斗图·漏斗图
m5655bj4 小时前
Python 将 Word 文档转换为 Markdown 格式
python·c#·word