opencv矩阵学习(2)

本文通过一个具体的矩阵计算实例,介绍了如何在神经网络中利用矩阵进行正向运算,包括输入层、隐藏层和输出层的计算过程。通过C++代码和OpenCV库实现了神经网络的前向传播,并探讨了如何通过反向误差传递调整权重和偏置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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


    ~~~~    这一节,使用“感知器”创建一个网络,有三个输入感知器再输入层,中间层一层,有三个感知器,输出层有一个感知器,这里感知器的计算公式使用:∑jwjxj+b\sum_jw_{j}x_{j} + bjwjxj+b
在这里插入图片描述
    ~~~~    我们这里就计算对于输入值,通过怎么使用矩阵计算出输出值,采用C++代码,调用opencv,同时也可以考虑加入反向误差传递来修改wwwxxx,而不使用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;
}

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值