【问题标题】:Pattern recognition with Pybrain使用 Pybrain 进行模式识别
【发布时间】:2023-03-17 10:10:02
【问题描述】:

有没有一种方法可以训练 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]。我意识到它试图在给定所有输入的情况下找到最佳值,但是如果有意义的话,我试图让它区分集合中的某些模式。

这是我正在使用的示例:

Request for example: Recurrent neural network for predicting next value in a sequence

from pybrain.tools.shortcuts import buildNetwork
from pybrain.supervised.trainers import BackpropTrainer
from pybrain.datasets import SupervisedDataSet,UnsupervisedDataSet
from pybrain.structure import LinearLayer
from pybrain.datasets import ClassificationDataSet
from pybrain.structure.modules.sigmoidlayer import SigmoidLayer
import random

ds = ClassificationDataSet(2, 1)

tng_dataset_size = 1000
unseen_dataset_size = 100
print 'training dataset size is ', tng_dataset_size
print 'unseen dataset size is ', unseen_dataset_size
print '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 1


unsupervised_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]] 添加了分类变量和分类数据集。

[[EDIT 1]] 增加了更大的训练集和看不见的集

【问题讨论】:

    标签: python machine-learning pybrain


    【解决方案1】:

    是的,有。这里的问题是您选择的表示。您正在训练网络以输出实数,因此您的 NN 是一个函数,它在一定程度上近似于您在数据集中采样和提供的函数。因此是 10000 到 40000 之间某个值的结果。

    您看起来更像是在寻找classifier。 鉴于您的描述,我假设您有一组明确定义的模式,您正在寻找。然后,您必须将模式映射到分类变量。例如,您提到的模式 1 (200[1-9], 200[1-9]),(400[1-9],400[1-9]) 为 0,模式 2 为 1,依此类推。

    然后,您训练网络以输出输入模式所属的类别 (0,1,...)。 可以说,鉴于您的模式结构,基于规则的分类可能比人工神经网络更充分。

    关于数据量,您需要更多。通常,最基本的方法是将数据集分成两组(例如 70-30)。您使用 70% 的样本进行训练,剩下的 30% 用作看不见的数据(测试数据),以评估模型的泛化/过度拟合。一旦你掌握了基础知识,你可能想了解交叉验证。

    【讨论】:

    • 我添加了一个 ClassificaitonDataSet 并像你说的那样放入分类变量,但是它不能识别正确的模式。是否需要更多数据或训练周期?
    • 是的,您还需要更多数据。我没有添加,因为我假设您仅发布了一个示例。立即查看更新。
    • 我显然做错了什么。我在训练数据集中添加了 1000 行,在看不见的数据集中添加了 100 行。它仍然没有 100% 的时间猜出正确的模式..
    • 这是一个不同的问题,通常是这样的。查看分类器的性能指标。
    猜你喜欢
    • 2023-03-24
    • 2015-12-06
    • 2011-06-30
    • 2019-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-22
    • 2011-02-14
    相关资源
    最近更新 更多