0

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

这是一个独立的示例。它用于config使用 ModelFactory 创建模型。然后它用一个简单的数据集({input_field=X, output_field=X},其中 X 在 0-1 之间是随机的)对其进行训练。然后它尝试使用 {input_field=X, output_field=None} 形式的输入来提取预测。

#!/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而不是我期望的,这接近输入值(因为模型是在输入==输出上训练的)。

{'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' 似乎是正确的推理类型,因为它是一个简单的分类。但这适用于标量吗?
  • 除了 output_field=None 之外,是否有不同的方式来表达我想要一个预测?
  • 我需要 output_field 是classifierOnly=True。是否有相关配置缺失或错误?

谢谢你的帮助。

4

2 回答 2

1

这是工作示例。关键的变化是

  1. 按照@matthew-taylor 的建议使用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 并观察结果。

#!/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'])
于 2015-04-12T16:11:35.410 回答
0

inferenceType你想要的是TemporalMultistep.

请参阅此示例以获取完整的演练。

于 2015-04-10T04:40:56.060 回答