当前位置:首页 > 智能硬件 > 人工智能AI
[导读] Pybrain号称最好用的Python神经网络库。其实Scikit-Learn号称Python上最好用的机器学习库,但是它偏偏就没有神经网络这块,所以就与我无缘了。 之前也看过一些提到N

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)等。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭