Pybrain 前馈神经网络训练误差完全停滞

2 投票
1 回答
2951 浏览
提问于 2025-04-17 16:08

大家好,我需要一点帮助,关于我的pybrain代码。所有东西加载得很好,但在第一次训练后,训练的错误值没有下降。实际上,它一直停在13.3484055174这个数字上。我检查了很多次我的代码,并和其他例子进行了比较,但总是遇到同样的问题。我还尝试过改变隐藏单元的数量、学习率、动量和权重衰减,但都没有效果。我查看了参数,发现它从[-1到1]开始,然后一下子飙升到大约240-250。我在想有没有人能看出为什么它不工作。我相信我遗漏了一个非常简单的一行代码。

我正在处理kaggle的0-9数字分类数据集。我已经让随机森林模型工作了,但我真的想让这个神经网络也能运行。任何帮助都将非常感激。

#learn digit classification with a nerual network

import pybrain
from pybrain.datasets import *
from pybrain.tools.shortcuts import buildNetwork
from pybrain.supervised.trainers import BackpropTrainer
from pybrain.structure.modules   import SoftmaxLayer
from pybrain.utilities           import percentError
import numpy

print "Importing training and test data"
data = numpy.genfromtxt('trainR.csv', delimiter = ',')
data = data[1:]
traindata = data[:(len(data)/2)]
testdata = data[(len(data)/2)+1:]

print "Importing actual data"
actualdata = numpy.genfromtxt('trainR.csv', delimiter = ',')

print "Adding samples to dataset and setting up neural network"
ds = ClassificationDataSet(784, 10, nb_classes = 10)
for x in traindata:
    ds.addSample(tuple(x[1:]),tuple(x[0:1]))
ds._convertToOneOfMany( bounds=[0,1] )
net = buildNetwork(784, 100, 10, bias=True, outclass=SoftmaxLayer)

print "Training the neural network"
trainer = BackpropTrainer(net, dataset=ds, momentum = 0.1,
                    verbose = True, weightdecay = 0.01)
for i in range(3):
    # train the network for 1 epoch
    trainer.trainEpochs( 1 )

    # evaluate the result on the training and test data
    trnresult = percentError( trainer.testOnClassData(), [x[0] for x in traindata] )

    # print the result
    print "epoch: " + str(trainer.totalepochs) + "  train error: " + str(trnresult)

print ""
print "Predicting with the neural network"
answerlist = []
for row in testdata:
    answer = numpy.argmax(net.activate(row[1:]))
    answerlist.append(answer)
tstresult = percentError(answerlist, [x[0] for x in testdata])
print "Test error: " + str(tstresult)

1 个回答

3

试着把

 ds = ClassificationDataSet(784, 10, nb_classes = 10)

改成

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

我觉得 ClassificationDataSet 的第二个参数是目标的维度,而不是类的数量,这个数量是由 nb_classes 给出的。这取决于你的数据是怎么组织的。最好的办法是把每个目标作为每个类的整数输入,然后使用 _convertToOneOfMany()

如果你能提供你的第一个样本,那就更好了。

撰写回答