BP神经网络

引见是说BP神经网络,神经网络在机具默想切中要害范围广泛的器械,譬如,作用近似值,机能必要条件,归类,唱片压缩,唱片

以地雷炸毁及那个域名。接下来引见BP神经网络的规律及抛光。

Contents

  1. BP神经网络的看法

  2. 隐含层的选择

  3. 前向转变子折术

  4. 反向转变子折术

  5. BP神经网络的留意点

  6. BP神经网络的C++抛光

1. BP神经网络的看法

BP 涂神经网络它分为两个折术。

      (1)任务用枪打猎前向转变子折术

      (2)偏离用枪打猎反向转变子折术

   在BP神经网络中,奇特的事物范本具有出口,有出口,出口层和出口层中间通常有什么价钱隐蔽处层。。现实

   上,1989Robert Hecht-Nielsen证实隐层BP网络可用于稍微陆续作用。

   Collaterals近似值,执意如此。万能的近似值定理。因而,任何人四级BP网络可以抛光稍微维到维计划。。也执意说,三层

   可能出口层(I),隐含层(H),出口层(o)。上面的涌现

        

2. 隐含层的选择

   在BP神经网络中,决定出口层和出口层切中要害结节全部含义。,隐含层结节数的不决定性,这么笔者宜设置少量呢?

   才是什么对的?确实,隐层切中要害结节全部含义冲击力神经网络的机能。,有任何人决定隐层的阅历表情

   结节全部含义,如次

                

隐层结节数,出口层结节数,出口层结节数,调节器中间的常数。

3. 前向转变子折术

   结节和结节中间的使变重现时被设置。,结节的阈值的是,每个结节的出口值为,每个结节的出口

   该值鉴于下层一切的结节的出口值。、普通结节和前河床和T上一切的结节的使变重

   的。详细计算方法如次

                    

它是任何人起动作用。,普通拔取S典型作用或一次的作用。

   前向传送折术简略。,表情可扣紧述表情计算。在BP神经网络中,出口层结节心不在焉阈值的。

4. 反向转变子折术

   在BP神经网络中,偏离用枪打猎反向转变子折术关系上地复杂,它是使被安排好在霍夫默想任命的。授给物出口层

一切的的导致都是,偏离作用如次

                    

   而BP神经网络的次要终点是旧病复发惩罚权值和阀值,使偏离作用最低消费。霍夫任命

   它经过SQ的相对偏离和的最陡下斜举止。,陆续调节器网络的权值和阈值的,如梯度下斜法,权值用无线电引导

   惩罚与普通位置成正比例。E(w,b)梯度,到某种状态第任何人出口结节

                    

授给物选择起动作用为

                    

   起动作用区分,赢得

                   

   于是下任何人点是

                   

   进入有

                            

   同一到某种状态有

                 

   执意如此。著名的默想任命,经过改建神经细胞中间的衔接使变重,笔者可以增大现实,任命

   于是它也高价地霍夫默想任命或数据纠正默想任命

   由于是隐蔽处层与使变重中间的使变重调节器。,柜台出口层、隐含层和隐含层的阈值的。

   整体计算量关系上地复杂。。授给物它是出口层k结节与隐含层i结节间的使变重,因而有

                

   进入有

                

如此的一对默想任命拘押更深入。

   伸出述表情,如梯度下斜法,于是隐蔽处层和出口层中间的使变重和阈值的。

                

出口层和隐蔽处层的使变重和阈值的亦

                

   因此BP神经网络的规律根本讲完。

5. BP神经网络的留意点

   BP神经网络普通用于归类或许近似值成绩。也许用于归类,起动作用普通应用SigMID作用或硬极点作用。

   数,也许用于作用近似值,于是出口层结节是一次的作用。,即。

   BP神经网络在锻炼唱片时可以采取增量默想或许批量默想。

   增量默想出口文字必要条件具有十足的无安排。,对出口文字对噪声更敏感。,高压手段变化的入伙文字,训

   不好地使臻于完善比分差,合适在线处置。批量默想出口文字次心不在焉成绩,稳定性好,但它只符合的离线处置。。

   基准BP神经网络的缺陷:

   (1)轻易构成地区绵密值,不克不及赢得大局最优解。。

       BP神经网络中绵密值关系上地多,因而很轻易进入地区绵密值。,这必要条件初始权值和阈值的。,要使

       得初初始权值和级限的值十足好的机具,它可以随机屡次抛光。。

   (2)锻炼次数增大了默想效能。,慢收敛一阵。

   (3)隐含层的选择缺少推测的直接的。

   (4)在锻炼折术中默想新范本的涌流是忘却旧范本。。

BP算法的改善:

(1)增大动量项

引入动量项变快算法的收敛性,这是上面的表情

       

动量决定因素的的普通选择。

   (2)自适应默想率

   (3)引入倾斜度决定因素的

   通常BP神经网络在锻炼屯积会对唱片正态化处置,将唱片计划到较小的交替工作。,譬如,〔0〕,1]或[-1,1]。

6. BP神经网络的C++抛光

   BP神经网络的C++档案如次

   

#ifndef _BP_H_
#define _BP_H_
 
#include 
 
#define LAYER    3        //三层神经网络
#define NUM      10       每层结节的最大全部含义
 
#define A        30.0
#define B        10.0     A和B是S型作用的决定因素
#define 伊特斯    1000     最大锻炼次数
#define ETA_W    0.0035   分量调节器率
#define ETA_B    0.001    阈值的调节器率
#define ERROR    0.002    奇特的事物范本容许的偏离
#define ACCU     0.005    每回迭代都容许涌现违法
 
#define Type double
#define Vector STD::支持者
 
struct Data
{
    Vector x;       //出口唱片
    Vector y;       //出口唱片
};
 
class BP{
 
public:
 
    void GetData(const Vector);
    void Train();
    Vector 预测(常数) Vector);
 
private:
 
    void InitNetWork();         设定初值网络
    void GetNums();             //获取出口、结节的出口和隐含层数
    void ForwardTransfer();     前向涂子折术
    void ReverseTransfer(int);  反向涂子折术
    void CalcDelta(int);        计算W和B的调节器
    void UpdateNetWork();       使现代化使变重和阈值的
    Type GetError(int);         单范本偏离的计算
    Type GetAccu();             计算一切的战利品的精确
    Type S形 典型)   S形的数值计算
 
private:
    int in_num;                 出口层结节数
    int ou_num;                 出口层结节编号
    int hd_num;                 隐层结节数
 
    Vector data;          //出口出口唱片
 
    Type W[层] [num ] [num ]    BP网络的权值
    Type B[层] [NUM]         BP网络结节的阈值的
     
    Type X [层] [num ]         每个神经细胞的出口值由S型作用间隔。,出口层是原始值
    Type D [层] [num ]         在delta默想任命中记载δ值
};
 
#endif  //_BP_H_

BP.cpp:

#include 
#include 
#include 
#include 
#include ""

购置物一切的范本唱片的种植
void BP::GETDATA(const) Vector 唱片)
{
	data = _data;
}

//开端停止锻炼
void BP:拖裾
{
开端 to train BP NetWork!\n");
	GetNums();
	InitNetWork();
    int num = ();

为(int) iter = 0; iter <= 伊特斯; iter++)
	{
	为(int) cnt = 0; cnt < num; cnt++)
		{
			//第河床出口结节赋值
		为(int) i = 0; i < in_num; i++)
				x[0][i] = (cnt).x[i];

			(1)
			{
				ForwardTransfer();     
                if(GetError(cnt) < ERROR)    //也许偏离关系上地小,则柜台奇特的事物范本跳出循环
					break;
                ReverseTransfer(cnt);  
			}
		}
		printf("This is the %d th trainning NetWork !\n", iter);

		Type accu = GetAccu();
		printf("All Samples Accuracy is %lf\n", accu);
		if(accu < ACCU) break;
	}
	printf("The BP NetWork train End!\n");
}

//如锻炼好的网络来预测出口值
Vector BP::预测(常数) Vector 唱片)
{
	int n = ();
断言(n) == in_num);
    为(int) i = 0; i < in_num; i++)
		x[0][i] = data[i];
    
	ForwardTransfer();
	Vector v;
为(int) i = 0; i < ou_num; i++)
		(x[2][i]);
	return v;
}

//获取网络结节数
void BP::GetNums()
{
	in_num = data[0].();                         //获取出口层结节数
	ou_num = data[0].();                         //获取出口层结节数
    hd_num = (int)sqrt((in_num + ou_num) * ) + 5;   //获取隐含层结节数
	if(hd_num > 努姆) hd_num = NUM;                     隐蔽处层的全部含义不克不及超过最大设置。
}

设定初值网络
void BP::InitNetWork()
{
    memset(w, 0, sizeof(w));      设定初值权值和阈值的为0,也可以设定初值随机值。
	memset(b, 0, sizeof(b));
}

//任务用枪打猎前向转变子折术
void BP::ForwardTransfer()
{
计算隐蔽处层中每个结节的出口值
为(int) j = 0; j < hd_num; j++)
	{
		Type t = 0;
	为(int) i = 0; i < in_num; i++)
			t += w[1][i][j] * x[0][i];
		t += b[1][j];
		x[1][j] = Sigmoid(t);
	}

	//计算出口层各结节的出口值
为(int) j = 0; j < ou_num; j++)
	{
		Type t = 0;
	为(int) i = 0; i < hd_num; i++)
			t += w[2][i][j] * x[1][i];
		t += b[2][j];
		x[2][j] = Sigmoid(t);
	}
}

单范本偏离的计算
Type BP::GetError(int cnt)
{
	Type ans = 0;
为(int) i = 0; i < ou_num; i++)
		ans +=  * (x[2][i] - (cnt).y[i]) * (x[2][i] - (cnt).y[i]);
	return ans;
}

//偏离用枪打猎反向转变子折术
void BP::ReverseTransfer(int cnt)
{
	CalcDelta(cnt);   
	UpdateNetWork();
}

计算一切的战利品的精确
Type BP::GetAccu()
{
	Type ans = 0;
	int num = ();
为(int) i = 0; i < num; i++)
	{
		int m = (i).();
	为(int) j = 0; j < m; j++)
			x[0][j] = (i).x[j];
        ForwardTransfer();
		int n = (i).();
	为(int) j = 0; j < n; j++)
            ans +=  * (x[2][j] - (i).y[j]) * (x[2][j] - (i).y[j]);
	}
	return ans / num;
}

//计算调节器量
void BP::CalcDelta(int cnt)
{
	//计算出口层的delta值
为(int) i = 0; i < ou_num; i++)
		d[2][i] = (x[2][i] - (cnt).y[i]) * x[2][i] * (A - x[2][i]) / (A * B);
	//计算隐含层的delta值
为(int) i = 0; i < hd_num; i++)
	{
		Type t = 0;
	为(int) j = 0; j < ou_num; j++)
			t += w[2][i][j] * d[2][j];
		d[1][i] = t * x[1][i] * (A - x[1][i]) / (A * B);
	}
}

//如计算出的调节器量对BP网络停止调节器
void BP::UpdateNetWork()
{
	//隐含层和出口层中间权值和阀值调节器
为(int) i = 0; i < hd_num; i++)
	{
	为(int) j = 0; j < ou_num; j++)
			w[2][i][j] -= ETA_W * d[2][j] * x[1][i]; 
	}
为(int) i = 0; i < ou_num; i++)
		b[2][i] -= ETA_B * d[2][i];

	//出口层和隐含层中间权值和阀值调节器
为(int) i = 0; i < in_num; i++)
	{
	为(int) j = 0; j < hd_num; j++)
			w[1][i][j] -= ETA_W * d[1][j] * x[0][i];
	}
为(int) i = 0; i < hd_num; i++)
		b[1][i] -= ETA_B * d[1][i];
}

//计算Sigmoid作用的值
Type BP::S形 Type x)
{
	return A / (1 + exp(-x / B));
}

#include 
#include 
#include 
 
#include ""
 
using namespace std;
 
double sample[41][4]= 
{ 
    {0,0,0,0}, 
    {5,1,4,}, 
    {5,3,3,}, 
    {5,5,2,}, 
    {5,3,3,}, 
    {5,3,2,}, 
    {5,3,2,}, 
    {5,5,1,}, 
    {5,1,2,260}, 
    {5,3,3,}, 
    {5,5,4,}, 
    {5,5,2,}, 
    {5,1,3,}, 
    {5,3,4,}, 
    {5,5,5,}, 
    {5,1,4,}, 
    {5,1,4,}, 
    {5,3,5,}, 
    {5,5,4,}, 
    {5,1,3,}, 
    {5,3,2,}, 
    {1,3,1,}, 
    {1,5,2,}, 
    {1,1,3,}, 
    {1,3,4,}, 
    {1,5,5,}, 
    {1,5,3,}, 
    {1,1,4,}, 
    {1,3,5,}, 
    {1,5,4,}, 
    {1,1,3,}, 
    {1,1,5,}, 
    {1,3,4,}, 
    {1,5,3,}, 
    {1,1,2,}, 
    {1,3,1,}, 
    {1,3,3,}, 
    {1,5,2,}, 
    {1,1,1,}, 
    {1,3,2,}, 
    {1,5,3,} 
}; 
 
int main()
{
    Vector data;
    为(int) i = 0; i < 41; i++)
    {
        Data t;
        为(int) j = 0; j < 3; j++)
            (sample[i][j]);
        (sample[i][3]);
        (t);
    }
    BP *bp = new BP();
    bp->GetData(唱片);
    bp->Train();
 
    (1)
    {
        Vector in;
        为(int) i = 0; i < 3; i++)
        {
            Type v;
            scanf("%lf", &v);
            (v);
        }
        Vector ou;
        ou = bp->ForeCast(in);
        printf("%lf\n", 欧〔0〕
    }
    return 0;
}

Makefile:

Test :  BP.cpp 
    g++ BP.cpp  -o Test
 
clean:
    rm Test

NameE-mailWebsiteComment

发表评论

电子邮件地址不会被公开。 必填项已用*标注