AI入门之神经网络(6)—初始化3层网络结构的代码(opencv、c++)

一个简单的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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值