簡體   English   中英

無法從NuPIC CLA模型生成標量預測

[英]Failing to generate scalar predictions from NuPIC CLA model

我無法從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”似乎是正確的inferenceType,因為它是一個簡單的分類。 但這對標量有用嗎?
  • 除了output_field = None之外,還有其他表達我想要預測的方式嗎?
  • 我需要output_field是classifierOnly=True 是否存在相關配置丟失或錯誤?

謝謝你的幫助。

這是工作示例。 關鍵的變化是

  1. 按照@ matthew-taylor的建議使用TemporalMultiStep (添加必需的參數)
  2. clParams使用"implementation": "py" 我的值在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'])

您想要的inferenceTypeTemporalMultistep

有關完整的演練,請參見以下示例

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM