如何分析 CANN 模型?¶
目标: 学完本指南后,您将能够使用能量景观图来可视化 CANN 的动力学行为。
预计阅读时间: 12 分钟
简介¶
在运行 CANN 仿真后,您需要 可视化 结果来理解网络的行为。波包是否正确形成?它是否在跟踪刺激?其活动是否稳定?
Analyzer 模块提供了专为 CANN 动力学设计的可视化工具。本指南将重点介绍最核心的可视化方法:能量景观图。
您将学到:
什么是能量景观?¶
能量景观 展示了神经活动如何随时间演变:
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
(<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 的动力学行为,接下来可以:
分析实验数据——将类似技术应用于真实的神经记录数据
探索模型分析器——了解所有可用的分析方法
完整可视化 API——PlotConfig 和所有绘图函数的完整参考
如有疑问?请访问 GitHub Discussions。