,,python实现BP神经网络回归预测模型

,,python实现BP神经网络回归预测模型

这篇文章主要介绍了大蟒实现碱基对神经网络回归预测模型,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

神经网络模型一般用来做分类,回归预测模型不常见,本文基于一个用来分类的碱基对神经网络,对它进行修改,实现了一个回归模型,用来做室内定位。模型主要变化是去掉了第三层的非线性转换,或者说把非线性激活函数乙状结肠的换成f(x)=x函数。这样做的主要原因是乙状结肠的函数的输出范围太小,在0-1之间,而回归模型的输出范围较大。模型修改如下:

代码如下:

#编码:utf8

''''

作者:黄玉良

'''

导入json

随机导入

导入系统

将numpy作为铭牌导入

####定义二次和交叉熵成本函数

类交叉入口成本(对象):

@静态方法

def fn(a,y):

返回NP。sum(NP。nan _ to _ num(-y * NP。log(a)-(1-y)* NP。log(1-a)))

@静态方法

定义增量(z,a,y):

返回(阿英)

####主网络类

类网络(对象):

def __init__(self,sizes,cost=CrossEntropyCost):

self.num_layers=len(尺寸)

自身尺寸=尺码

自我。default _ weight _ initializer()

自我成本=成本

def default _ weight _ initializer(self):

自我。bias=[NP。随机的。randn(y,1) for y in self.sizes[1:]]

自我权重=[np.random.randn(y,x)/np.sqrt(x)

对于x,y在zip(self。尺寸[:-1],自身。size[1:])]

def large _ weight _ initializer(self):

自我。bias=[NP。随机的。randn(y,1) for y in self.sizes[1:]]

自我。权重=[NP。随机的。randn(y,x)

对于x,y在zip(self。尺寸[:-1],自身。size[1:])]

定义前馈(自身,a):

''如果输入了" a "则返回网络的输出。'''

对于zip中的b、w(self。bias[:-1],self.weights[:-1]): #前n-1层

a=s形(np.dot(w,a) b)

b=自我偏见[-1] #最后一层

w=自重[-1]

a=np.dot(w,a) b

返回a

def SGD(self,training_data,epochs,mini_batch_size,eta

lmbda=0.0,

评估_数据=无

monitor _ evaluation _ accuracy=False):用随机梯度下降算法进行训练

n=len(training_data)

对于xrange中的j(历元):

随机洗牌(训练数据)

mini _ batches=[x范围(0,n,mini_batch_size)中k的training _ data[k:k mini _ batch _ size]

对于迷你批处理中的迷你批处理:

自我。update _ mini _ batch(mini _ batch,eta,lmbda,len(training_data))

打印('纪元%s训练完成% j’)

如果监控_评估_准确性:

打印('评估数据的准确性:{}/{} '。格式(自我准确性(评估数据),j))

def update_mini_batch(self,mini_batch,eta,lmbda,n):

' ' '通过应用梯度更新网络的权重和偏差

使用反向传播下降到一个小批量。这

"迷你批处理"是元组` `( x,y)'的列表,“预计到达时间”是

学习率,“lmbda”是正则化参数,以及

" n "是训练数据集的总大小。

'''

nab la _ b=[NP。自我中b的零(b . shape)。偏见]

nab la _ w=[自重中w的NP。零(带形状)]

对于迷你批处理中的x,y:

delta_nabla_b,delta_nabla_w=self.backprop(x,y)

nabla_b=[nb dnb for nb,dnb in zip(nabla_b,delta_nabla_b)]

nabla_w=[nw dnw for nw,dnw in zip(nabla_w,delta_nabla_w)]

自我。权重=[(1-eta *(lmbda/n))* w-(eta/len(mini _ batch))* NW

对于w,zip中的西北(自重,nabla_w)]

自我。bias=[b-(eta/len(mini _ batch))* nb

对于b,nb在活力中(自我偏见,nabla_b)]

定义反向投影(自身,x,y):

' ' '返回一个元组` `(纳布拉_b,纳布拉_w)`表示

成本函数C_x的梯度

"纳布拉瓦特"是numpy数组的逐层列表,类似于

到"自我偏见"和"自我重量"

nab la _ b=[自偏差中b的NP。零(b .形状)]

nab la _ w=[自重中w的NP。零(带形状)]

#前馈

激活=x

激活=[x] #列表存储所有激活,逐层

zs=[] #列表存储所有的z向量,一层一层

对于zip中的b、w(self。bias[:-1],self.weights[:-1]): #正向传播前n-1层

z=np.dot(w,激活)b

附加(z)

激活=sigmoid(z)

激活。附加(激活)

# 最后一层,不用非线性

b=自我偏见[-1]

w=自重[-1]

z=np.dot(w,激活)b

附加(z)

激活=z

激活。附加(激活)

#向后传球反向传播

delta=(自身成本).delta(zs[-1],activations[-1],y) #误差Tj Oj

nabla_b[-1]=delta

nabla_w[-1]=np.dot(delta,activations[-2].transpose()) # (Tj - Oj) * O(j-1)

对于xrange(2,自身层数)中的l:

z=zs[-l] # w*a b

sp=sigmoid_prime(z) # z * (1-z)

delta=np.dot(自重[-l 1]).transpose(),delta) * sp # z*(1-z)*(Err*w)隐藏层误差

nabla_b[-l]=delta

nabla_w[-l]=np.dot(delta,activations[-l-1]).transpose()) # Errj * Oi

return (nabla_b,nabla_w)

定义准确度(自身,数据):

结果=[(数据中(x,y)的自前馈(x,y)]

list=[NP。sqrt((x[0][0]-y[0])* * 2(x[1][0]-y[1])* * 2)for(x,y) in results]

返回平均列表)

定义保存(自身,文件名):

' ' '将神经网络保存到文件` `文件名`'''

data={ ' size ':self。尺寸,

weights ':[w . to list()for w in self重量],

'偏':[b .为b在自我中列出()。偏见],

' cost': str(self.cost.__name__)}

f=打开(文件名,“w”)

json.dump(data,f)

f.close()

####加载网络

定义加载(文件名):

' ' '从文件` `文件名`'加载神经网络。返回

网络实例。

'''

f=打开(文件名,' r ')

data=json.load(f)

f.close()

成本=getattr(系统。模块[_ _名称_ _],数据['成本'])

净值=网络(数据['大小'],成本=成本)

网。权重=[NP。数据中w的数组[' weights ']]

网。bias=[NP。数据中b的数组(b[' bias ']]

返回网

定义乙状结肠(z):

的形函数'''

return 1.0/(1.0 np.exp(-z))

def sigmoid_prime(z):

乙状结肠函数的导数'''

返回sigmoid(z)*(1-sigmoid(z))

调用神经网络进行训练并保存参数:

#编码:utf8

导入我的数据加载器1

导入网络_0

training_data,test _ data=my _ datas _ loader _ 1。加载数据包装器()

#### 训练网络,保存训练好的参数

net=network_0 .网络([14,100,2),成本=网络_0 .CrossEntropyCost)

net.large_weight_initializer()

网. SGD(training_data,1000,316,0.005,lmbda=0.1,evaluation_data=test_data,monitor _ evaluation _ accuracy=True)

filename=r ' c:\ Users \ hyl \ Desktop \ Second _ 158 \ Regression _ Model \ parameters。'文本'

net.save(文件名)

第190-199轮训练结果如下:

调用保存好的参数,进行定位预测:

#编码:utf8

导入我的数据加载器1

导入网络_0

将matplotlib.pyplot作为plt导入

测试数据=我的数据加载器1。负载测试数据()

#### 调用训练好的网络,用来进行预测

filename=r ' d:\ works pase \ n rual _ networks \ parameters。txt ' # #文件保存训练好的参数

net=network_0.load(文件名)##调用参数,形成网络

图=plt。图(1)

ax=fig.add_subplot(1,1,1)

轴轴('等于)

# plt.grid(color='b ',linewidth='0.5 ',linestyle='-') #添加网格

x=[-0.3,-0.3,-17.1,-17.1,-0.3] ##这是九楼地形的轮廓

y=[-0.3,26.4,26.4,-0.3,-0.3]

m=[1.5,1.5,-18.9,-18.9,1.5]

n=[-2.1,28.2,28.2,-2.1,-2.1]

ax.plot(x,y,m,n,c='k ')

对于范围内的I(len(test _ data)):

pre=净额。前馈(test_data[i][0]) # pre是预测出的坐标

bx=pre[0]

by=pre[1]

ax.scatter(bx,by,s=4,lw=2,marker=' . ',alpha=1) #散点图

plt暂停(0.001)

plt.show()

定位精度达到了1.5米左右。定位效果如下图所示:

真正的路径是行人从原点绕着环形走廊走。

这就是本文的全部内容。希望对大家的学习有帮助,支持我们。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: