PyBrain - 测试网络

在本章中,我们将看到一些示例,我们将在其中训练数据并在训练后的数据上测试错误。

我们将使用训练器 −

BackpropTrainer

BackpropTrainer 是一种训练器,它通过反向传播错误(随时间)根据监督或 ClassificationDataSet 数据集(可能是连续的)训练模块的参数。

TrainUntilConvergence

它用于在数据集上训练模块,直到它收敛。

当我们创建一个神经网络时,它将根据提供给它的训练数据进行训练。现在,网络是否得到正确训练将取决于对该网络上测试的测试数据的预测。

让我们一步一步地看一个工作示例,其中将构建一个神经网络并预测训练误差、测试误差和验证误差。

测试我们的网络

以下是我们测试网络时要遵循的步骤 −

  • 导入所需的 PyBrain 和其他包
  • 创建 ClassificationDataSet
  • 将数据集分成 25% 作为测试数据,75% 作为训练数据
  • 将测试数据和训练数据转换回 ClassificationDataSet
  • 创建神经网络
  • 训练网络
  • 可视化误差和验证数据
  • 测试数据误差百分比

步骤 1

导入所需的 PyBrain 和其他包。

导入我们需要的包如下所示 −

从 sklearn 导入数据集
导入 matplotlib.pyplot 作为 plt
从 pybrain.datasets 导入 ClassificationDataSet
从 pybrain.utilities 导入 percentError
从 pybrain.tools.shortcuts 导入 buildNetwork
从 pybrain.supervised.trainers 导入 BackpropTrainer
从 pybrain.structure.modules 导入 SoftmaxLayer
从 numpy 导入 ravel

步骤 2

下一步是创建 ClassificationDataSet。

对于数据集,我们将使用来自 sklearn 数据集的数据集,如下所示 −

在以下链接中引用来自 sklearn 的 load_digits 数据集 −

https://scikit-learn.org/stable/modules/generated/sklearn.datasets.load_digits.html#sklearn.datasets.load_digits

digits = datasets.load_digits()
X, y = digits.data, digits.target

ds = ClassificationDataSet(64, 1, nb_classes=10) 
# 我们的输入是 64 个 dim 数组,由于数字是从 0-9,
classes considered is 10.

for i in range(len(X)):
   ds.addSample(ravel(X[i]), y[i]) # adding sample to datasets

步骤 3

将数据集分成 25% 作为测试数据,75% 作为训练数据 −

test_data_temp, training_data_temp = ds.splitWithProportion(0.25)

因此,在这里,我们在数据集上使用了一种名为 splitWithProportion() 的方法,值为 0.25,它将数据集分成 25% 作为测试数据,75% 作为训练数据。

步骤 4

将测试数据和训练数据转换回 ClassificationDataSet。

test_data = ClassificationDataSet(64, 1, nb_classes=10)
for n in range(0, test_data_temp.getLength()):
   test_data.addSample( test_data_temp.getSample(n)[0], test_data_temp.getSample(n)[1] )
training_data = ClassificationDataSet(64, 1, nb_classes=10)

for n in range(0, training_data_temp.getLength()):

training_data.addSample( 
   training_data_temp.getSample(n)[0], training_data_temp.getSample(n)[1] 
)
test_data._convertToOneOfMany()
training_data._convertToOneOfMany()

在数据集上使用 splitWithProportion() 方法将数据集转换为监督数据集,因此我们将数据集转换回分类数据集,如上一步所示。

步骤 5

下一步是创建一个神经网络。

net = buildNetwork(training_data.indim, 64, training_data.outdim, outclass=SoftmaxLayer)

我们正在创建一个网络,其中的输入和输出来自训练数据。

步骤 6

训练网络

现在重要的部分是在数据集上训练网络,如下所示 −

trainer = BackpropTrainer(net, dataset=training_data,
momentum=0.1,learningrate=0.01,verbose=True,weightdecay=0.01)

我们使用 BackpropTrainer() 方法并在创建的网络上使用数据集。

步骤 7

下一步是可视化数据的错误和验证。

trnerr,valerr = trainer.trainUntilConvergence(dataset=training_data,maxEpochs=10)
plt.plot(trnerr,'b',valerr,'r')
plt.show()

我们将在训练数据上使用一种名为 trainUntilConvergence 的方法,该方法将收敛 10 个时期。它将返回我们绘制的训练错误和验证错误,如下所示。蓝线显示训练误差,红线显示验证误差。

Training Data

执行上述代码期间收到的总误差如下所示 −

Total error: 0.0432857814358
Total error: 0.0222276374185
Total error: 0.0149012052174
Total error: 0.011876985318
Total error: 0.00939854792853
Total error: 0.00782202445183
Total error: 0.00714707652044
Total error: 0.00606068893793
Total error: 0.00544257958975
Total error: 0.00463929281336
Total error: 0.00441275665294
('train-errors:', '[0.043286 , 0.022228 , 0.014901 , 0.011877 , 0.009399 , 0.007
822 , 0.007147 , 0.006061 , 0.005443 , 0.004639 , 0.004413 ]')
('valid-errors:', '[0.074296 , 0.027332 , 0.016461 , 0.014298 , 0.012129 , 0.009
248 , 0.008922 , 0.007917 , 0.006547 , 0.005883 , 0.006572 , 0.005811 ]')

错误率从 0.04 开始,之后每轮都会下降,这意味着网络正在接受训练,并且每轮都会变得更好。

步骤 8

测试数据错误率

我们可以使用 percentError 方法检查错误率,如下所示 −

print('Percent Error on 
   testData:',percentError(trainer.testOnClassData(dataset=test_data), 
   test_data['class']))

测试数据的百分比误差 − 3.34075723830735

我们得到的误差百分比是 3.34%,这意味着神经网络的准确率为 97%。

以下是完整代码 −

from sklearn import datasets
import matplotlib.pyplot as plt
from pybrain.datasets import ClassificationDataSet
from pybrain.utilities import percentError
from pybrain.tools.shortcuts import buildNetwork
from pybrain.supervised.trainers import BackpropTrainer
from pybrain.structure.modules import SoftmaxLayer
from numpy import ravel
digits = datasets.load_digits()
X, y = digits.data, digits.target

ds = ClassificationDataSet(64, 1, nb_classes=10)

for i in range(len(X)):
   ds.addSample(ravel(X[i]), y[i])

test_data_temp, training_data_temp = ds.splitWithProportion(0.25)
test_data = ClassificationDataSet(64, 1, nb_classes=10)
for n in range(0, test_data_temp.getLength()):
   test_data.addSample( test_data_temp.getSample(n)[0], test_data_temp.getSample(n)[1] )
training_data = ClassificationDataSet(64, 1, nb_classes=10)

for n in range(0, training_data_temp.getLength()):
   training_data.addSample( 
      training_data_temp.getSample(n)[0], training_data_temp.getSample(n)[1] 
   )
test_data._convertToOneOfMany()
training_data._convertToOneOfMany()

net = buildNetwork(training_data.indim, 64, training_data.outdim, outclass=SoftmaxLayer)
trainer = BackpropTrainer(
   net, dataset=training_data, momentum=0.1,
   learningrate=0.01,verbose=True,weightdecay=0.01
)
trnerr,valerr = trainer.trainUntilConvergence(dataset=training_data,maxEpochs=10)
plt.plot(trnerr,'b',valerr,'r')
plt.show()

trainer.trainEpochs(10)
print('Percent Error on testData:',percentError(
   trainer.testOnClassData(dataset=test_data), test_data['class']
))