未能从NuPIC CLA模型生成标量预测

时间:2015-04-09 17:20:19

标签: nupic

我没有从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。相关配置是否缺失或错误?

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

以下是工作示例。关键的变化是

  1. 使用@ matthew-taylor建议的TemporalMultiStep(添加必需参数)
  2. "implementation": "py"中使用clParams。我的值在0.0-1.0范围内。对于该范围内的值,快速分类器始终返回None。与" py"相同的代码实现返回有效值。将范围更改为10-100,快速算法也返回有效值。正是这种变化终于产生了非无效的结果。
  3. 不如#2重要,为了改善结果,我重复每一个训练行,让它沉入其中,这对培训很有意义。
  4. 要查看分类器错误,请注释第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'])
    

答案 1 :(得分:0)

您想要的inferenceTypeTemporalMultistep

有关完整的演练,请参阅this example