Неспособность генерировать скалярные прогнозы из модели NuPIC CLA

Я не могу получить скалярные прогнозы из модели 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, Отсутствует или нет соответствующая конфигурация?

Спасибо за вашу помощь.

2 ответа

Вот рабочий пример. Ключевые изменения были

  1. использование TemporalMultiStep в соответствии с рекомендациями @matthew-taylor (добавление обязательных параметров)
  2. использование "implementation": "py" в clParams, Мои значения находятся в диапазоне 0,0-1,0. Быстрый классификатор всегда возвращает None для значений в этом диапазоне. Тот же код с реализацией "py" возвращает допустимые значения. Измените диапазон на 10-100, и быстрый алгоритм также вернет действительные значения. Именно это изменение, наконец, дало результаты, отличные от None.
  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'])

inferenceType ты хочешь TemporalMultistep,

Посмотрите этот пример для полного прохождения.

Другие вопросы по тегам