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

相关推荐
工程师0071 小时前
栈和堆的概念
c#·栈和堆
不会编程的懒洋洋1 小时前
C# P/Invoke 基础
开发语言·c++·笔记·安全·机器学习·c#·p/invoke
Avalon7122 小时前
Unity3D响应式渲染UI框架UniVue
游戏·ui·unity·c#·游戏引擎
njsgcs2 小时前
solidworks折弯自动标注5 非90度折弯
c#·solidworks
狼与自由3 小时前
clickhouse引擎
clickhouse·c#·linq
wangnaisheng3 小时前
【C#】死锁详解:发生原因、优化解决方案
c#
tiger从容淡定是人生3 小时前
AI替代软件战略(一):从 CCleaner 到 MCP 架构重构 —— TigerCleaner 的工程实践
人工智能·重构·架构·c#·mcp
宝桥南山1 天前
GitHub Models - 尝试一下使用GitHub Models
microsoft·ai·微软·c#·github·.netcore
hixiong1231 天前
C# OpenvinoSharp部署INSID3
开发语言·人工智能·ai·c#·openvinosharp
星辰徐哥1 天前
Unity C#入门:变量的定义与访问权限(public/private)
unity·c#·lucene