python实现多层感知器
作者:陆子野 发布时间:2022-07-04 14:37:10
标签: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,
for i in self.W:
print i.shape,
for i in self.b:
print i.shape,
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 "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)
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()
效果图:
来源:https://blog.csdn.net/u013781175/article/details/48313903


猜你喜欢
- 从去年六一儿童节的LOGO开始,我们就要求以后的每一个节日FLASH LOGO设计时除了具备创意故事外,还必须设计一个小的互动效果,当受众把
- 本文首先举例阐述了两种排序方法的操作步骤,然后列出了用python进行的实现过程,最后对桶式排序方法的优劣进行了简单总结。一、桶排序:排序一
- 一、selenium截取验证码import jsonfrom io import BytesIOimport timefrom test.t
- 1.分析 我们在用 php 制作网站时,分类是很重要的,在分类下面又再分类这第二个分类称为次分类,而现在大多
- 变量方法举例备注用变量存储值name = "xxx"print("name ", name )小写字
- 做表单验证的时候是否会碰到验证某个输入框内只能填写数字呢,仅允许输入整数数字或者带小数点的数字。下面这段代码也许能帮到你!通过对当前输入框定
- 在使用一些 Javascript 框架时,或许会看到类似的代码var MyClass = new Class({initialize: fu
- 生成HTML方法主要步骤只有两个:一、获取要生成的html文件的内容二、将获取的html文件内容保存为html文件我在这里主要说明的只是第一
- <script language="javascript"> function window.onload(
- 本文实例讲述了php中加密解密DES类的简单使用方法。分享给大家供大家参考,具体如下:在平时的开发工作中,我们经常会对关键字符进行加密,可能
- 值类型和引用类型值类型:int、float、bool和string这些类型都属于值类型,使用这些类型的变量直接指向存在内存中的值,值类型的变
- VueConf ,尤大说, Vue 支持 Ts 了,网上关于 Vue + Ts 的资料有点少, 楼主踩了一个星期坑,终于摸明白了 修饰器 的
- 本文实例为大家分享了python opencv实现图像配准与比较的具体代码,供大家参考,具体内容如下代码 from skimage
- js一共有9种数据类型,分别是:未定义(undefined)、空(null)、布尔型(boolean)、字符串(string)、数值(num
- 这里的Go(SDK)、GoLand的安装就不多说了,网上自行下载,我们着重讲项目配置,import pkg时能够完美运行一、Go版本以及Go
- 1.实现的思路(1)首先使用一个处理画框的程序,将图片中的有车和无车的停车位给画出来,并且保存坐标(如果画错了,将鼠标移至要删除的框中,右击
- 使用bootstrap界面美观,可预览,可拖拽上传,可配合ajax异步或同步上传,下面是效果图:前端代码:fileinput.html<
- 本文实例讲述了Python3爬虫学习之将爬取的信息保存到本地的方法。分享给大家供大家参考,具体如下:将爬取的信息存储到本地之前我们都是将爬取
- xorm用于在golang中链接数据库,并完成增删改差操作,不管是orm还是raw方式都十分的新颖简单。sql语句postgresql pg
- 1.算法描述:(1)共循环 n-1 次(2)每次循环中,如果 前面的数大于后面的数,就交换(3)设置一个标签,如果上次没有交换,就说明这个是