PyBrain - 網路測試



在本章中,我們將看到一些示例,我們將訓練資料並在訓練資料上測試誤差。

我們將使用以下訓練器:

BackpropTrainer

BackpropTrainer 是一種訓練器,它根據監督式或 ClassificationDataSet 資料集(可能是順序的)訓練模組的引數,方法是反向傳播誤差(隨時間推移)。

TrainUntilConvergence

它用於在資料集上訓練模組,直到收斂。

當我們建立一個神經網路時,它將根據提供給它的訓練資料進行訓練。網路是否訓練得當將取決於在該網路上測試的測試資料的預測。

讓我們逐步檢視一個工作示例,我們將構建一個神經網路並預測訓練誤差、測試誤差和驗證誤差。

測試我們的網路

以下是我們將遵循的測試網路步驟:

  • 匯入所需的 PyBrain 和其他包
  • 建立 ClassificationDataSet
  • 將資料集拆分為 25% 的測試資料和 75% 的訓練資料
  • 將測試資料和訓練資料轉換回 ClassificationDataSet
  • 建立神經網路
  • 訓練網路
  • 視覺化誤差和驗證資料
  • 測試資料誤差百分比

步驟 1

匯入所需的 PyBrain 和其他包。

我們需要匯入的包如下所示:

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

步驟 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) 
# we are having inputs are 64 dim array and since the digits are from 0-9 the 
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() 方法會將資料集轉換為 superviseddataset,因此我們將資料集轉換回 classificationdataset,如上一步所示。

步驟 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']))

testData上的誤差百分比 - 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']
))
廣告
© . All rights reserved.