pybrain号称最好用的python神经网络库。其实scikit-learn号称python上最好用的机器学习库,但是它偏偏就没有神经网络这块,所以就与我无缘了。
之前也看过一些提到neurolab这个库的,打算之后尝试一下(好像支持的神经网络不太一样)。
pybrain的文档传说中写得不错,但是我需要的例子它并没有。官方文档给的例子是用于分类的,而不是数据拟合(预测,或者叫做回归问题)。
另外,官方文档的函数(方法)说明并不全,有一些需要自己通过help函数在python shell里调用,或者直接阅读源代码。
好了言归正传。大概分为以下这几步。
. 构造神经网络
. 构造数据集
. 训练神经网络
. 结果可视化
. 验证与分析
构造神经网络
可以采用快速建立神经网络的模式,也可以自己设定神经网络。这里采用第二种做法,建立的是前馈神经网络。
from pybrain.structure import *
# 建立神经网络fnn
fnn = feedforwardnetwork()
# 设立三层,一层输入层(3个神经元,别名为inlayer),一层隐藏层,一层输出层
inlayer = linearlayer(3,)
hiddenlayer = sigmoidlayer(7,)
outlayer = linearlayer(1,)
# 将三层都加入神经网络(即加入神经元)
fnn.addinputmodule(inlayer)
fnn.addmodule(hiddenlayer)
fnn.addoutputmodule(outlayer)
# 建立三层之间的连接
in_to_hidden = fullconnection(inlayer, hiddenlayer)
hidden_to_out = fullconnection(hiddenlayer, outlayer)
# 将连接加入神经网络
fnn.addconnection(in_to_hidden)
fnn.addconnection(hidden_to_out)
# 让神经网络可用
fnn.sortmodules()
构造数据集
在构造数据集的时候,我用的是superviseddataset,即监督数据集。也可以试一试别的。
from pybrain.supervised.trainers import backproptrainer
# 定义数据集的格式是三维输入,一维输出
ds = superviseddataset(3,1)
# 往数据集内加样本点
# 假设x1,x2,x3是输入的三个维度向量,y是输出向量,并且它们的长度相同
for i in len(y):
ds.addsample([x1[i], x2[i], x3[i]], [y[i]])
# 如果要获得里面的输入/输出时,可以用
x = ds['input']
y = ds['target']
# 如果要把数据集切分成训练集和测试集,可以用下面的语句,训练集:测试集=8:2
# 为了方便之后的调用,可以把输入和输出拎出来
datatrain, datatest = ds.splitwithproportion(0.8)
xtrain, ytrain = datatrain['input'], datatrain['target']
xtest, ytest = datatest['input'], datatest['target']
构造数据集部分就这样告一段落了。
训练神经网络
俗话说得好,80%的工作往往是20%的部分完成的。嗯哼,其实最重要的代码就是如下这几行啦。
不过调用的是别人的东西,也不知道内部的实现比例,就是开个玩笑。
from pybrain.supervised.trainers import backproptrainer
# 训练器采用bp算法
# verbose = true即训练时会把total error打印出来,库里默认训练集和验证集的比例为4:1,可以在括号里更改
trainer = backproptrainer(fnn, datatrain, verbose = true, learningrate=0.01)
# maxepochs即你需要的最大收敛迭代次数,这里采用的方法是训练至收敛,我一般设为1000
trainer.trainuntilconvergence(maxepochs=1000)
结果可视化
数据可视化就不提了,基本上用的是pylab来进行数据可视化,具体可见这篇博文:
python的一些画图函数。
验证与分析
首先,我们可以挑一个随机数据来看看结果。
import random
# c为从0到xtest的长度(包括0,不包括长度)之间的随机值
c = random.randint(0, xtest.shape[0])
# x2为xtest的一个随机样本点
x2 = xtest[c,:]
# activate函数即神经网络训练后,预测的x2的输出值
prediction = fnn.activate(x2)
# 可以将其打印出来
print('true number is: ' + str(ytest[c]),
'prediction number is:' + str(prediction),
'error:' + str((prediction-ytest[c])/ytest[c]))
我们可以把神经网络打印出来,此处的代码是在stackoverflow里找到的,出处忘了,感谢那个哥们的轮子。
这样就可以看各条连接的权重了。
for mod in fnn.modules:
print module:, mod.name
if mod.paramdim > 0:
print --parameters:, mod.params
for conn in fnn.connections[mod]:
print -connection to, conn.outmod.name
if conn.paramdim > 0:
print - parameters, conn.params
if hasattr(fnn, recurrentconns):
print recurrent connections
for conn in fnn.recurrentconns:
print -, conn.inmod.name, to, conn.outmod.name
if conn.paramdim > 0:
print - parameters, conn.params
我们可以调用一个计时器来看程序的运行时间,判断性能
import time
# 在需要计时的代码前调用这个
start = time.clock()
# 在需要计时的代码后再调用一次clock函数
elapsed = (time.clock()-start)
print(time used: + str(elapsed))
如果需要一些统计数据的话,可以自己写一些统计类的函数,或者找包里的tools模块,有一些统计函数,比如均方误差(mse)等。
HoloLens更新将带来许多新功能和便利性改进
以“感·创未来”为主题的2020广汽科技日以线上形式举行
小米6X和荣耀8X哪个好
加拿大正式宣布禁飞波音737Max 8飞机和波音737Max 9飞机
LTE技术特点解析
用Pybrain库进行神经网络数据拟合的主要步骤
微软将在 GitHub 网站移除所有不必要的 cookie,不会弹出提示横幅
Marvell交换芯片介绍之MII、MDIO
苹果iOS应用程序不经过用户同意读取剪贴板数据
影响逆变器输出功率的因素有哪些
织物静态拉伸测试仪的检测原理和试验方法介绍
华为云推出场景化解决方案帮助制造企业加速数字化转型
一文解析扇出型封装技术
腾讯引进Nintendo Switch ™将首次参展进博会
关于晶棒的常见知识点总结(8个基础要点)
自适应计算加速平台 功能超CPU和FPGA
兼容替代NRF24L01P的2.4G无线射频芯片
是德科技大学支持计划-教师培训营
SoC(System on chip)与NoC(network-on-chip)
碳化硅解决方案满足快速充电基础设施设计要求