使用Pybrain进行模式识别

是否有方法可以训练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%用作未见数据(测试数据),以评估模型的泛化/过拟合情况。一旦你掌握了基本知识,你可能想了解一下交叉验证。

Related Posts

Keras Dense层输入未被展平

这是我的测试代码: from keras import…

无法将分类变量输入随机森林

我有10个分类变量和3个数值变量。我在分割后直接将它们…

如何在Keras中对每个输出应用Sigmoid函数?

这是我代码的一部分。 model = Sequenti…

如何选择类概率的最佳阈值?

我的神经网络输出是一个用于多标签分类的预测类概率表: …

在Keras中使用深度学习得到不同的结果

我按照一个教程使用Keras中的深度神经网络进行文本分…

‘MatMul’操作的输入’b’类型为float32,与参数’a’的类型float64不匹配

我写了一个简单的TensorFlow代码,但不断遇到T…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注