opencv矩阵学习(2)

     ~~~~     前面写了一个简单的矩阵例子,这一节讲矩阵的一些运用,我们正好用在神经网络运算中。


     ~~~~     这一节,使用“感知器”创建一个网络,有三个输入感知器再输入层,中间层一层,有三个感知器,输出层有一个感知器,这里感知器的计算公式使用: ∑ j w j x j + b \sum_jw_{j}x_{j} + b jwjxj+b
在这里插入图片描述
     ~~~~     我们这里就计算对于输入值,通过怎么使用矩阵计算出输出值,采用C++代码,调用opencv,同时也可以考虑加入反向误差传递来修改 w w w x x x,而不使用S型神经元,看看效果怎么样。

     ~~~~     先放代码:


#include <stdio.h>
#include <opencv2/core.hpp>

#include <iostream>

using namespace std;
using namespace cv;

/**************
*输入3个数,整形
*期望输人a,b,c 输出a+2xb+3*c
*这个例子只是用矩阵进行正向运算,不进行反向传播下一个例子讲解反向传播算法
*/
int main() {
	int aInput[3] = { 0 };
	
	Mat m_fLayerCell_a(2, 3, CV_32FC1, Scalar(1));//保存所有a的矩阵,不包括最后的输出

	/*
	w11 w12 w13
	w21 w22 w23
	w31 w32 w33
	*/
	Mat m_fNable_w2(3, 3, CV_32FC1, Scalar(1));//保存w2所有数据的矩阵
	

	/*
	w11
	w21
	w31
	*/
	Mat m_fNable_w3(3, 1, CV_32FC1, Scalar(1));//保存w4所有数据的矩阵

	/*
	b21 b22 b23
	*/
	Mat m_fNable_b2(1, 3, CV_32FC1, Scalar(1));

	/*
	b31
	*/
	float m_fNable_b3 = 1;

	//给输入的值赋值
	aInput[0] = aInput[1] = aInput[2] = 1;

	//将输入的值赋值给m_fLayerCell_a的第一层元素,第一行
	m_fLayerCell_a.at<float>(0, 0) = (float)aInput[0];
	m_fLayerCell_a.at<float>(0, 1) = (float)aInput[1];
	m_fLayerCell_a.at<float>(0, 2) = (float)aInput[2];

	//输出矩阵
	cout << "m_fLayerCell_a=\n" << m_fLayerCell_a << endl << endl;
	cout << "m_fNable_w=\n" << m_fNable_w2 << endl << endl;

	//m_fLayerCell_a.col(1).copyTo((m_fLayerCell_a.colRange(0, 1) * m_fNable_w).col(0));
	Mat a_test = m_fLayerCell_a.row(0) * m_fNable_w2 + m_fNable_b2.row(0);
	cout << "a_test=\n" << a_test << endl << endl;
	a_test.copyTo(m_fLayerCell_a.row(1));
	cout << "m_fLayerCell_a=\n" << m_fLayerCell_a << endl << endl;

	//最后输出的值就是
	float y = Mat(m_fLayerCell_a.row(1) * m_fNable_w3 + m_fNable_b3).at<float>(0, 0);
	cout << "y = " << y << endl;

	system("pause");

	return 0;
}

     ~~~~     输出的结果
在这里插入图片描述
这就是全部的计算过程,我们可以看到 a 1 2 = w 11 2 a 1 1 + w 12 2 a 2 1 + w 13 2 a 3 1 + b 1 2 a_{1}^{2} = w_{11}^{2}a_{1}^{1} + w_{12}^{2}a_{2}^{1} + w_{13}^{2}a_{3}^{1} + b_{1}^{2} a12=w112a11+w122a21+w132a31+b12;这里 a j l a_{j}^{l} ajl l l l表示所在列, j j j就表示所在行数; w j k l w^{l}_{jk} wjkl表示第 ( l − 1 ) (l-1) (l1)层的第 k k k个感知器到 l l l层的第 j j j个感知器的连接上的权重,如下图:
在这里插入图片描述
     ~~~~     最后我们可以得到我们想要的输出值 y y y
     ~~~~     但是这个值明显不是我们想要的值,我们希望可以修改 w w w b b b来获取到我们想要的输出值,当然我们可以自己手动的修改 w w w b b b,这样确实可以像我们需要的方向前进,但是我们希望他可以自己进行修正,是输出值和期望值越来越接近。
     ~~~~     就到这里,后面对这个例子增加反向误差传递,进行自主修改 w w w b b b,我会先写一篇关于计算反向传播的博客,希望大家多多指点。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值