是否有方法可以训练Pybrain在一个单一的神经网络中识别多个模式?例如,我已经添加了两个不同模式的几种排列组合:
第一个模式:
(200[1-9], 200[1-9]),(400[1-9],400[1-9])
第二个模式:
(900[1-9], 900[1-9]),(100[1-9],100[1-9])
然后在我的无监督数据集中,我添加了(90002, 90009),希望它能返回[100[1-9],100[1-9]](第二个模式),然而它返回了[25084, 25084]。我意识到它试图在给定所有输入的情况下找到最佳值,但是我试图让它在数据集中区分某些模式,如果这有意义的话。
这是我参考的例子:
from pybrain.tools.shortcuts import buildNetworkfrom pybrain.supervised.trainers import BackpropTrainerfrom pybrain.datasets import SupervisedDataSet,UnsupervisedDataSetfrom pybrain.structure import LinearLayerfrom pybrain.datasets import ClassificationDataSetfrom pybrain.structure.modules.sigmoidlayer import SigmoidLayerimport randomds = ClassificationDataSet(2, 1)tng_dataset_size = 1000unseen_dataset_size = 100print 'training dataset size is ', tng_dataset_sizeprint 'unseen dataset size is ', unseen_dataset_sizeprint 'adding data..'for x in range(tng_dataset_size): rand1 = random.randint(1,9) rand2 = random.randint(1,9) pattern_one_0 = int('2000'+str(rand1)) pattern_one_1 = int('2000'+str(rand2)) pattern_two_0 = int('9000'+str(rand1)) pattern_two_1 = int('9000'+str(rand2)) ds.addSample((pattern_one_0,pattern_one_1),(0))#pattern 1, maps to 0 ds.addSample((pattern_two_0,pattern_two_1),(1))#pattern 2, maps to 1unsupervised_results = []net = buildNetwork(2, 1, 1, outclass=LinearLayer,bias=True, recurrent=True)print 'training ...'trainer = BackpropTrainer(net, ds)trainer.trainEpochs(500)ts = UnsupervisedDataSet(2,)print 'adding pattern 2 to unseen data'for x in xrange(unseen_dataset_size): pattern_two_0 = int('9000'+str(rand1)) pattern_two_1 = int('9000'+str(rand1)) ts.addSample((pattern_two_0, pattern_two_1))#adding first part of pattern 2 to unseen data a = [int(i) for i in net.activateOnDataset(ts)[0]]#should map to 1 unsupervised_results.append(a[0])print 'total hits for pattern 1 ', unsupervised_results.count(0)print 'total hits for pattern 2 ', unsupervised_results.count(1)
[[EDIT]] 添加了分类变量和ClassificationDataSet。
[[EDIT 1]] 添加了更大的训练集和未见数据集
回答:
是的,有方法可以做到。问题在于你选择的表示方式。你在训练网络输出实数,因此你的神经网络是一个函数,它在一定程度上近似于你在数据集中采样并提供的函数。因此,结果会是介于10000和40000之间的某个值。
看起来你更像是想要一个分类器。根据你的描述,我假设你有一组明确定义的模式,你正在寻找这些模式。然后你必须将你的模式映射到一个分类变量。例如,你提到的模式1 (200[1-9], 200[1-9]),(400[1-9],400[1-9])
可以是0,模式2可以是1,以此类推。
然后,你训练网络输出输入模式所属的类别(0,1,…)。可以说,鉴于你的模式结构,基于规则的分类可能比人工神经网络更合适。
关于数据量,你需要更多的数据。通常,最基本的方法是将数据集分成两组(例如70-30)。你使用70%的样本进行训练,剩下的30%用作未见数据(测试数据),以评估模型的泛化/过拟合情况。一旦你掌握了基本知识,你可能想了解一下交叉验证。