~~~~ 前面写了一个简单的矩阵例子,这一节讲矩阵的一些运用,我们正好用在神经网络运算中。
~~~~
这一节,使用“感知器”创建一个网络,有三个输入感知器再输入层,中间层一层,有三个感知器,输出层有一个感知器,这里感知器的计算公式使用:
∑
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)
(l−1)层的第
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,我会先写一篇关于计算反向传播的博客,希望大家多多指点。