首页 / 资讯中心 / 文章详情

NuPIC Network API 实战指南:构建、链接与运行 HTM 网络

NuPIC Network API 实战指南:构建、链接与运行 HTM 网络 ★ FEATURED ARTICLE
机器学习人工智能【免费下载链接】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 Engine 提供它允许程序员以编程方式设计、创建、训练、测试并部署基于层级时序记忆HTM的流式数据处理网络。本文以官方 Network API Guide 为骨架结合本仓库nupic-legacy中nupic.engine.Network的 Python 实现、完整示例与单元测试系统讲解 HTM 网络的对象模型、Region/Input/Output/Link 的协作机制、网络初始化与运行原理并给出一个传感器 → 空间池化 → 时序记忆 → 分类器可运行的预测网络搭建全流程。1. 从设计目标理解 Network Engine在动手写代码之前先理解 Network Engine 的设计取舍。官方文档明确了它的定位提供使用 HTM 网络所需的全部本质功能但不多给一分其余高级能力交给上层库如 OPF 框架去扩展。具体设计目标包括提供使用 HTM 网络的所有必要功能但不多不少额外功能由分层库提供性能优秀Network Engine 自身应只引入可忽略的开销易于理解和使用API 保持一致、易于学习不使用花哨或晦涩的语言特性架构干净、行为透明Network 就是 Network不是代理proxy没有异步操作异常直接传播给调用者调用栈清晰可见、易于理解易于添加新算法算法采用模块化架构隔离算法开发者与 Network Engine 内部细节。无代理、无异步、异常直传这条目标在本仓库的实现中依然成立Network::run()会一路调用到Region::compute()再到RegionImpl::compute()在堆栈中全程可见不存在网络代理或异步行为——这与 NuPIC 旧版本形成鲜明对比。入口实现可参见 src/nupic/engine/init.pyPython 端from nupic.engine import Network即来源于此对应 API 文档见 docs/source/api/network/network.rst。2. 网络结构Region、Input、Output 与 Link一个 HTM 网络HTM Network是一组实现 HTM 算法或其他算法的 Region 的集合。其结构要点如下一个网络由零个或多个具名namedRegion组成一个 Region 拥有零个或多个具名输入Input与零个或多个具名输出Output一个 Region 的 Output 可以通过一条 Link连接到另一个 Region 的 Input文档特别强调图中虽未画出但一个 Input 可以与多个 Output 相连一个 Output 也可以连接多个 Input——这是后面理解多源拼接缓冲区concatenation的基础。3. 对象模型类体系与三类方法Network Engine 采用面向对象设计为图 1 中每个组件定义了一个对应的类类职责Network网络的根对象容纳所有 Region 与 LinkRegion基本计算单元拥有输入/输出并执行compute()Input/Output具名缓冲区端点隶属于 RegionLink连接源 Region 的 Output 与目标 Region 的 Input此外还有两个重要的扩展基类RegionImpl为不同 Region 类型每种类型可实现一种算法提供基类LinkPolicy为不同 Link 行为提供基类。辅助类包括NodeSpec、Collections与Dimensions。文档还保留了一个历史注记截至 2010 年 10 月Region 在逻辑上是一个或多个节点node的集合并存在对应的节点类但由于节点可能从对象模型中移除本文不展开节点相关内容。内部 API 与外部 API用户通过Core API访问 Network Engine而 Core API并不暴露完整对象模型只有Network和Region两个类对外可见且只暴露其中一部分方法即public external方法。其余类与方法仅供 Network Engine 内部使用。对象模型中存在三类方法Public/externalC 定义为public在 Core API 中暴露同时也在引擎内部被调用Public/internalC 定义为public但不暴露给 Core API仅供引擎内部其他类使用PrivateC 定义为private仅对定义它的类可用。需要说明的是原始设计文档将引擎描述为 C 库头文件位于nta/*而在本仓库nupic-legacy中Network Engine 以 Python 实现于 src/nupic/engine/init.py并通过nupic.engine包对外导出Network类Python 与 C 两侧共享同一套 API 语义。4. 核心类逐个拆解4.1 Network根对象Network是 Network Engine 的根对象其他所有对象都直接或间接地包含在某个 Network 对象中。它可以保存serialize到网络包network bundle从网络包加载deserialize或以编程方式构造——通过addRegion()添加 Region再通过link()将它们连接起来。Network 的公开 API 全部是外部 API没有 public/internal 方法。概念上网络只是 Region 的容器加上 Region 之间的 Link。其主要数据成员包括一个 Region 的Collection以及一个按阶段phase组织 Region 集合的数据结构。Network 拥有 RegionRegion 在 Network 析构时被销毁。需要注意图 1 中某些你可能以为直接由 Network 持有的组件其实并不属于它——Region 的 Input/Output 归 Region 所有Link 归 Region 的 Input 所有。网络在运行前必须初始化初始化可以显式调用但通常在调用run()时隐式完成详见第 6 节。Network 与所含 Region 之间复制了两条信息Region 名称用于生成良好的错误信息同时也是 Network Region 集合的键用于按名检索与阶段信息Network 用它快速选出指定阶段的所有 RegionRegion 则用它辅助序列化。这两条信息均由 Network 控制Region 上没有公开的外部 API 可以修改自己的名称或阶段。4.2 Region基本计算单元Region 是 HTM 中的基本计算单元它有输入和输出并有一个compute()方法负责从输入、内部状态、可能的外部数据源如文件生成输出。没有输入的 Region 称为传感器sensor没有输出的 Region 称为效应器effector。Region 拥有自己的输入和输出并负责协调它们的初始化。Region 缓存了以下值这些值不参与任何计算name——用于生成良好的错误信息network——供从一个 Region 出发打开其他 Region 的检查器inspector使用phase——用于序列化存在 Region 上比存在 Network 上更方便以及region.getPhases()。Region 的大部分实际工作compute()、execute()方法、参数读写都委托给内部的RegionImpl。每个 Region 恰好包含一个由RegionImplFactory提供的RegionImpl该RegionImpl决定了 Region 有哪些输入、输出和参数。Region 还可以对自身做性能剖析profiling记录在compute()与execute()中累积的时间。每个 Region 都有一组setParameter/getParameter方法它们是类型化的例如getParameterInt32但不是模板化的原因有三层类型化接口远比非类型化接口快——NuPIC 1 中所有值都要与字符串互转setParameter本可通过重载实现但 SWIG 对重载生成的代码极慢无法模板化因为这些方法要透传给RegionImpl而模板方法无法被子类覆盖而覆盖恰恰是意义所在。最后Region 的prepareInputs()方法会求值所有入向 Link并把必要的数据复制到 Region 的每个输入中。4.3 RegionImpl算法专用逻辑RegionImpl完成 Region 中所有算法相关的工作是一个基类真正的算法专用类由它派生C 实现的 Region 类型直接派生自RegionImpl而PyNodeBase可加载任意用 Python 定义的 Region 类型同样派生自RegionImpl。输入/输出的建立全部由 Region 容器完成这样RegionImpl可以专注于计算与参数管理。调用链上Network::run()→Region::compute()→RegionImpl::compute()在从RegionImpl::compute()内部观察堆栈时全部可见——这正是前面设计目标中计算透明的体现。RegionImpl通过一个类方法为它所实现的 Region 类型提供RegionSpecRegionSpec包含输入列表、输出列表、参数列表和 execute 方法列表。本仓库中 Region 的 Spec 定义与解析见 src/nupic/regions/spec.py。4.4 Output类型化数据缓冲区Output 本质上是一段连续的类型化数据缓冲区成员data_外加一份以该 Output 为源的 Link 指针列表。缓冲区不是在 Output 创建时分配的而是在initialize()方法中分配——该方法在网络初始化时被间接地调用。Output 对象在 Region 构造函数中创建Region 为RegionSpec里声明的每个输出创建一个 Output。Output 缓冲区的大小由RegionImpl通过getNodeOutputElementCount指定流程如下Region 创建 OutputRegion 创建RegionImplRegion 向RegionImpl查询输出缓冲区大小初始化期间Region 让 Output 按该大小分配缓冲区。文档注记目前输出大小按NodeOutputElementCount× Region 内节点数计算若将来改为每个 Region 一个节点输出大小将由RegionImpl直接给出。Output 保存一份以它为源的 Link 指针列表但不拥有这些 LinkLink 归另一端的 Input 所有。4.5 Input缓冲区与 Link 的归属者Input 的结构与 Output 类似——一段连续的类型化数据缓冲区外加一份以该 Input 为目标的 Link 列表。Input 对象同样在 Region 构造函数中按RegionSpec创建。Input 缓冲区的大小由入向 Link 决定它是所有相连 Output 缓冲区大小之和缓冲区在网络初始化的最后一个阶段Output 缓冲区分配完成之后分配。Input 持有其入向 Link 的所有权Link 在 Input 析构时被释放。Link 的顺序很重要因为它决定了输出数据如何映射进输入缓冲区。Input 的设计为未来的零拷贝优化预留了空间当前数据总是从源 Output 复制进目标 Input如果某个 Input 只有一条入向 Link那么 Input 与 Output 是一一映射Input 缓冲区可以直接是指向该 Output 缓冲区的指针——这一优化被推迟到确有必要时再实现。4.6 Link数据流动的通道Link 在逻辑上是源 Region 的 Output → 目标 Region 的 Input的连接。你的应用就是通过这种方式构建的声明功能构件Region→ 给 Region 配置参数 → 用 Link 把它们连接起来决定数据通常是 SDR如何在 Region 之间流动。每个 Region 实现都维护一个Spec 结构与参数定义一起声明了它期望的每个输入数据流和将产生的每个数据输出。每个 Output 节点与 Input 节点都是 Link 的两端各自代表一块数据缓冲区。Spec 中声明的某些目标 Input 是可选的但运行时在调用网络的initialize()之前所有标记为 required 的 Input 都必须已经生成 Link。正是在初始化阶段Link 被分析以确认一切一致、确定缓冲区大小与类型、分配输入/输出缓冲区、创建连接指针并确定执行阶段phase——阶段决定了 Network 按何种顺序执行 Region使数据沿执行线从源平滑流到目标。每次网络运行一个周期run cycle都会执行以下动作对每个 Link把一整块数据从源 Output 缓冲区复制到目标 Region 的 Input 缓冲区执行该 Region按阶段顺序对下一个 Region 重复直到所有 Region 执行完毕。Input/Output 的声明在 Spec 中每个 Output 与 Input 定义都有一个唯一名称用于在 Region 内标识该节点因此一个节点由其Output/Input 节点名 所在 Region 名唯一确定。创建 Link 时调用Network.link()传入源/目标 Region 名、源/目标 Output/Input 节点名以及LinkType与LinkParams。如果节点名恰好是各自 Region 配置的Default Output / Default Input则可以从调用中省略。数据类型Spec 中每个 Output/Input 定义都会声明期望或产生的数据类型。Link 两端的类型必须一致因此通常都设为NTA_BasicType_Real32一个近乎通用的类型。数据往往是 SDR——本质上只是 1 和 0——但它们会被转换为指定类型后穿越 Link。维度DimensionsHTM 引擎提供的 dimensions 特性原本用于为 Link 定义多维数组结构的缓冲区如今已废弃。大多数 Region 实现会在 Spec 顶部设置singleNodeOnlytrue隐含固定维度[1]意味着一个输出只有一块缓冲区并以一对一映射连接到单个输入缓冲区。如果某个 Region 仍需要维度请指定单一维度[1]。源输出缓冲区宽度任何 Region 的任意 Output 的缓冲区宽度都可以在源 Region 实现的 Spec 中对应 Output 定义的count字段里指定。如果该值为 0最常见的情况则检查 Link 另一端——目标 Region 实现的 Spec 中 Input 定义的count字段如果也是 0同样最常见则宽度通过调用源 Region 实现的必需函数getNodeOutputElementCount()来确定若该函数返回 0则缓冲区宽度无法确定将产生错误。目标输入缓冲区宽度输入缓冲区宽度取其相连源输出缓冲区的宽度如果多条 Link 终止于同一个 Input 缓冲区则输入缓冲区宽度为所有相连源输出缓冲区宽度之和。多对多连接正常情况下 Link 把源 Region 的输出直接送入目标 Region 的输入但一个 Output 可以连接多个 Input一个 Input 也可以被多个 Output 馈送——这由创建的 Link 决定。当多个源 Output 馈入同一个目标 Input 时输入缓冲区本质上是所有相连源输出缓冲区的拼接concatenation顺序按 Link 创建的顺序排列每条 Link 记录自己的偏移量以便把贡献数据写入目标输入缓冲区的正确位置。目标 Region 只会看到这块宽缓冲区作为其输入。Link 延迟传播延迟该特性会延迟 Link 上的输出缓冲区块 N 个时间步即网络运行迭代次数。每个时间步输出被压入队列底部队列顶部的缓冲区被发送延迟缓冲区如果有初始填充 0。该特性通过设置 Spatial Pooler 的propagationDelay参数指定。LinkType 与 LinkPolicy最初network::Link()的LinkType与LinkPolicy参数控制一条 Link 上的缓冲区块如何在多个 Output 与多个 Input 节点之间分布。如今每个 Region 每条 Link 只有一个 Input 节点和一个 Output 节点这套机制已不再使用。因此所有 Link 都应使用 link typeUniformLink、link policy——含义就是简单地把源 Output 缓冲区复制到目标 Input 缓冲区。TestFanIn2link policy、Splitter Maps、Region Level 与 Node Level 等概念均已废弃。4.7 Collection统一的容器抽象Collection是贯穿整个 API 使用的模板化容器代替 STL 容器。它易于包装因为其接口比 STL 接口简单并为对象集合提供一致的访问方式按名称和按索引查找。在外部 API 中容器始终是只读的。5. 网络序列化Network Bundle网络序列化为一个包bundle——一个包含若干文件的目录。自动 Zip 支持以便网络包作为单个文件分发已被预期但要等到确有需要时才会实现。每个网络包包含网络结构文件network.yamlYAML 格式声明网络中所有的 Region 与 Link但不包含 RegionImpl 的内部状态每个RegionImpl的一个或多个状态文件对于 Python 实现的 Region通常是 Region 的 pickle 状态。包含此类 pickle 状态的网络包不能安全共享因为它们本质上包含任意代码。第一个 Region 的状态保存在前缀为R0-的文件中下一个 Region 使用R1-前缀依此类推。Region 名称不是文件名的一部分这样 Region 名称就不受文件系统允许字符的限制。序列化流程如下Network 将其结构序列化到network.yaml文件遍历所有 Region让它们序列化自己的状态不含RegionImpl状态遍历所有 Region 上所有 Input 上的所有 Link让它们序列化各自状态Network 让每个 Region 把RegionImpl状态序列化到包中。反序列化则是上述过程的逆操作。仓库中对序列化/检查点行为的集成测试可参考 tests/integration/nupic/engine/network_checkpoint_test.py其中涉及网络检查点保存与恢复的完整流程。6. 网络初始化四步编排网络初始化是一次复杂的编排其复杂性大部分来自为 Region 推断维度并确保所有维度一致。由于 Region 维度可能从 API 中移除文档未详细描述维度推断部分。初始化步骤为步骤 0未描述通过 Link 求值的迭代过程确定每个 Region 的维度步骤 1分配所有 Output 缓冲区——每个 Region 都有足够信息算出自己的输出大小步骤 2分配所有 Input 缓冲区——对每个 Input缓冲区大小通过检查入向 Link 并求和其源输出大小来确定步骤 3初始化每个 Region 中的RegionImpl——RegionImpl被赋予其输入/输出缓冲区的指针可以安全地缓存它们步骤 4设置 Network 的最小与最大启用阶段min/max enabled phase。在 Python 侧显式初始化对应network.initialize()调用见下节实战代码若跳过它首次run()会自动触发初始化。7. 运行网络run(n) 与网络回调Network 的主要工作是以正确的顺序编排 Region 计算——它把每个 Region 关联到一个或多个整数阶段然后调用各 Region 的compute()。run(n)方法的最佳展示是如下伪代码for iteration in (1, …, n): for phase in (minPhase, …, maxPhase): for each region associated with this phase: region.prepareInputs() region.compute() invoke all network callbacks可以看到每个迭代周期内按阶段从最小到最大遍历同一阶段的每个 Region 先prepareInputs()求值入向 Link 并复制数据再compute()整个迭代结束后调用所有网络回调。网络回调network callback是用户任意指定的函数在每个网络迭代时被调用。一个 Network 可以挂接任意数量的回调回调机制使我们无需修改或扩展 Core API即可添加功能例如 watcher 监视器。这是 Network API 保持精简的关键设计之一。8. 实战从零构建一个 HTM 预测网络官方 Network API Quick Start 给出了一条完整的实战链路完整可运行脚本见 docs/examples/network/complete-network-example.py。下面按步骤拆解为保持与原示例一致代码未做缩写。8.1 准备模型参数在创建网络前需要把模型网络参数定义在文件中。这些参数包含网络如何构建、使用何种编码器配置、以及会显著影响模型行为的各算法参数。Quick Start 使用的参数文件是 docs/examples/params/model.yaml导入方式如下import yaml _PARAMS_PATH /path/to/model.yaml with open(_PARAMS_PATH, r) as f: modelParams yaml.safe_load(f)[modelParams]得到的字典modelParams将用于参数化 HTM 网络。model.yaml中几个关键区块sensorParams.encoders编码器列表。consumption标量用RandomDistributedScalarEncoderresolution: 0.88编码timestamp_timeOfDay与timestamp_weekend用两个DateEncoder分别编码一天中的时刻与周末/工作日差异spParams空间池化器参数如inputWidth: 946、columnCount: 2048、globalInhibition: 1、numActiveColumnsPerInhArea: 40、potentialPct: 0.85、synPermConnected: 0.1等inputWidth需在运行时根据编码器输出宽度修正tmParams时序记忆参数如cellsPerColumn: 32、newSynapseCount: 20、initialPerm: 0.21、activationThreshold: 16、minThreshold: 12等clParams分类器参数其中steps: 1,5表示同时预测未来 1 步与 5 步maxCategoryCount: 1000限制类别数。8.2 创建网络并添加传感器区域from nupic.engine import Network # A network that will hold the regions. network Network()接下来依次添加四个区域传感器py.RecordSensor、空间池化py.SPRegion、时序记忆py.TMRegion与分类器py.SDRClassifierRegion并串行链接。先添加传感器区域network.addRegion(sensor, py.RecordSensor, {})该区域负责感知输入数据本身不需要特定参数所以传{}但它需要数据源Data Source与编码器Encoder。区域类型RecordSensor的实现见 src/nupic/regions/record_sensor.py。8.3 添加数据源与编码器数据源负责生产喂给 HTM 网络的数据。可以用FileRecordStream创建一个从 CSV 文件读取的数据源注意 CSV 需要特定的表头from nupic.data.file_record_stream import FileRecordStream _INPUT_FILE_PATH /path/to/your/data.csv dataSource FileRecordStream(streamID_INPUT_FILE_PATH) # Add the data source to the sensor region. sensorRegion network.regions[sensor].getSelf() sensorRegion.dataSource dataSource接着根据modelParams中的encoders区块创建多编码器MultiEncoder会把多个编码器的输出合并进同一个输入空间from nupic.encoders import MultiEncoder def createEncoder(encoderParams): encoder MultiEncoder() encoder.addMultipleEncoders(encoderParams) return encoder # Use the same modelParams extracted from the YAML file earlier. encoderParams modelParams[sensorParams][encoders] # Add encoder to the sensor region. sensorRegion network.regions[sensor].getSelf() sensorRegion.encoder createEncoder(encoderParams)8.4 添加 SP、TM 与 Classifier 区域创建区域时必须保证前一个区域的输出宽度与后一个区域的输入宽度匹配。SP 的inputWidth未在modelParams中预先写死model.yaml中为 946需要运行时用编码器实际输出宽度修正spParams modelParams[spParams] # Make sure the SP input width matches the sensor output width. spParams[inputWidth] sensorRegion.encoder.getWidth() # Add SP region. network.addRegion(SP, py.SPRegion, json.dumps(spParams))tmParams modelParams[tmParams] network.addRegion(TM, py.TMRegion, json.dumps(tmParams))clParams modelParams[clParams] network.addRegion(classifier, py.SDRClassifierRegion, json.dumps(clParams))区域类型对应实现为 src/nupic/regions/sp_region.py、src/nupic/regions/tm_region.py 与 src/nupic/regions/sdr_classifier_region.py。8.5 链接所有区域现在把区域连接起来。链接负责把信息从一个区域传递到下一个区域。完整示例docs/examples/network/example-link-all.py中包含三类链接def createDataOutLink(network, sensorRegionName, regionName): Link sensor region to other region so that it can pass it data. network.link(sensorRegionName, regionName, UniformLink, , srcOutputdataOut, destInputbottomUpIn) def createFeedForwardLink(network, regionName1, regionName2): Create a feed-forward link between 2 regions: regionName1 - regionName2 network.link(regionName1, regionName2, UniformLink, , srcOutputbottomUpOut, destInputbottomUpIn) def createSensorToClassifierLinks(network, sensorRegionName, classifierRegionName): Create required links from a sensor region to a classifier region. network.link(sensorRegionName, classifierRegionName, UniformLink, , srcOutputbucketIdxOut, destInputbucketIdxIn) network.link(sensorRegionName, classifierRegionName, UniformLink, , srcOutputactValueOut, destInputactValueIn) network.link(sensorRegionName, classifierRegionName, UniformLink, , srcOutputcategoryOut, destInputcategoryIn) # 1. Add data link between sensor and SP. createDataOutLink(network, sensor, SP) # 2. Add feed forward links. createFeedForwardLink(network, SP, TM) createFeedForwardLink(network, TM, classifier) # 3. Add links between sensor and classifier. createSensorToClassifierLinks(network, sensor, classifier)这里的关键点与第 4.6 节一一对应所有 Link 都使用UniformLink类型与策略通过srcOutput/destInput具名指定节点sensor → classifier的三条特殊 Link 使分类器能把预测的细胞状态映射回从输入数据学到的实际值sensor → SP的数据链接与sensor → classifier的桶索引/实际值/类别链接同时存在演示了一个 Output 连接多个 Input。完整的createNetwork见 docs/examples/network/complete-network-example.py其中还包含可选的 reset 链接sensor → SP/TM的resetOut → resetIn传感器不发送 reset 时可不建。8.6 设置预测字段启用学习与推理要让网络能预测需要告诉它预测哪个字段且索引要与数据源一致network.regions[sensor].setParameter(predictedField, consumption)学习与推理是两个相互独立的开关想输出预测就必须启用推理想学习输入数据则启用学习。二者同时启用# Enable learning for all regions. network.regions[SP].setParameter(learningMode, 1) network.regions[TM].setParameter(learningMode, 1) network.regions[classifier].setParameter(learningMode, 1) # Enable inference for all regions. network.regions[SP].setParameter(inferenceMode, 1) network.regions[TM].setParameter(inferenceMode, 1) network.regions[classifier].setParameter(inferenceMode, 1)8.7 运行网络并提取预测运行前先初始化之后可以一次运行 N 个迭代。下面一次只跑 1 个迭代以便逐时间步提取预测结果# Make sure all objects are initialized. network.initialize() N 1 # Run the network, N iterations at a time. for iteration in range(0, numRecords, N): network.run(N)从分类器区域获取输出预测使用getOutputData()。clParams.steps为1,5即同时预测未来 1 步与 5 步actualValues classifierRegion.getOutputData(actualValues) probabilities classifierRegion.getOutputData(probabilities)提取各预测步的最可能值 置信度的辅助函数docs/examples/network/example-extract-results.pydef getPredictionResults(network, clRegionName): Helper function to extract results for all prediction steps. classifierRegion network.regions[clRegionName] actualValues classifierRegion.getOutputData(actualValues) probabilities classifierRegion.getOutputData(probabilities) steps classifierRegion.getSelf().stepsList N classifierRegion.getSelf().maxCategoryCount results {step: {} for step in steps} for i in range(len(steps)): # stepProbabilities are probabilities for this prediction step only. stepProbabilities probabilities[i * N:(i 1) * N - 1] mostLikelyCategoryIdx stepProbabilities.argmax() predictedValue actualValues[mostLikelyCategoryIdx] predictionConfidence stepProbabilities[mostLikelyCategoryIdx] results[steps[i]][predictedValue] predictedValue results[steps[i]][predictionConfidence] predictionConfidence return results跑完 Hot Gym 示例后控制台输出大致如下1 步与 5 步预测值及其置信度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%)9. 源码级佐证双向链接与测试验证除 Quick Start 的传感器 → SP → TM → 分类器线性结构外examples/network/network_api_demo.py 还演示了更复杂的链接拓扑完美印证第 4.6 节Output 可连多 Input、Input 可被多 Output 馈送的机制传感器 ↔ SP 的双向链接sensor → spatialPoolerRegiondataOut → bottomUpIn以及resetOut → resetIn反向spatialPoolerRegion → sensorspatialTopDownOut → spatialTopDownIn、temporalTopDownOut → temporalTopDownInSP ↔ TM 的双向链接前向bottomUpOut → bottomUpIn反向topDownOut → topDownIn启用 TM 的topDownMode后可获得预测列输出TM → 异常似然区域temporalPoolerRegion → anomalyLikelihoodRegionanomalyScore → rawAnomalyScore同时sensor → anomalyLikelihoodRegionsourceOut → metricValue——即异常区域的一个 Input 被两个不同区域的 Output 同时馈送。该示例还展示了区域级参数操作spatialPoolerRegion.setParameter(learningMode, True)、关闭 SP 的anomalyMode非时序模型才用于计算异常、启用 TM 的learningMode/inferenceMode/anomalyMode等区域实例可通过network.getRegionsByType(SPRegion)[0].getSelf().getAlgorithmInstance()获取底层算法对象。在测试侧tests/unit/nupic/engine/network_test.py 是 Network 单元测试的集中地tests/integration/nupic/engine/ 下的network_creation_common.py、network_twonode_test.py、network_testnode_interchangeability.py与network_checkpoint_test.py则分别覆盖双区域网络、测试节点可互换性与检查点/序列化行为——这些测试验证的正是本文第 27 节描述的创建、链接、初始化、运行与序列化语义。想要更多网络用法示例可阅读 examples/network/README.md 与hierarchy_network_demo.py、custom_region_demo.py、temporal_anomaly_network_demo.py自定义 Region 的RegionImpl派生示例见 examples/network/custom_region/identity_region.py。10. 小结Network Engine 用一套小而精的对象模型支撑起 HTM 网络的完整生命周期Network是根容器Region是计算单元RegionImpl承载算法Input/Output是类型化缓冲区Link决定数据如何流动。理解所有 Link 用UniformLink 空策略、required Input 必须在initialize()前建链、输入缓冲区是入向输出缓冲区的拼接、初始化四步编排、run(n)按阶段调度并每迭代触发回调这些核心机制后你就能用nupic.engine.Network自如地搭建从线性预测链到含双向反馈与多源馈送的任意拓扑并配合网络序列化实现模型的保存与恢复。上手最快的路径是直接运行 docs/examples/network/complete-network-example.py再对照 examples/network/network_api_demo.py 探索更复杂的链接形态。赞分享机器学习人工智能【免费下载链接】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点击查看免费下载相关推荐nupic-legacy Network API 实战指南用 Region 与 Link 构建 HTM 分层网络nupic legacy Network API 实战指南用 Region 与 Link 构建 HTM 分层网络 导读 本文以 Network API 文档机器学习人工智能NuPIC API 三大接口全景指南OPF、Network API 与核心 HTM 算法NuPIC API 三大接口全景指南OPF、Network API 与核心 HTM 算法 导读 NuPICNumenta Platform for Inte机器学习人工智能NuPIC Regions 详解构建 HTM 网络的核心算法节点NuPIC Regions 详解构建 HTM 网络的核心算法节点 导读 在 Numenta Platform for Intelligent Computin机器学习人工智能上一篇Biome Markdown 格式化器如何稳定处理链接 URL 中的 HTML 实体引用下一篇CANN ops-math OneHot 算子实战解析aclnnOneHot 两段式接口、参数语义与 NPU 内核实现原理创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
阅读完成 · 觉得有帮助?
咨询建站