python实现多层感知器

作者:陆子野 时间:2022-07-04 14:37:10 

写了个多层感知器,用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()

效果图:

python实现多层感知器

来源:https://blog.csdn.net/u013781175/article/details/48313903

标签:python,感知器
0
投稿

猜你喜欢

  • Python2和Python3中@abstractmethod使用方法

    2021-12-29 08:55:36
  • vbScript on error resume next容错使用心得

    2010-06-26 19:28:00
  • Python求两个字符串最长公共子序列代码实例

    2021-01-13 20:49:08
  • Oracle 随机数

    2009-06-04 10:01:00
  • opencv+python实现鼠标点击图像,输出该点的RGB和HSV值

    2023-05-16 13:37:20
  • MySQL优化之数据类型的使用

    2009-03-16 17:12:00
  • python设置代理和添加镜像源的方法

    2022-12-03 10:26:39
  • Python实现壁纸下载与轮换

    2022-07-01 19:19:19
  • python 双循环遍历list 变量判断代码

    2021-02-10 12:38:12
  • Python中条件语句、循环语句和pass语句的使用示例

    2021-05-13 23:23:27
  • 参数传递解决window.open的session变量丢失

    2007-10-22 17:40:00
  • Python响应对象text属性乱码解决方案

    2023-07-31 13:06:41
  • Oracle 数据库操作技巧集

    2010-07-26 12:49:00
  • Python实现全角半角字符互转的方法

    2022-07-29 10:03:25
  • 用于WebKit的CSS诀窍[译]

    2009-03-11 20:03:00
  • 教你使用SQL Server数据库进行网络链接

    2009-01-13 13:41:00
  • oracle数据库导入导出命令使用方法

    2023-07-22 19:06:39
  • pandas值替换方法

    2021-05-31 20:22:38
  • 讲解SQL Server数据库的触发器安全隐患

    2009-01-13 14:01:00
  • 推荐:怎么用javascript进行拖拽

    2007-09-21 20:14:00
  • asp之家 网络编程 m.aspxhome.com