首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法从NuPIC CLA模型生成标量预测

无法从NuPIC CLA模型生成标量预测
EN

Stack Overflow用户
提问于 2015-04-09 17:20:19
回答 2查看 198关注 0票数 0

我无法从CLA模型中得到标量预测。

下面是一个完整的例子。它使用config创建一个使用ModelFactory的模型。然后它用一个简单的数据集({input_field=X,output_field=X},其中X是0-1之间的随机数据集)来训练它。然后尝试使用表单{input_field=X,output_field=None}的输入提取预测。

代码语言:javascript
复制
#!/usr/bin/python

import random
from nupic.frameworks.opf.modelfactory import ModelFactory

config = {
    'model': "CLA",
    'version': 1,
    'modelParams': {
        'inferenceType': 'NontemporalClassification',
        'sensorParams': {
            'verbosity' : 0,
            'encoders': {
              '_classifierInput':     {
                'classifierOnly': True,
                'clipInput': True,
                'fieldname': u'output_field',
                'maxval': 1.0,
                'minval': 0.0,
                'n': 100,
                'name': '_classifierInput',
                'type': 'ScalarEncoder',
                'w': 21},
              u'input_field':     {
                'clipInput': True,
                'fieldname': u'input_field',
                'maxval': 1.0,
                'minval': 0.0,
                'n': 100,
                'name': u'input_field',
                'type': 'ScalarEncoder',
                'w': 21},
            },
        },

        'spEnable': False,
        'tpEnable' : False,

        'clParams': {
            'regionName' : 'CLAClassifierRegion',
            'clVerbosity' : 0,
            'alpha': 0.001,
            'steps': '0',
        },
    },
}

model = ModelFactory.create(config)

ROWS = 100
def sample():
    return random.uniform(0.0, 1.0)

# training data is {input_field: X, output_field: X}
def training():
    for r in range(ROWS):
        value = sample()
        yield {"input_field": value, "output_field": value}

# testing data is {input_field: X, output_field: None} (want output_field predicted)
def testing():
    for r in range(ROWS):
        value = sample()
        yield {"input_field": value, "output_field": None}

model.enableInference({"predictedField": "output_field"})
model.enableLearning()
for row in training():
    model.run(row)
#model.finishLearning() fails in clamodel.py

model.disableLearning()
for row in testing():
    result = model.run(row)
    print result.inferences # Shows None as value

我看到的输出是高可信度的None,而不是我所期望的,这接近于输入值(因为模型是在input==output上训练的)。

代码语言:javascript
复制
{'multiStepPredictions': {0: {None: 1.0}}, 'multiStepBestPredictions': {0: None}, 'anomalyScore': None}
{'multiStepPredictions': {0: {None: 0.99999999999999978}}, 'multiStepBestPredictions': {0: None}, 'anomalyScore': None}
{'multiStepPredictions': {0: {None: 1.0000000000000002}}, 'multiStepBestPredictions': {0: None}, 'anomalyScore': None}
{'multiStepPredictions': {0: {None: 1.0}}, 'multiStepBestPredictions': {0: None}, 'anomalyScore': None}
  • “NontemporalClassification”似乎是正确的inferenceType,因为它是一个简单的分类。但这适用于标量吗?
  • 是否有不同的方式来表达我想要的预测,而不是output_field=None?
  • 我需要output_field成为classifierOnly=True。是否有相关的配置丢失或错误?

谢谢你的帮助。

EN

回答 2

Stack Overflow用户

发布于 2015-04-12 16:11:35

这是一个有用的例子。关键的变化是

  1. 使用@matthew推荐的TemporalMultiStep (添加所需的参数)
  2. "implementation": "py"中使用clParams。我的值在0.0-1.0之间。对于该范围内的值,快速分类器总是返回None。与"py“实现相同的代码返回有效值。将范围更改为10-100,快速算法也会返回有效值.正是这种变化最终产生了没有结果的结果。
  3. 比#2更不重要,为了提高结果,我重复每一行训练,以便让它沉入其中,这对训练是有意义的。

要查看分类器错误,请注释掉第19行"implementation": "py"。结果将是None。然后将MIN_VAL改为10,将MAX_VAL更改为100,然后看到结果返回。

代码语言:javascript
复制
#!/usr/bin/python

import random
from nupic.frameworks.opf.modelfactory import ModelFactory
from nupic.support import initLogging
from nupic.encoders import ScalarEncoder
import numpy

MIN_VAL = 0.0
MAX_VAL = 1.0

config = {
    'model': "CLA",
    'version': 1,
    'predictAheadTime': None,

    'modelParams': {
        'clParams': {
            "implementation": "py", # cpp version fails with small numbers
            'regionName' : 'CLAClassifierRegion',
            'clVerbosity' : 0,
            'alpha': 0.001,
            'steps': '1',
        },
        'inferenceType': 'TemporalMultiStep',
        'sensorParams': {
            'encoders': {
              '_classifierInput':     {
                'classifierOnly': True,
                'clipInput': True,
                'fieldname': 'output_field',
                'maxval': MAX_VAL,
                'minval': MIN_VAL,
                'n': 200,
                'name': '_classifierInput',
                'type': 'ScalarEncoder',
                'w': 21},
              u'input_field':     {
                'clipInput': True,
                'fieldname': 'input_field',
                'maxval': MAX_VAL,
                'minval': MIN_VAL,
                'n': 100,
                'name': 'input_field',
                'type': 'ScalarEncoder',
                'w': 21},
            },

            'sensorAutoReset' : None,
            'verbosity' : 0,
        },

        'spEnable': True,
        'spParams': { 
                     'columnCount': 2048,
                     'globalInhibition': 1,
                     'spatialImp': 'cpp',
                 },
        'tpEnable' : True,
        'tpParams': { 'activationThreshold': 12,
                     'cellsPerColumn': 32,
                     'columnCount': 2048,
                     'temporalImp': 'cpp',
       },
        'trainSPNetOnlyIfRequested': False,
    },
}
# end of config dictionary

model = ModelFactory.create(config)

TRAINING_ROWS = 100
TESTING_ROWS = 100

def sample(r = 0.0):
    return random.uniform(MIN_VAL, MAX_VAL)

def training():
    for r in range(TRAINING_ROWS):
        value = sample(r / TRAINING_ROWS)
        for rd in range(5):
            yield {
                "input_field": value,
                "output_field": value,
                '_reset': 1 if (rd==0) else 0,
            }


def testing():
    for r in range(TESTING_ROWS):
        value = sample()
        yield {
            "input_field": value,
            "output_field": None,
        }

model.enableInference({"predictedField": "output_field"})
for row in training():
    model.run(row)

for row in testing():
    result = model.run(row)
    prediction = result.inferences['multiStepBestPredictions'][1]
    if prediction==None:
        print "Input %f, Output None" % (row['input_field'])
    else:
        print "Input %f, Output %f (err %f)" % (row['input_field'], prediction, prediction - row['input_field'])
票数 1
EN

Stack Overflow用户

发布于 2015-04-10 04:40:56

你想要的inferenceTypeTemporalMultistep

有关完整的演练,请参见这个例子

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29544991

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档