本项目是对项目 GavinTechStudio/bpnn_with_cpp 的代码重构,基于C++实现基础BP神经网络,有助于深入理解BP神经网络原理。
xxxxxxxxxx.├── CMakeLists.txt├── data│ ├── testdata.txt│ └── traindata.txt├── lib│ ├── Config.h│ ├── Net.cpp│ ├── Net.h│ ├── Utils.cpp│ └── Utils.h└── main.cpp
Net:网络具体实现
Config:网络参数设置
Utils:工具类
main:网络具体应用
具体公式推导请看视频讲解彻底搞懂BP神经网络 理论推导+代码实现(C++)
.键或点击链接进入GitHub在线IDE预览README.md文件。
其中
本项目中的代码实现如下:
xxxxxxxxxxfor (size_t j = 0; j < Config::HIDENODE; ++j) { double sum = 0; for (size_t i = 0; i < Config::INNODE; ++i) { sum += inputLayer[i]->value * inputLayer[i]->weight[j]; } sum -= hiddenLayer[j]->bias; hiddenLayer[j]->value = Utils::sigmoid(sum);}其中
本项目中的代码实现如下:
xxxxxxxxxxfor (size_t k = 0; k < Config::OUTNODE; ++k) { double sum = 0; for (size_t j = 0; j < Config::HIDENODE; ++j) { sum += hiddenLayer[j]->value * hiddenLayer[j]->weight[k]; } sum -= outputLayer[k]->bias; outputLayer[k]->value = Utils::sigmoid(sum);}损失函数定义如下:
其中
本项目中的代码实现如下:
xxxxxxxxxxdouble loss = 0.f;
for (size_t k = 0; k < Config::OUTNODE; ++k) { double tmp = std::fabs(outputLayer[k]->value - label[k]); los += tmp * tmp / 2;}利用梯度下降法进行优化。
其计算公式如下(激活函数为Sigmoid时):
其中
本项目中的代码实现如下:
xxxxxxxxxxfor (size_t k = 0; k < Config::OUTNODE; ++k) { double bias_delta = -(label[k] - outputLayer[k]->value) * outputLayer[k]->value * (1.0 - outputLayer[k]->value); outputLayer[k]->bias_delta += bias_delta;}其计算公式如下(激活函数为Sigmoid时):
其中
本项目中的代码实现如下:
xxxxxxxxxxfor (size_t j = 0; j < Config::HIDENODE; ++j) { for (size_t k = 0; k < Config::OUTNODE; ++k) { double weight_delta = (label[k] - outputLayer[k]->value) * outputLayer[k]->value * (1.0 - outputLayer[k]->value) * hiddenLayer[j]->value;
hiddenLayer[j]->weight_delta[k] += weight_delta; }}其计算公式如下(激活函数为Sigmoid时):
其中
本项目中的代码实现如下:
xxxxxxxxxxfor (size_t j = 0; j < Config::HIDENODE; ++j) { double bias_delta = 0.f; for (size_t k = 0; k < Config::OUTNODE; ++k) { bias_delta += -(label[k] - outputLayer[k]->value) * outputLayer[k]->value * (1.0 - outputLayer[k]->value) * hiddenLayer[j]->weight[k]; } bias_delta *= hiddenLayer[j]->value * (1.0 - hiddenLayer[j]->value);
hiddenLayer[j]->bias_delta += bias_delta;}其计算公式如下(激活函数为Sigmoid时):
其中
本项目中的代码实现如下:
xxxxxxxxxxfor (size_t i = 0; i < Config::INNODE; ++i) { for (size_t j = 0; j < Config::HIDENODE; ++j) { double weight_delta = 0.f; for (size_t k = 0; k < Config::OUTNODE; ++k) { weight_delta += (label[k] - outputLayer[k]->value) * outputLayer[k]->value * (1.0 - outputLayer[k]->value) * hiddenLayer[j]->weight[k]; } weight_delta *= hiddenLayer[j]->value * (1.0 - hiddenLayer[j]->value) * inputLayer[i]->value;
inputLayer[i]->weight_delta[j] += weight_delta; }}