ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

NuPIC Network API 传感器 Region 全解析:RecordSensor 与 PluggableEncoderSensor 实战指南

NuPIC Network API 传感器 Region 全解析:RecordSensor 与 PluggableEncoderSensor 实战指南 机器学习人工智能【免费下载链接】nupic-legacyNumenta Platform for Intelligent Computing is an implementation of Hierarchical Temporal Memory (HTM), a theory of intelligence based strictly on the neuroscience of the neocortex.项目地址https://gitcode.com/gh_mirrors/nu/nupic-legacy点击查看免费下载导读在 NuPICNumenta Platform for Intelligent Computing的 Network API 体系中传感器SensorRegion 是任何 HTM 网络的入口它负责把原始数据转换成 HTM 算法可消费的稀疏分布式表示SDR并携带重置信号、序列 ID、类别等元信息。本文以 docs/source/api/network/sensors.rst 为骨架结合源码深入讲解PluggableEncoderSensor与RecordSensor两大传感器 Region 的规格Spec、输出/输入端口、参数体系与 compute 执行流程并给出可在仓库示例中直接运行的完整网络构建代码。读完本文你将掌握如何在 NuPIC 网络中正确装配数据源与编码器并能自主搭建传感器 → 空间池化器SP→ 时序记忆TM→ 分类器的完整 HTM 预测链路。一、传感器 Region 在 Network API 中的位置Network API 是 NuPIC 中面向底层、用于构建 HTM 网络结构的 API。一个 HTM 网络由若干Region组成Region 之间通过Link传递数据。在 Network API 指南 中一个没有输入的 Region 被称为传感器sensor没有输出的 Region 被称为执行器effector。传感器 Region 承担三件事获取原始记录从文件CSV/TSV或人工数据生成器逐条读取数据记录编码使用编码器Encoder将记录转换为固定稀疏度的分布式表示SDR使其适合作为 SP/TM 的输入输出元信息输出重置信号、序列 ID、类别、被预测字段的实际值与 bucket 索引等供下游 Region尤其是分类器使用。文档 中的两个 API 类正是这一职责的两种实现nupic.regions.pluggable_encoder_sensor.PluggableEncoderSensor轻量传感器仅持有一个值并在 compute 时用插入的编码器将其编码为网络输出nupic.regions.record_sensor.RecordSensor完整记录传感器从数据源取记录、经可选过滤后编码并提供全套预测辅助输出。两者都以nupic.bindings.regions.PyRegion.PyRegion为基类见 pluggable_encoder_sensor.py、record_sensor.py通过getSpec()声明自己的输入、输出与参数。二、PluggableEncoderSensor即插即用式单值编码器2.1 设计意图与典型用法PluggableEncoderSensor的设计极其精简它只是持有一个值sensedValue在每次compute()时调用用户插入的编码器将该值编码进网络输出。由于它不知道被感知值的类型因此编码器不是 Spec 参数而是通过运行时属性注入。源码 docstring 给出了最典型的插入方式pluggable_encoder_sensor.pytimestampSensor network.addRegion(timestampSensor, py.PluggableEncoderSensor, ) timestampSensor.getSelf().encoder DateEncoder(timeOfDay(21, 9.5), nametimestamp_timeOfDay)即先用addRegion以py.PluggableEncoderSensor类型创建 Region再通过getSelf()拿到 Python 对象本身把编码器实例赋给encoder属性。2.2 Spec 与输出从 getSpec() 可以看到它的完整规格singleNodeOnly: True——该 Region 仅支持单节点单一缓冲、一对一映射符合 Network API 指南 中对 Region 维度的说明唯一输出encodeddataType: Real32count: 0——宽度不在此处静态声明而是运行时由编码器决定regionLevel: True、isDefaultOutput: True——它是默认输出下游 link 时若省略输出名即指向它。2.3 核心方法与执行流程setSensedValue(value)/getSensedValue()设置/获取将被编码的值。注释明确说明该值将在 Region 执行 compute 时被编码pluggable_encoder_sensor.py。注意尽管 Spec 参数表为空源码仍实现了getParameter/setParameter的拦截逻辑提示用户请通过setSensedValue/getSensedValue方法访问 sensedValue——这是一种刻意设计值类型未知不应走参数通道pluggable_encoder_sensor.py。compute(inputs, outputs)核心逻辑只有两步pluggable_encoder_sensor.py检查self.encoder是否已插入未插入则抛出异常Please insert an encoder.调用self.encoder.encode(self._sensedValue)得到编码结果并通过encodeIntoArray(self._sensedValue, outputs[encoded])就地写入输出缓冲。getOutputElementCount(name)当网络初始化需要确定encoded缓冲宽度时返回self.encoder.getWidth()pluggable_encoder_sensor.py。这与 Network API 指南 中描述的缓冲宽度通过getNodeOutputElementCount()询问 Region 实现机制完全对应。使用要点创建 PluggableEncoderSensor 后必须先插入编码器再initialize()否则 compute 阶段会直接抛异常。三、RecordSensor数据记录 → HTM 输入的完整流水线3.1 职责与内部构成RecordSensor是 NuPIC 网络中最常用的传感器 Region。它的核心职责是取一条信息记录并编码为适合 HTM 输入的形式。这里信息记录类比数据库记录即一组有类型的值日期、金额、类别、位置等record_sensor.py。它本质上是一个包含两个对象的壳dataSource数据源一次取一条记录返回形式为字典dict或用户自定义对象。例如可能返回dict(date02-01-2010 23:12:23, amount4.95, countryUS, _reset0, _sequenceId0)典型实现是nupic.data.file_record_stream.FileRecordStream从 CSV/TSV 读取或人工数据生成器。encoder编码器把一条记录编码为固定稀疏度的分布式表示通常是nupic.encoders.multi.MultiEncoder。与 PluggableEncoderSensor 一样这两个对象也是运行时属性注入而非 Spec 参数——因为数据源与编码器高度依赖具体应用场景。3.2 完整 Spec九个输出、两个输入、四个参数RecordSensor 的规格在 getSpec() 中定义得非常完整是理解其行为的最佳地图输出端口Outputs输出名数据类型说明dataOutReal32编码后的数据默认输出注释指出对位来说效率不高但目前就用它actValueOutReal32待预测字段的实际值仅当设置了predictedField时才填充bucketIdxOutUInt64待预测字段实际值对应的编码器 bucket 索引同样依赖predictedFieldresetOutReal32重置信号count1sequenceIdOutUInt64序列 IDcount1categoryOutReal32类别count0实际宽度由numCategories决定sourceOutReal32来自数据源、未编码的数据即编码器的输入spatialTopDownOutReal32来自 SP 反馈生成的 top-down 输出信号temporalTopDownOutReal32来自 TM经 SP反馈生成的 top-down 输出信号输入端口Inputs输入名数据类型必填说明spatialTopDownInReal32否来自 SP 的 top-down 输入信号temporalTopDownInReal32否来自 TM经 SP的 top-down 输入信号参数Parameters参数名数据类型访问模式默认值说明verbosityUInt32ReadWrite0诊断输出冗余级别numCategoriesUInt32ReadWrite1期望从 FileRecordStream 得到的类别总数predictedFieldByteReadWrite-1待预测字段名设置后才会填充actValueOut与bucketIdxOuttopDownModeUInt32ReadWrite0bool 约束1 表示下次 compute 时执行 top-down 计算其中predictedField与topDownMode在 setParameter() 中被显式处理其余参数走 PyRegion 的通用参数机制。3.3 构造与序列化__init__中默认初始化encoderNone、dataSourceNone、predictedFieldNone并预留preEncodingFilters/postEncodingFilters两个过滤链、topDownModeFalse与lastRecord仅调试用record_sensor.py。序列化方面RecordSensor 通过 Capn Proto 实现getSchema()返回RecordSensorProtowriteToProto将编码器含可选的disabledEncoder、topDownMode、verbosity、numCategories写入 protoreadFromProto反向恢复并兼容旧版本反序列化时若缺少numCategories则补 1record_sensor.py。这一点与 Network API 指南 中Python 实现的 RegionImpl 状态可序列化进 network bundle的描述相吻合。四、compute 执行流程正向编码与 top-down 两条路径RecordSensor.compute()record_sensor.py根据topDownMode分两条路径执行。4.1 正向路径默认topDownModeFalse取记录调用getNextRecord()补齐私有键确保记录含_reset、_sequenceId、_category缺失时分别补 0、0、[None]record_sensor.py编码self.encoder.encodeIntoArray(data, outputs[dataOut])将整条记录编码进dataOut预测辅助输出若设置了predictedField且不等于特殊值vector则在编码器列表中查找对应字段的编码器写出bucketIdxOut与actValueOut找不到编码器时抛出ValueErrorrecord_sensor.py。vector是 CoordinateEncoder 等矢量编码器的特例——它们不提供 bucket 索引故被忽略写标量输出sourceOut写入encoder.getScalars(data)同时缓存sourceEncodings按编码器宽度切分dataOut得到的各字段位数组执行后编码过滤依次调用postEncodingFilters中的过滤器写元信息输出resetOut[0]reset、sequenceIdOut[0]sequenceId并调用populateCategoriesOut()填充categoryOut——非类别位置用-1表示record_sensor.pyverbose 输出verbosity1打印编码摘要与非零位位置2打印原始记录3打印解码结果。getNextRecord()record_sensor.py与compute()分离的设计使得用户可以单独使用 RecordSensor 获取过滤后的数据。applyFilters()处理前编码过滤器若某过滤器如 delta 过滤器需要更多记录返回 False 并跳过当前记录当前记录仍会交给所有过滤器过滤器可能添加 reset但其他过滤器只能看到原始 reset 值最终取各过滤器的或作为实际 resetrecord_sensor.py。4.2 top-down 路径topDownModeTrue当topDownMode置 1 时compute 转为执行自上而下的反馈计算接收spatialTopDownIn与temporalTopDownIn分别调用encoder.topDownCompute()生成spatialTopDownOut与temporalTopDownOut拆分 top-down 输出为values、scalars、encodings三部分其中标量部分写入输出缓冲断言两个 top-down 输出尺寸一致record_sensor.py。辅助方法_convertNonNumericData()还会把非数值字段非 integer/float 类型通过encoder.getScalars()转成标量以便统一写入 top-down 输出record_sensor.py。4.3 缓冲宽度查询getOutputElementCount()record_sensor.py为各输出提供宽度dataOut→encoder.getWidth()sourceOut→len(encoder.getDescription())categoryOut→numCategoriesresetOut/sequenceIdOut/bucketIdxOut/actValueOut→ 1前两个会打印警告正常不应被查询spatialTopDownOut/temporalTopDownOut→len(encoder.getDescription())若编码器未设置会抛出异常这与初始化检查一致initialize()要求encoder与dataSource都非空否则拒绝初始化record_sensor.py。五、实战在完整网络中装配 RecordSensor下面整合仓库 docs/examples/network/complete-network-example.py 的关键片段演示 RecordSensor 如何在真实 HTM 网络中工作。5.1 创建传感器 Region传感器 Region 不需要任何构造参数因此传入{}example-add-sensor-region.pynetwork.addRegion(sensor, py.RecordSensor, {})5.2 注入数据源与编码器数据源使用FileRecordStream读取 CSV编码器使用MultiEncoder从 YAML 参数批量构建example-data-source.py、example-create-encoder.pyfrom nupic.data.file_record_stream import FileRecordStream from nupic.encoders import MultiEncoder dataSource FileRecordStream(streamID/path/to/your/data.csv) sensorRegion network.regions[sensor].getSelf() sensorRegion.dataSource dataSource def createEncoder(encoderParams): encoder MultiEncoder() encoder.addMultipleEncoders(encoderParams) return encoder encoderParams modelParams[sensorParams][encoders] sensorRegion.encoder createEncoder(encoderParams)注意输入 CSV 需要特定的表头格式细节见 quick-start 的 example-data。modelParams[sensorParams][encoders]来自 docs/examples/params/model.yamlencoders: consumption: fieldname: consumption name: consumption resolution: 0.88 seed: 1 type: RandomDistributedScalarEncoder timestamp_timeOfDay: fieldname: timestamp name: timestamp_timeOfDay timeOfDay: [21, 1] type: DateEncoder timestamp_weekend: fieldname: timestamp name: timestamp_weekend type: DateEncoder weekend: 21这里同时编码了三个语义值标量能耗consumptionRandomDistributedScalarEncoder、一天中的时刻timestamp_timeOfDay、周末/工作日差异timestamp_weekend两个 DateEncoder。MultiEncoder会把它们合并为一条宽的 SDR。5.3 链接传感器与下游 Region传感器通过若干UniformLink把数据与元信息传给下游example-link-all.py# 1. 数据链路sensor.dataOut - SP.bottomUpIn network.link(sensor, SP, UniformLink, , srcOutputdataOut, destInputbottomUpIn) # 2. 前馈链路 network.link(SP, TM, UniformLink, , srcOutputbottomUpOut, destInputbottomUpIn) network.link(TM, classifier, UniformLink, , srcOutputbottomUpOut, destInputbottomUpIn) # 3. 传感器到分类器的特殊链路让分类器能把预测的细胞状态 # 映射回从输入数据学到的真实值 network.link(sensor, classifier, UniformLink, , srcOutputbucketIdxOut, destInputbucketIdxIn) network.link(sensor, classifier, UniformLink, , srcOutputactValueOut, destInputactValueIn) network.link(sensor, classifier, UniformLink, , srcOutputcategoryOut, destInputcategoryIn) # 可选的重置链路 network.link(sensor, SP, UniformLink, , srcOutputresetOut, destInputresetIn) network.link(sensor, TM, UniformLink, , srcOutputresetOut, destInputresetIn)其中dataOut是 RecordSensor 的默认输出因此在 Network API 指南 描述的 link 规则下可以省略源输出名bucketIdxOut/actValueOut/categoryOut则是分类器预测映射的关键输入。5.4 设置预测字段并运行# 告诉传感器要预测哪个字段索引必须与数据源保持一致 network.regions[sensor].setParameter(predictedField, consumption) # 先初始化再逐次运行每次 1 条记录便于逐时间步提取预测 network.initialize() for iteration in range(0, numRecords, 1): network.run(1)setParameter(predictedField, ...)走的是 3.2 节所述的显式参数通道example-set-predicted-field.py。运行后从分类器 Region 用getOutputData(actualValues)与getOutputData(probabilities)提取多步预测结果即可得到类似下面的输出1-step: 45.6100006104 (96.41%) 5-step: 0.0 (0.1883%) 1-step: 43.4000015259 (3.969%) 5-step: 0.0 (0.1883%) 1-step: 43.4000015259 (4.125%) 5-step: 0.0 (0.1883%)六、测试佐证传感器行为的可验证依据仓库单元测试验证了 RecordSensor 与传感器链路的实际行为可作为事实依据record_sensor_region_test.py 覆盖 RecordSensor 作为 Region 的规格、compute 与输出填充行为pluggable_encoder_sensor 相关测试同目录测试集验证编码器插入与encoded输出集成测试 network_twonode_test.py 与 network_checkpoint_test.py 验证传感器在完整网络中的链接与序列化complete-network-example.py 是可直接运行仓库提供了gymdata.csv与model.yaml的端到端示例输出预测结果是验证本文所述流程的最佳入口。七、总结与选型建议对比维度PluggableEncoderSensorRecordSensor数据来源外部代码通过setSensedValue注入单值内置数据源文件/生成器逐条取记录编码器注入运行时属性encoder运行时属性encoder通常 MultiEncoder预测辅助输出无actValueOut、bucketIdxOut、categoryOut、sourceOut等过滤能力无支持preEncodingFilters/postEncodingFilters典型场景单值/时间戳等轻量传感如网络演示中的时间传感器面向文件流的完整 HTM 预测/分类/异常检测管线选型建议构建完整的 HTM 预测网络如 Hot Gym 能耗预测时首选RecordSensor——它的predictedField、bucketIdxOut/actValueOut输出与分类器 Region 的配合是预测链路的核心而当只需要把一个内存中的值如当前时间戳送入网络做演示或简单场景时PluggableEncoderSensor更轻量直接。无论选择哪种都必须牢记一个共同前提编码器以及 RecordSensor 的数据源必须在initialize()之前完成注入否则会触发初始化或 compute 阶段的异常。赞分享机器学习人工智能【免费下载链接】nupic-legacyNumenta Platform for Intelligent Computing is an implementation of Hierarchical Temporal Memory (HTM), a theory of intelligence based strictly on the neuroscience of the neocortex.项目地址https://gitcode.com/gh_mirrors/nu/nupic-legacy点击查看免费下载相关推荐YouTube.js 解析器深入parseArray() 函数签名、ObservedArray 返回值与实战用法YouTube.js 解析器深入parseArray 函数签名、ObservedArray 返回值与实战用法 导读 parseArray 是 YouTube.机器学习人工智能NuPIC 分类器 API 全解析SDRClassifier 与 KNNClassifier 的实现原理与实战用法NuPIC 分类器 API 全解析SDRClassifier 与 KNNClassifier 的实现原理与实战用法 本指南围绕 NuPICNumenta P机器学习人工智能MMDetection 中的 RPN 全解析Region Proposal Network 原理、配置与 proposal 导出实战MMDetection 中的 RPN 全解析Region Proposal Network 原理、配置与 proposal 导出实战 本指南以 configs人工智能机器学习分布式训练图计算后端上一篇JavaScript原型与继承面向对象编程终极指南下一篇GithubTrends 新手教程如何用每日/每周/每月视图高效浏览 GitHub 热门项目创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表