python 다 중 감지 기 구현

4384 단어 python감지 기
다 층 감지 기 를 써 서 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 "
=======================================" """ 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()
효과 그림:

이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기