可变学习速度的VLBP

来源:互联网 发布:考试作弊软件app 编辑:程序博客网 时间:2024/05/16 19:28


python代码实现效果很不好,当学习率不太大的时候还行,一旦大于一个值就完全崩了,暂时不知道什么问题,先贴在这

#coding=utf-8import numpy as npfrom math import eimport matplotlib.pyplot as pltimport scipy.io as siodef logsig(x):    return 1/(1+e**(-x))if __name__=="__main__":    er = 1.02    lr = 2.2  # 学习率    mc = 0.1  # 动量因子    dec = 0.8# 乘上学习率的因子ρ    inc=1.02#因子η    W1=np.array([[2.0],[3.0]])    b1=np.array([[-1.],[1.]])    W2=np.array([[1.,1.]])    b2=np.array([[-1.]])    P=np.array([np.arange(-2,2,0.1)])    #P=np.array([[1]])    a0=P    T=logsig(np.dot(W2,logsig(np.dot(W1,P)+b1))+b2)    x = 1.0    y = -2.0    ep=100    W1[0,0]=x    W2[0,0]=y    n1 = np.dot(W1, P)+b1    a1 = logsig(n1)    n2 = np.dot(W2, a1)+b2    a2 = logsig(n2)    xx=np.zeros([1,ep+1])    yy=np.zeros([1,ep+1])    ee = np.zeros([1, ep + 1])    E=T-a2    xx[0,0]=x    yy[0,0]=y    SSE=np.sum(E*E)    ee[0,0]=SSE    v1=np.zeros(W1.shape)    v2=np.zeros(W2.shape)    s2 = -2 * E * (1 - a2) * a2    s1 = np.dot(W2.T, s2) * a1 * (1 - a1)    MC=mc    for i in range(1,ep+1):        dW2 = np.dot(s2, a1.T)        dW1 = np.dot(s1, a0.T)        v1 = mc * v1 - lr * dW1        v2 = mc * v2 - lr * dW2        new_W1 = W1        new_W2 = W2        MC=mc        newx = W1[0,0]+v1[0,0]        new_W1[0,0] = newx        newy = W2[0, 0] + v2[0, 0]        new_W2[0, 0] = newy        new_a1=logsig(np.dot(new_W1,a0)+b1)        new_a2=logsig(np.dot(new_W2,new_a1)+b2)        new_E=T-new_a2        new_SSE=np.sum(new_E*new_E)        #如果军方误差(在整个训练集上)权值在更新后增加了,且超过了某个设置的百分数(3%~5%)        #则权值更新被取消,学习速度被乘上一个因子ρ(0<ρ<1),并且动量洗漱被设置为0        if(new_SSE>SSE*er):            lr=lr*dec            MC=0        #如果平方误差在权值更新后减少,则权值更新被接受,而且学习速度将被乘上一个因子η(η>1).        # 如果mc被设置为0,则恢复到以前的值        else:            if (new_SSE < SSE):                lr = lr * inc                # 如果平方误差的增长小于ξ,则权值更新被接受,但学习速度保持不变。如果mc过去被设置为0,                # 则恢复到以前的值            W1 = new_W1            W2 = new_W2            a1 = new_a1            a2 = new_a2            x = newx            y = newy            E = new_E            SSE = new_SSE            s2 = -2 * E * (1 - a2) * a2            s1 = np.dot(W2.T, s2) * a1 * (1 - a1)        ee[0, i] = SSE        xx[0, i] = x        yy[0, i] = y    data=sio.loadmat('nndbp1')    p1=plt.subplot(121)    p2=plt.subplot(122)    x2=data['x2']    y2=data['y2']    E2=data['E2']    x2,y2=np.meshgrid(x2,y2)    p1.contour(x2,y2,E2)    #p1.plot(xx[0,1:80],yy[0,1:80])    p1.plot(xx[0,1:80],yy[0,1:80])    p2.plot(ee[0,1:50])    plt.show()


0 0
原创粉丝点击