如何分析 CANN 模型?¶
目标:本指南结束时,您将能够使用能量景观图来可视化 CANN 动力学。
预计阅读时间:12 分钟
介绍¶
运行 CANN 模拟后,您需要可视化结果以理解网络的行为。凸起是否正确形成?它是否跟踪刺激?活动是否稳定?
Analyzer 模块提供了专为 CANN 动力学设计的可视化工具。本指南重点关注最重要的可视化方法:能量景观图。
您将学习:
创建静态能量景观图
生成动画可视化
比较不同模型(CANN 与 CANN 加 SFA)
使用 PlotConfig 系统实现一致的样式
什么是能量景观?¶
能量景观显示神经活动如何随时间演变:
X 轴:神经元位置(对于 1D CANN,这是从 -π 到 π 的角位置)
Y 轴:神经活动或突触输入
动画:活动模式的时间演变
此可视化非常适合观察:
凸起形成:是否出现局部化的活动凸起?
跟踪:凸起是否跟随外部刺激?
稳定性:凸起是否保持其形状和位置?
PlotConfig 系统¶
在深入示例之前,请了解可视化架构。
该库使用 PlotConfig 数据类来管理绘图设置。这提供了:
一致性:不同绘图类型之间使用相同的参数
可重用性:保存和重用配置
类型安全:清晰的参数名称和验证
[ ]:
from canns.analyzer.plotting import PlotConfigs
# 为动画创建配置
config = PlotConfigs.energy_landscape_1d_animation(
time_steps_per_second=100, # 模拟速度(100 步/秒)
fps=20, # 动画帧速率
title='My CANN Simulation',
xlabel='Position (rad)',
ylabel='Activity',
save_path='output.gif',
show=False # 不显示,只保存
)
为什么使用 PlotConfig? 与其向函数传递 10 多个参数,不如配置一次并重用。这在创建多个类似绘图时特别有价值。
完整工作流:从模型到可视化¶
让我们构建一个完整的示例,创建、模拟和可视化一个 CANN:
[ ]:
import brainpy.math as bm
from canns.models.basic import CANN1D
from canns.task.tracking import SmoothTracking1D
from canns.analyzer.plotting import PlotConfigs, energy_landscape_1d_animation
# 1. 设置
bm.set_dt(0.1)
# 2. 创建模型
cann = CANN1D(num=512)
# 3. 创建任务
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. 运行模拟
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("模拟完成!现在进行可视化...")
# 5. 创建可视化配置
config = PlotConfigs.energy_landscape_1d_animation(
time_steps_per_second=100,
fps=20,
title='CANN1D Smooth Tracking',
xlabel='Position (rad)',
ylabel='Activity',
repeat=True,
save_path='cann1d_tracking.gif',
show=False
)
# 6. 生成动画
energy_landscape_1d_animation(
data_sets={
'u': (cann.x, us), # 随时间变化的突触输入
'Iext': (cann.x, task.data) # 外部刺激
},
config=config
)
print("动画已保存到 cann1d_tracking.gif")
第 6 步发生了什么:
data_sets:将标签映射到(positions, data)元组的字典cann.x:神经元位置(X 轴值)us:随时间变化的活动(形状为[time_steps, num_neurons])task.data:用于比较的原始输入刺激
动画将显示两条曲线:
蓝色 (u):CANN 的内部活动
橙色 (Iext):外部输入刺激
您将看到活动凸起跟踪移动刺激!
用于快速检查的静态绘图¶
对于快速检查而不生成完整动画:
[ ]:
from canns.analyzer.plotting import PlotConfigs, energy_landscape_1d
# 静态绘图配置
config_static = PlotConfigs.energy_landscape_1d(
time_steps_per_second=100,
title='Activity at t=200',
xlabel='Position (rad)',
ylabel='Activity',
save_path='snapshot_t200.png',
show=True # 显示绘图
)
# 绘制特定时间步的活动(例如,t=200)
energy_landscape_1d(
data_sets={'Activity': (cann.x, us[200])}, # 单个时间步
config=config_static
)
用例:快速检查模型是否在特定时间达到稳定状态。
比较模型:CANN vs. CANN-SFA¶
一种强大的可视化技术是并排比较不同的模型。让我们比较标准 CANN 与包含尖峰频率适应 (SFA) 的 CANN:
[ ]:
import brainpy.math as bm
from canns.models.basic import CANN1D, CANN1D_SFA
from canns.task.tracking import SmoothTracking1D
from canns.analyzer.plotting import PlotConfigs, energy_landscape_1d_animation
bm.set_dt(0.1)
# 创建两个模型
cann_standard = CANN1D(num=512)
cann_sfa = CANN1D_SFA(num=512, tau_v=50.0) # 带适应时间常数的 SFA
# 两个模型使用相同的任务
task = SmoothTracking1D(
cann_instance=cann_standard, # 使用一个模型作为参考
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()
# 模拟标准 CANN
def step_standard(t, inputs):
cann_standard(inputs)
return cann_standard.r.value
rs_standard = bm.for_loop(step_standard, operands=(task.run_steps, task.data), progress_bar=10)
# 模拟 CANN-SFA
def step_sfa(t, inputs):
cann_sfa(inputs)
return cann_sfa.r.value
# 为了公平比较而重新初始化
rs_sfa = bm.for_loop(step_sfa, operands=(task.run_steps, task.data), progress_bar=10)
# 在一个动画中可视化两者
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,
save_path='comparison_standard_vs_sfa.gif',
show=False
)
energy_landscape_1d_animation(
data_sets={
'CANN (Standard)': (cann_standard.x, rs_standard),
'CANN-SFA': (cann_sfa.x, rs_sfa),
'Input': (cann_standard.x, task.data)
},
config=config_comparison
)
print("比较动画已保存!")
您将观察到:
标准 CANN:凸起紧密跟踪输入
CANN-SFA:凸起可能显示振荡行为或由于适应导致的延迟跟踪
洞察:SFA 引入了历史相关的动力学,可见为不同的跟踪模式
这种比较帮助您理解模型变体在相同条件下的不同行为。
自定义可视化¶
调整动画速度¶
[ ]:
config_slow = PlotConfigs.energy_landscape_1d_animation(
time_steps_per_second=50, # 每秒显示 50 步(较慢)
fps=10, # 每秒 10 帧(更平滑)
...
)
经验法则:time_steps_per_second / fps = 每帧步数
比率越高 = 动画越快
比率越低 = 动画越慢,细节越丰富
改变外观¶
[ ]:
config_styled = PlotConfigs.energy_landscape_1d_animation(
figsize=(10, 4), # 更宽的图形
title='Custom Styled Plot',
xlabel='Angular Position',
ylabel='Firing Rate (Hz)',
title_fontsize=14,
save_path='styled_output.gif',
show=False
)
保存与显示¶
[ ]:
# 仅保存(用于批处理)
config_save = PlotConfigs.energy_landscape_1d_animation(
save_path='output.gif',
show=False
)
# 仅显示(用于交互式探索)
config_display = PlotConfigs.energy_landscape_1d_animation(
save_path=None,
show=True
)
# 两者
config_both = PlotConfigs.energy_landscape_1d_animation(
save_path='output.gif',
show=True
)
更多分析工具¶
本指南重点关注能量景观,但分析器模块包含许多其他工具:
调谐曲线:神经元选择性绘图
放电场:空间响应图
凸起拟合:提取凸起位置和宽度
尖峰图:基于尖峰的模型的栅栏图
这些内容在完整详情:模型分析器部分有详细介绍。
后续步骤¶
现在您可以可视化 CANN 动力学,您已准备好:
快速参考:
[ ]:
# 标准可视化工作流
from canns.analyzer.plotting import PlotConfigs, energy_landscape_1d_animation
# 1. 配置
config = PlotConfigs.energy_landscape_1d_animation(
time_steps_per_second=100,
fps=20,
save_path='output.gif'
)
# 2. 可视化
energy_landscape_1d_animation(
data_sets={'Activity': (positions, activity_over_time)},
config=config
)
有问题?查看*`PlotConfig 指南 <link-to-plotconfig-detail>`__*或*`GitHub 讨论 <https://github.com/routhleck/canns/discussions>`__*。