2013-08-02 96 views
5

我一直在努力創建一個使用pybrain的神經網絡,並且由於某種原因對它進行傳播訓練後,它無法訓練我的網絡。任何我在超出維度中使用超過兩個類的數據集,都會將我的所有觀察數據放到一個類別中。有誰知道爲什麼會發生這種情況?代碼和一些輸出如下。Pybrain神經網絡未能正確訓練

import scipy 
import numpy 
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 sklearn.metrics    import precision_score,recall_score,confusion_matrix 
def makeDataset(CSVfile,ClassFile): 
    #import the features to data, and their classes to dataClasses 
    data=numpy.genfromtxt(CSVfile,delimiter=",") 
    classes=numpy.genfromtxt(ClassFile,delimiter=",") 
    print("Building the dataset from CSV files") 
    #Initialize an empty Pybrain dataset, and populate it 
    alldata=ClassificationDataSet(len(data[0]),1,nb_classes=3) 
    for count in range(len((classes))): 
     alldata.addSample(data[count],[classes[count]]) 
    return alldata 



def makeNeuralNet(alldata,trainingPercent=.3,hiddenNeurons=5,trainingIterations=20): 
    #Divide the data set into training and non-training data  
    testData, trainData = alldata.splitWithProportion(trainingPercent) 
    testData._convertToOneOfMany() 
    trainData._convertToOneOfMany() 
    #Then build the network, and using backwards propogation to train it 
    network = buildNetwork(trainData.indim, hiddenNeurons, trainData.outdim, outclass=SoftmaxLayer) 
    trainer = BackpropTrainer(network, dataset=trainData, momentum=0.1, verbose=True, weightdecay=0.01) 
    for i in range(trainingIterations): 
     print("Training Epoch #"+str(i)) 
     trainer.trainEpochs(1) 
    return [network,trainer] 



def checkNeuralNet(trainer,alldata): 
    predictedVals=trainer.testOnClassData(alldata) 
    actualVals=list(alldata['target']) 
## for row in alldata['target']: 
##  row=list(row) 
##  index=row.index(1) 
##  actualVals+=[index] 
    print("-----------------------------") 
    print("-----------------------------") 
    print("The precision is "+str(precision_score(actualVals,predictedVals))) 
    print("The recall is "+str(recall_score(actualVals,predictedVals))) 
    print("The confusion matrix is as shown below:") 
    print(confusion_matrix(actualVals,predictedVals)) 


CSVfile="/home/ubuntu/test.csv" 
ClassFile="/home/ubuntu/test_Classes.csv" 
#Build our dataset 
alldata=makeDataset(CSVfile,ClassFile) 
#Build and train the network 
net=makeNeuralNet(alldata,trainingPercent=.7,hiddenNeurons=20,trainingIterations=20) 
network=net[0] 
trainer=net[1] 
#Check it's strength 
checkNeuralNet(trainer,alldata) 

培訓的最後時期具有0.09的錯誤,如在下面的輸出:

Training Epoch #19 
Total error: 0.0968444196605 

然而,當我去打印混淆矩陣,精確度和回憶,我得到的下面還有這個奇怪的錯誤:

UserWarning: The sum of true positives and false positives are equal to zero for some labels. Precision is ill defined for those labels [1 2]. The precision and recall are equal to zero for some labels. fbeta_score is ill defined for those labels [1 2]. 
    average=average) 
The precision is 0.316635552252 
UserWarning: The sum of true positives and false positives are equal to zero for some labels. Precision is ill defined for those labels [1 2]. The precision and recall are equal to zero for some labels. fbeta_score is ill defined for those labels [1 2]. 
    average=average) 
The recall is 0.562703787309 
The confusion matrix is as shown below: 
[[4487 0 0] 
[ 987 0 0] 
[2500 0 0]] 

回答

1

我有非常類似的問題,我發現SoftmaxLayer是原因。嘗試用其他東西替換它,例如SigmoidLayer。如果你的情況也是這樣的話,那麼這個班很有可能是班級。