0

使用来自breznak 的提交作为编码器(我无法通过 GitHub 找出“git checkout ...”,所以我只是小心地复制了三个文件 - base.py、multi.py 和 multi_test.py) .

我运行 multi_test.py 没有任何问题。

然后我调整了我的模型参数(MODEL_PARAMS),使“sensorParams”的编码器部分看起来像这样:

'encoders': {
    'frequency': {
         'fieldname': u'frequency',
         'type': 'SimpleVector',
         'length': 5,                    
         'minVal': 0,
         'maxVal': 210
     }
 },

我还调整了代码的 modelInput 部分,看起来像这样:

model = ModelFactory.create(model_params.MODEL_PARAMS)
model.enableInference({'predictedField': 'frequency'})
y = [1,2,3,4,5]
modelInput = {"frequency": y}
result = model.run(modelInput)

但是我得到了最后一个错误,无论我将 'y' 实例化为列表还是 numpy.ndarray

File "nta/eng/lib/python2.7/site-packages/nupic/encoders/base.py", line 183, in _getInputValue
    return getattr(obj, fieldname)
AttributeError: 'list' object has no attribute 'idx0'

我还尝试使用我的 modelInput 内联初始化 SimpleVector 编码器,直接编码我的数组,然后通过 modelInput 传递它。这违反了我的 SimpleVector 的输入参数,因为我现在是双重编码。所以我删除了模型参数字典的编码器部分。这引起了吐槽,因为我的模型的某些部分正在寻找字典的那部分。

关于我接下来应该做什么的任何建议?

编辑:这是我与 OPF 一起使用的文件。

sendAnArray.py

import numpy
from nupic.frameworks.opf.modelfactory import ModelFactory    
import model_params

class sendAnArray():

def __init__(self):
    self.model = ModelFactory.create(model_params.MODEL_PARAMS)
    self.model.enableInference({'predictedField': 'frequency'})
    for i in range(100):
        self.run()

def run(self):
    y = [1,2,3,4,5]
    modelInput = {"frequency": y}
    result = self.model.run(modelInput)
    anomalyScore = result.inferences['anomalyScore']
    print y, anomalyScore

sAA = sendAnArray()

模型参数.py

MODEL_PARAMS = {
    'model': "CLA",
    'version': 1,
    'predictAheadTime': None,
    'modelParams': {
        'inferenceType': 'TemporalAnomaly',
        'sensorParams': {
            'verbosity' : 0,
            'encoders': {
                'frequency': {
                    'fieldname': u'frequency',
                    'type': 'SimpleVector',
                    'length': 5,                    
                    'minVal': 0,
                    'maxVal': 210
                }
            },
            'sensorAutoReset' : None,
        },
        'spEnable': True,
        'spParams': {
            'spVerbosity' : 0,
            'globalInhibition': 1,
            'columnCount': 2048,
            'inputWidth': 5,
            'numActivePerInhArea': 60,
            'seed': 1956,
            'coincInputPoolPct': 0.5,
            'synPermConnected': 0.1,
            'synPermActiveInc': 0.1,
            'synPermInactiveDec': 0.01,
        },
        'tpEnable' : True,
        'tpParams': {
            'verbosity': 0,
            'columnCount': 2048,
            'cellsPerColumn': 32,
            'inputWidth': 2048,
            'seed': 1960,
            'temporalImp': 'cpp',
            'newSynapseCount': 20,
            'maxSynapsesPerSegment': 32,
            'maxSegmentsPerCell': 128,
            'initialPerm': 0.21,
            'permanenceInc': 0.1,
            'permanenceDec' : 0.1,
            'globalDecay': 0.0,
            'maxAge': 0,
            'minThreshold': 12,
            'activationThreshold': 16,
            'outputType': 'normal',
            'pamLength': 1,
        },
        'clParams': {
            'regionName' : 'CLAClassifierRegion',
            'clVerbosity' : 0,
            'alpha': 0.0001,
            'steps': '5',
        },
        'anomalyParams': {  
            u'anomalyCacheRecords': None,
            u'autoDetectThreshold': None,
            u'autoDetectWaitRecords': 2184
        },
        'trainSPNetOnlyIfRequested': False,
    },
}
4

2 回答 2

0

问题似乎是 SimpleVector 类接受一个数组而不是一个 dict 作为其输入,然后在内部将其重构为{'list': {'idx0': 1, 'idx1': 2, ...}}(即,就好像这个 dict 是输入一样)。如果它始终如一地完成,这很好,但你的错误表明它在某个地方被打破了。与@breznak 谈谈这件事。

于 2013-11-13T10:30:27.247 回答
0

通过 OPF 工作很困难。我想将一组索引输入到时间池中,所以我选择直接与算法交互(我非常依赖hello_tp.py)。我完全忽略了 SimpleVector,而是通过 BitmapArray 编码器工作。

Subutai在 nupic-discuss listserve 上有一封有用的电子邮件,其中他分解了 NuPIC API 的三个主要领域:算法、网络/区域和 OPF。这有助于我更好地理解我的选择。

于 2013-11-20T01:33:47.660 回答