可變學習速度的VLBP

2021-07-22 17:53:08 字數 2724 閱讀 5733

python**實現效果很不好,當學習率不太大的時候還行,一旦大於乙個值就完全崩了,暫時不知道什麼問題,先貼在這

#coding=utf-8

import numpy as np

from math import e

import matplotlib.pyplot as plt

import scipy.io as sio

def 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

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()

PHP的學習 可變函式

php 支援可變函式的概念。這意味著如果乙個變數名後有圓括號,php 將尋找與變數的值同名的函式,並且嘗試執行它。可變函式可以用來實現包括 函式,函式表在內的一些用途。可變函式不能用於例如 echo,print,unset isset empty include,require 以及類似的語言結構。...

Python學習 可變型別和不可變型別

不可變資料型別在第一次宣告賦值宣告的時候,會在記憶體中開闢一塊空間,用來存放這個變數被賦的值,而這個變數實際上儲存的,並不是被賦予的這個值,而是存放這個值所在空間的記憶體位址,通過這個位址,變數就可以在記憶體中取出資料了.所謂不可變就是說,我們不能改變這個資料在記憶體中的值,所以當我們改變這個變數的...

python新手學習可變和不可變物件

python中有可變物件和不可變物件,可變物件 list,dict.不可變物件有 int,string,float,tuple.python不可變物件 int,string,float,tuple 先來看乙個例子 def int test i 77 j 77 print id 77 14039657...