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