这篇文章主要介绍了大蟒实现碱基对神经网络回归预测模型,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
神经网络模型一般用来做分类,回归预测模型不常见,本文基于一个用来分类的碱基对神经网络,对它进行修改,实现了一个回归模型,用来做室内定位。模型主要变化是去掉了第三层的非线性转换,或者说把非线性激活函数乙状结肠的换成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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。