监视神经元及突触信息#

作者: Shawn

本文主要是讲解如何使用 neurai.monitor.MonitorBS 完成记录神经元的脉冲和电压,以及突触权重。

监视变量配置#

使用 neurai.monitor.MonitorConf 配置记录的神经元及突触信息。记录神经元簇名称为 ExpLIF_0 的脉冲和电压:

from neurai.monitor import MonitorConf
monitors=[MonitorConf("ExpLIF_0", "spike"), MonitorConf("ExpLIF_0", "v", slices=slice(0, 1))]

其中 slices 参数可以设置切片信息,记录前几个神经元。

当连接使用 STDP 连接时,记录权重可以这样写:

from neurai.monitor import MonitorConf
monitors=[MonitorConf("STDPNearest_0", "weight")]

记录权重也同样支持切片功能,可以记录前几条突触。

设置监视方法#

监视方法目前支持二种:内存、写文件,写法如下:

from neurai.monitor import MemoryRecorder, FileRecorder
recorder=MemoryRecorder()
recorder=FileRecorder("./",over_write=True)

创建脑仿真监视对象#

在配置好监视变量以及监视方法后,可以构造一个脑仿真监视对象 neurai.monitor.MonitorBS:

from neurai.monitor import MonitorBS
monitorbs = MonitorBS(
  monitors=[MonitorConf("ExpLIF_0", "spike"),
            MonitorConf("ExpLIF_1", "spike"),
            MonitorConf("STDPNearest_0", "weight")],
  recorder=MemoryRecorder())

具体监视示例#

以下是使用 neurai.monitor.MonitorBS 监视脑仿真变量的具体示例:

import sys
import os
from neurai.config import set_platform, set_simulate_status
set_platform(platform='cpu')
from neurai import nn
from neurai.monitor import MonitorBS, MonitorConf, MemoryRecorder
from neurai.util import visualization
import jax.numpy as jnp
from neurai.initializer import NormalIniter, UniformIniter


class TwoNeurons(nn.SNet):

  def setup(self):
    self.lif0 = nn.ExpLIF(I_e=400., v_init=UniformIniter(-80, -50))
    self.lif1 = nn.ExpLIF(size=1, v_init=NormalIniter(-70.0, 1))
    weight = 20.0
    delay = 10
    self.syn1 = nn.StaticSynapse(
      pre=self.lif0, post=self.lif1, weight=weight, delay_step=delay, conn=nn.FixedTotalNum(1))
    self.syn2 = nn.StaticSynapse(pre=self.lif1, post=self.lif0, weight=weight, delay_step=delay)


class TwoNeuronNet(nn.Module):

  def setup(self):
    self.network = nn.SNetLayer(TwoNeurons)

  def __call__(self, input=None, t=0, monitor=None):
    _, mon = self.network(input=input, t=t, monitor=monitor)
    return mon

net = TwoNeuronNet()
params = net.init()
monitorbs = MonitorBS(
  monitors=[MonitorConf("ExpLIF_0", "spike"),
            MonitorConf("ExpLIF_0", "v", slices=slice(0, 1))],
  recorder=MemoryRecorder())
mon = net.run(params, t=100.0, monitor=monitorbs)