一个简单的3层网络,每句代码都有注释,相信有点基础的你都能看懂!
//网络每层的结构
/*声明输入层,中间层,输出层的结构*/
vector<int> layer_number = { 784,100,10 };//3层网络。每层的神经元个数
vector<Mat> layer;//定义网络层
layer.resize(layer_number.size());//为矩阵类型的layer动态数组声明元素个数(相当于layer[3])
for (int i=0;i<layer.size();i++)
{
//创建网络的每一层,循环第一次创建输入层的784个神经元,循环第二次创建第二层的100个神经元循环,第三次创建输出层的10个神经元
layer[i].create(layer_number[i], 1, CV_32FC1);
}
/*声明权重矩阵的结构*/
vector<Mat> weights;//定义权重矩阵
weights.resize(layer_number.size() - 1);//为矩阵类型的weights动态数组声明元素个数(相当于weights[2]),只有2个元素是因为输出层之后没有权重矩阵
for (int i=0;i<weights.size();i++)
{
//创建权重矩阵,循环第一次创建的是第一层和第二层之间的权重矩阵(100行,784列),循环第二次是创建的是第二层和输出层之间的权重矩阵(10行,100列)
weights[i].create(layer[i + 1].rows, layer[i].rows, CV_32FC1);
}
/*声明偏置向量*/
vector<Mat> bias;//定义偏置向量(虽然是矩阵类型,但是只有1列,所以可以看作是一个列向量)
bias.resize(layer_number.size() - 1);//为矩阵类型的bias动态数组声明元素个数(相当于bias[2]),只有2个元素是因为输出层之后没有偏置向量
for (int i=0;i<bias.size();i++)
{
//创建权重矩阵,循环第一次创建的是第一层和第二层之间的偏置向量(100行,1列),循环第二次是创建的是第二层和输出层之间的权重矩阵(10行,1列)
bias[i].create(layer[i + 1].rows, 1, CV_32FC1);
//为每一层之间的偏置向量初始化为0(3层网络就2个偏置向量)
bias[i] = Mat::zeros(layer[i + 1].rows, 1, CV_32FC1);
}
//cout << layer[0] << endl << weights[0] << endl << bias[0] << endl;//打印第一层的节点,权重,偏置
/*初始化权重矩阵(输入层与第二层之间的权重矩阵,第二层与输出层的权重矩阵)*/
for (int i=0;i<weights.size();i++)
{
//用正态分布的随机数填充矩阵,函数randn用指定的平均向量和标准偏差矩阵用正态分布的随机数填充矩阵,生成的随机数被剪裁以适合输出数组数据类型的值范围。
randn(weights[i], 0.0, 0.1);
}
//cout << weights[0];//打印随机赋值的结果
/*初始化偏置向量(输入层与第二层之间的偏置向量,第二层与输出层之间的偏置向量)*/
for (int i=0;i<bias.size();i++)
{
bias[i] = Scalar(0.05);//Scalar 类表示是一维数组,传入一个数的地址,为bias的每个元素赋值这个数字
}
//cout << bias[0];//打印统一赋值的结果
纯纯的干活,如果你喜欢,可以3连呦!
博主还在努力写剩下的神经网络代码,这只是一个开胃菜!
欢迎加群:109530447