如何分析 CANN 模型?

目标: 学完本指南后,您将能够使用能量景观图来可视化 CANN 的动力学行为。

预计阅读时间: 12 分钟

简介

在运行 CANN 仿真后,您需要 可视化 结果来理解网络的行为。波包是否正确形成?它是否在跟踪刺激?其活动是否稳定?

Analyzer 模块提供了专为 CANN 动力学设计的可视化工具。本指南将重点介绍最核心的可视化方法:能量景观图

您将学到:

  1. 创建静态能量景观图

  2. 生成动画可视化

  3. 比较不同模型(CANN 与带 SFA 的 CANN [9, 10]

  4. 使用 PlotConfig 系统实现一致的样式

什么是能量景观?

能量景观 展示了神经活动如何随时间演变:

  • X 轴: 神经元位置(对于 1D CANN,即从 -π 到 π 的角位置)

  • Y 轴: 神经活动或突触输入

  • 动画: 活动模式随时间的演变

这种可视化非常适合观察:

  • 波包形成: 是否产生了局部化的活动波包?

  • 跟踪: 波包是否跟随外部刺激?

  • 稳定性: 波包是否保持其形状和位置?

PlotConfig 系统

在深入示例之前,我们先来了解一下可视化架构。

该库使用 PlotConfig 数据类来管理绘图设置。这带来了以下好处:

  • 一致性: 不同绘图类型之间使用相同的参数

  • 可重用性: 保存和重用配置

  • 类型安全: 清晰的参数名称和验证

[ ]:
from canns.analyzer.visualization import PlotConfigs

# Create a configuration for animation
config = PlotConfigs.energy_landscape_1d_animation(
    time_steps_per_second=100,  # Simulation speed (100 steps/sec)
    fps=20,                     # Animation frame rate
    title='My CANN Simulation',
    xlabel='Position (rad)',
    ylabel='Activity',
    save_path='output.gif',
    show=False                  # Don't display, just save
)

为何使用 PlotConfig? 与其向函数传递 10 多个参数,不如一次性配置并重复使用。这在创建多个相似图表时尤其有价值。

完整工作流: 从模型到可视化

让我们构建一个完整的示例——创建、模拟并可视化一个 CANN:

[1]:
import brainpy.math as bm  # :cite:p:`wang2023brainpy`
from canns.models.basic import CANN1D
from canns.task.tracking import SmoothTracking1D
from canns.analyzer.visualization import PlotConfigs, energy_landscape_1d_animation

# 1. Setup
bm.set_dt(0.1)

# 2. Create model (auto-initializes)
cann = CANN1D(num=512)

# 3. Create task
task = SmoothTracking1D(
    cann_instance=cann,
    Iext=(1.0, 0.75, 2.0, 1.75, 3.0),
    duration=(10.0, 10.0, 10.0, 10.0),
    time_step=bm.get_dt(),
)
task.get_data()

# 4. Run simulation
def run_step(t, inputs):
    cann(inputs)
    return cann.u.value, cann.r.value

us, rs = bm.for_loop(
    run_step,
    operands=(task.run_steps, task.data),
    progress_bar=10
)

print("Simulation complete! Now visualizing...")

# 5. Create visualization config
config = PlotConfigs.energy_landscape_1d_animation(
    time_steps_per_second=100,
    fps=20,
    title='CANN1D Smooth Tracking',
    xlabel='Position (rad)',
    ylabel='Activity',
    repeat=True,
    show=True,
)

# 6. Generate animation
energy_landscape_1d_animation(
    data_sets={
        'u': (cann.x, us),      # Synaptic input over time
        'Iext': (cann.x, task.data)  # External stimulus
    },
    config=config
)
<SmoothTracking1D> Generating Task data: 400it [00:00, 1848.42it/s]
Simulation complete! Now visualizing...

第 6 步发生了什么:

  • data_sets: 将标签映射到 (positions, data) 元组的字典

  • cann.x: 神经元位置(x 轴值)

  • us: 随时间变化的活动(形状为 [time_steps, num_neurons]

  • task.data: 用于比较的原始输入刺激

动画将显示两条曲线:

  • 蓝色 (u): CANN 的内部活动

  • 橙色 (Iext): 外部输入刺激

您将看到活动波包跟踪移动的刺激!

用于快速检查的静态图

如需快速检查而不生成完整动画:

[ ]:
from canns.analyzer.visualization import PlotConfigs, energy_landscape_1d_static

# Configuration for static plot
config_static = PlotConfigs.energy_landscape_1d_static(
    time_steps_per_second=100,
    title='Activity at t=200',
    xlabel='Position (rad)',
    ylabel='Activity',
    save_path='snapshot_t200.png',
    show=True  # Display the plot
)

# Plot activity at specific time step (e.g., t=200)
energy_landscape_1d_static(
    data_sets={'Activity': (cann.x, us[200])},  # Single time step
    config=config_static
)
Plot saved to: snapshot_t200.png
../../_images/zh_1_quick_starts_03_analyze_model_5_1.png
(<Figure size 1000x600 with 1 Axes>,
 <Axes: title={'center': 'Activity at t=200'}, xlabel='Position (rad)', ylabel='Activity'>)

用例: 快速检查模型在特定时间点是否达到了稳定状态。

比较模型: CANN vs. CANN-SFA

本节将比较标准 CANN 与 CANN-SFA [9, 10] 模型。

一种强大的可视化技术是 并排比较不同的模型 。让我们将一个标准 CANN 与一个包含 尖峰频率适应 (SFA) 的 CANN 进行比较:

[4]:
import brainpy.math as bm  # :cite:p:`wang2023brainpy`
from canns.models.basic import CANN1D, CANN1D_SFA  # SFA: :cite:p:`mi2014spike,li2025dynamics`
from canns.task.tracking import SmoothTracking1D
from canns.analyzer.visualization import PlotConfigs, energy_landscape_1d_animation

bm.set_dt(0.1)

# Create two models (auto-initialize)
cann_standard = CANN1D(num=512)
cann_sfa = CANN1D_SFA(num=512, tau_v=50.0)  # SFA with adaptation time constant

# Same task for both
task = SmoothTracking1D(
    cann_instance=cann_standard,  # Use one model as reference
    Iext=(1.0, 0.75, 2.0, 1.75, 3.0),
    duration=(10.0, 10.0, 10.0, 10.0),
    time_step=0.1,
)
task.get_data()

# Simulate standard CANN
def step_standard(t, inputs):
    cann_standard(inputs)
    return cann_standard.u.value

us_standard = bm.for_loop(
    step_standard,
    operands=(task.run_steps, task.data),
    progress_bar=10
)

# Simulate CANN-SFA
def step_sfa(t, inputs):
    cann_sfa(inputs)
    return cann_sfa.u.value

us_sfa = bm.for_loop(
    step_sfa,
    operands=(task.run_steps, task.data),
    progress_bar=10
)

# Visualize both in one animation
config_comparison = PlotConfigs.energy_landscape_1d_animation(
    time_steps_per_second=100,
    fps=20,
    title='CANN vs CANN-SFA: Oscillatory Tracking',
    xlabel='Position (rad)',
    ylabel='Activity',
    repeat=True,
    show=True,
)

energy_landscape_1d_animation(
    data_sets={
        'CANN (Standard)': (cann_standard.x, us_standard),
        'CANN-SFA': (cann_sfa.x, us_sfa),
        'Input': (cann_standard.x, task.data)
    },
    config=config_comparison
)
<SmoothTracking1D> Generating Task data: 400it [00:00, 9277.33it/s]

您将观察到:

  • 标准 CANN: 波包紧密跟随输入

  • CANN-SFA: 由于适应机制,波包可能表现出振荡行为或延迟跟踪

  • 洞察: SFA 引入了依赖于历史的动力学——这表现为不同的跟踪模式

这种比较能帮助您理解不同模型变体在相同条件下的行为差异。

自定义可视化

调整动画速度

[ ]:
config_slow = PlotConfigs.energy_landscape_1d_animation(
    time_steps_per_second=50,   # Show 50 steps per second (slower)
    fps=10,                     # 10 frames per second (smoother)
    ...
)

经验法则: time_steps_per_second / fps = 每帧步数

  • 比率越高 = 动画越快

  • 比率越低 = 动画越慢,细节更丰富

改变外观

[ ]:
config_styled = PlotConfigs.energy_landscape_1d_animation(
    figsize=(10, 4),            # Wider figure
    title='Custom Styled Plot',
    xlabel='Angular Position',
    ylabel='Firing Rate (Hz)',
    title_fontsize=14,
    save_path='styled_output.gif',
    show=False
)

保存与显示

[ ]:
# Save only (for batch processing)
config_save = PlotConfigs.energy_landscape_1d_animation(
    save_path='output.gif',
    show=False
)

# Display only (for interactive exploration)
config_display = PlotConfigs.energy_landscape_1d_animation(
    save_path=None,
    show=True
)

# Both
config_both = PlotConfigs.energy_landscape_1d_animation(
    save_path='output.gif',
    show=True
)

更多分析工具

本指南重点关注能量景观,但分析器模块还包含许多其他工具:

  • 调谐曲线: 神经元选择性图

  • 发放野: 空间响应图

  • 波包拟合: 提取波包位置和宽度

  • 脉冲图: 基于脉冲的模型的栅格图

这些工具在”详细信息:模型分析器”一节中有详细介绍。

后续步骤

现在您已经可以可视化 CANN 的动力学行为,接下来可以:

  1. 分析实验数据——将类似技术应用于真实的神经记录数据

  2. 探索模型分析器——了解所有可用的分析方法

  3. 完整可视化 API——PlotConfig 和所有绘图函数的完整参考

如有疑问?请访问 GitHub Discussions