寫了個(gè)多層感知器,用bp梯度下降更新,擬合正弦曲線,效果湊合。

# -*- coding: utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt
def sigmod(z):
return 1.0 / (1.0 + np.exp(-z))
class mlp(object):
def __init__(self, lr=0.1, lda=0.0, te=1e-5, epoch=100, size=None):
self.learningRate = lr
self.lambda_ = lda
self.thresholdError = te
self.maxEpoch = epoch
self.size = size
self.W = []
self.b = []
self.init()
def init(self):
for i in xrange(len(self.size)-1):
self.W.append(np.mat(np.random.uniform(-0.5, 0.5, size=(self.size[i+1], self.size[i]))))
self.b.append(np.mat(np.random.uniform(-0.5, 0.5, size=(self.size[i+1], 1))))
def forwardPropagation(self, item=None):
a = [item]
for wIndex in xrange(len(self.W)):
a.append(sigmod(self.W[wIndex]*a[-1]+self.b[wIndex]))
"""
print "-----------------------------------------"
for i in a:
print i.shape,
print
for i in self.W:
print i.shape,
print
for i in self.b:
print i.shape,
print
print "-----------------------------------------"
"""
return a
def backPropagation(self, label=None, a=None):
# print "backPropagation--------------------begin"
delta = [(a[-1]-label)*a[-1]*(1.0-a[-1])]
for i in xrange(len(self.W)-1):
abc = np.multiply(a[-2-i], 1-a[-2-i])
cba = np.multiply(self.W[-1-i].T*delta[-1], abc)
delta.append(cba)
"""
print "++++++++++++++delta++++++++++++++++++++"
print "len(delta):", len(delta)
for ii in delta:
print ii.shape,
print "\n======================================="
"""
for j in xrange(len(delta)):
ads = delta[j]*a[-2-j].T
# print self.W[-1-j].shape, ads.shape, self.b[-1-j].shape, delta[j].shape
self.W[-1-j] = self.W[-1-j]-self.learningRate*(ads+self.lambda_*self.W[-1-j])
self.b[-1-j] = self.b[-1-j]-self.learningRate*delta[j]
"""print "=======================================1234"
for ij in self.b:
print ij.shape,
print
"""
# print "backPropagation--------------------finish"
error = 0.5*(a[-1]-label)**2
return error
def train(self, input_=None, target=None, show=10):
for ep in xrange(self.maxEpoch):
error = []
for itemIndex in xrange(input_.shape[1]):
a = self.forwardPropagation(input_[:, itemIndex])
e = self.backPropagation(target[:, itemIndex], a)
error.append(e[0, 0])
tt = sum(error)/len(error)
if tt < self.thresholdError:
print "Finish {0}: ".format(ep), tt
return
elif ep % show == 0:
print "epoch {0}: ".format(ep), tt
def sim(self, inp=None):
return self.forwardPropagation(item=inp)[-1]
if __name__ == "__main__":
tt = np.arange(0, 6.28, 0.01)
labels = np.zeros_like(tt)
print tt.shape
"""
for po in xrange(tt.shape[0]):
if tt[po] < 4:
labels[po] = 0.0
elif 8 > tt[po] >= 4:
labels[po] = 0.25
elif 12 > tt[po] >= 8:
labels[po] = 0.5
elif 16 > tt[po] >= 12:
labels[po] = 0.75
else:
labels[po] = 1.0
"""
tt = np.mat(tt)
labels = np.sin(tt)*0.5+0.5
labels = np.mat(labels)
model = mlp(lr=0.2, lda=0.0, te=1e-5, epoch=500, size=[1, 6, 6, 6, 1])
print tt.shape, labels.shape
print len(model.W), len(model.b)
print
model.train(input_=tt, target=labels, show=10)
sims = [model.sim(tt[:, idx])[0, 0] for idx in xrange(tt.shape[1])]
xx = tt.tolist()[0]
plt.figure()
plt.plot(xx, labels.tolist()[0], xx, sims, 'r')
plt.show()另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。
當(dāng)前名稱:python實(shí)現(xiàn)多層感知器-創(chuàng)新互聯(lián)
鏈接URL:http://www.chinadenli.net/article22/deidjc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供營(yíng)銷型網(wǎng)站建設(shè)、用戶體驗(yàn)、建站公司、外貿(mào)建站、品牌網(wǎng)站設(shè)計(jì)、云服務(wù)器
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容