说明:
1.实现语言为C++
2.关于神经网络反向传播的数学原理我会在后续的文章中更新
现在开始吧~
//Backprop.h
#ifndef Backprop_h
#define Backprop_h
class TLU//一个TLU单元
{
public:
TLU();
double F_output();//把该TLU对应的输出Fi打印出来
protected:
double input1,input2,input3,weight1,weight2,weight3,f,c;//input为输入的特征向量,weight为权值,f为输
c为学习效率
};
class FirstLevelTLU:public TLU//第一层TLU的类
{
public:
FirstLevelTLU(double x1,double x2,double x3,double w1,double w2,double w3);
void Modify_weight(double delta,double weight);//反向传播过程中用于梯度下降
private:
double Middle_delta;//对应梯度下降中的sigmoid函数的灵敏度ζi = f (i,j)(1 - f(i,j))∑ζ(j + 1)w(i,l)^(j+1)
};
class LastLevelTLU:public TLU//最后一层的TLU
{
public:
LastLevelTLU(double x1,double x2,double x3,double w1,double w2,double w3,double ep);
double Get_delta();//获取最后一层的灵敏度ζ(k)
void Modify_weight();//梯度下降的过程
double Get_w1();
double Get_w2();
private:
double d,Base_delta;//分别对应最后的输入F和基数ζ(k)
};
#endif
代码并不难理解,重点定义了三个类,分别指代普通TLU,第一层TLU,最后一层TLU,以及各自的输入,权值
接下来是定义部分backpro.cpp主要用于类中函数的定义:在此不做复制粘贴啦;
最后是main函数,如下:
#include#include#include#include "Backprop.h"
void main()
{
int start=1;
while(start){
FirstLevelTLU first1(1.0,0.0,1.0,2.0,-2.0,0.0);
FirstLevelTLU first2(1.0,0.0,1.0,1.0,3.0,-1.0);//先建立两个第一层的TLU
double f1=first1.F_output();
double f2=first2.F_output();
LastLevelTLU last(f1,f2,1.0,3.0,-2.0,-1.0,0.0);定义最后一层TLU
double fout=last.F_output();
last.Modify_weight();
double delta=last.Get_delta();
first1.Modify_weight(delta,last.Get_w1());
first2.Modify_weight(delta,last.Get_w2());//梯度下降过程,先最后一层,依次反向传播
cout<<endl;
start--;
}
return 0;
}
写在最后:
后续的过程我会继续补充反向传播用Python语言写的的更加复杂的实现,敬请期待~