都在用Python做深度学习,懒人的福利。
手写一个基于Eigen的C++深度神经网络类,对于弄懂其中的过程还是很有好处的。代码分享给大家。
一、构造函数
类构造函数两个
(1)DeepLearn::DeepLearn(Eigen::MatrixXi layer_structure)
参数是一个1行多列的向量,各列数据即为每层神经元个数;
DeepLearn::DeepLearn(Eigen::MatrixXi layer_structure):mLayerStructure(layer_structure)
{
int nLayers = layer_structure.size() - 1;
for (int i = 0; i < nLayers; i++)
{
Eigen::MatrixXd w = Eigen::MatrixXd::Random(layer_structure(i + 1), layer_structure(i));
Eigen::MatrixXd b = Eigen::MatrixXd::Random(layer_structure(i + 1), 1);
Eigen::MatrixXd z = Eigen::MatrixXd::Zero(layer_structure(i + 1), 1);
Eigen::MatrixXd a = Eigen::MatrixXd::Zero(layer_structure(i + 1), 1);
Eigen::MatrixXd d = Eigen::MatrixXd::Zero(layer_structure(i + 1), 1);
Eigen::MatrixXd dw = Eigen::MatrixXd::Zero(layer_structure(i + 1), layer_structure(i));
Eigen::MatrixXd db = Eigen::MatrixXd::Zero(layer_structure(i + 1), 1);
vLayerWeights.push_back(w);
vLayerBiases.push_back(b);
vLayerZetas.push_back(z);
vLayerActivators.push_back(a);
vLayerDeltas.push_back(d);
vAccumulateLayerWeights.push_back(dw);
vAccumulateLayerBiases.push_back(db);
}
vSampleInputs.clear();
vSampleExpectations.clear();
fAccumulateError = 0.0;
}
(2)DeepLearn::DeepLearn(std::string param_file)
参数是文件名,该文件存储已经训练了若干次的神经网络数据。
即,首次训练使用(1)构造函数,训练完毕后,网络参数会自动保存为文件,后续如果想接着训练,则可以传入文件名,使用(2)构造函数构造网络。
DeepLearn::DeepLearn(std::string param_file)
{
std::ifstream f;
f.open(param_file, std::ios::binary | std::ios::in);
int row, col;
f.read((char*)&row, sizeof(int));
f.read((char*)&col, sizeof(int));
mLayerStructure = Eigen::MatrixXi::Zero(row, col);
f.read((char*)mLayerStructure.data(), sizeof(int)*row*col);
int nLayers = mLayerStructure.size() - 1;
for (int i = 0; i < nLayers; i++)
{
int r = mLayerStructure(i + 1);
int c = mLayerStructure(i);
Eigen::MatrixXd w = Eigen::MatrixXd::Zero(r, c);
Eigen::MatrixXd b = Eigen::MatrixXd::Zero(r, 1);
f.read((char*)w.data(), sizeof(double)*r*c);
f.read((char*)b.data(), sizeof(double)*r);
Eigen::MatrixXd z = Eigen::MatrixXd::Zero(r, 1);
Eigen::MatrixXd a = Eigen::MatrixXd::Zero(r, 1);
Eigen::MatrixXd d = Eigen::MatrixXd::Zero(r, 1);
Eigen::MatrixXd dw = Eigen::MatrixXd::Zero(r, c);
Eigen::MatrixXd db = Eigen::MatrixXd::Zero(r, 1);
vLayerWeights.push_back(w);
vLayerBiases.push_back(b);
vLayerZetas.push_back(z);
vLayerActivators.push_back(a);
vLayerDeltas.push_back(d);
vAccumulateLayerWeights.push_back(dw);
vAccumulateLayerBiases.push_back(db);
}
f.close();
vSampleInputs.clear();
vSampleE