SpikingJelly笔记之IFLIF神经元

文章目录

  • 前言
  • 一、脉冲神经元
  • 二、IF神经元
    • 1、神经元模型
    • 2、神经元仿真
  • 三、LIF神经元
    • 1、神经元模型
    • 2、神经元仿真
  • 总结


前言

记录整合发放(integrate-and-fire, IF)神经元与漏电整合发放(leaky integrate-and-fire, LIF)神经元模型,以及在SpikingJelly中的实现方法。


一、脉冲神经元

1、脉冲神经元:只输出脉冲(1/0)的神经元

spikingjelly.activation_based.neuron

2、阈下神经动态方程:神经元根据输入及自身状态更新膜电位

微分方程: d V ( t ) d t = f ( V ( t ) , X ( t ) ) \frac{dV(t)}{dt}=f(V(t),X(t)) dtdV(t)=f(V(t),X(t))

差分近似: V [ t ] = f ( V [ t − 1 ] , X [ t ] ) V[t]=f(V[t-1],X[t]) V[t]=f(V[t1],X[t])

3、计算步骤

X:输入
S:输出(0/1)
H:充电后、放电前的膜电位
V:放电后的膜电位

4、放电方程

def neuronal_fire(self):self.spike = self.surrogate_function(self.v - self.v_threshold)

surrogate_function:前向传播时为阶跃函数,膜电位超过阈值时输出为1

Θ ( x ) = { 1 , x ≥ 0 0 , x < 0 \Theta(x) = \left\{\begin{matrix} 1,\quad x\ge 0\\ 0,\quad x<0\\ \end{matrix}\right. Θ(x)={1,x00,x<0

5、重置方程

def neuronal_reset(self):if self.v_reset is None:self.v = self.v - self.spike * self.v_thresholdelse:self.v = (1. - self.spike) * self.v + self.spike * self.v_reset

膜电位达到阈值时神经元发放脉冲,膜电位恢复至静息值
v = { v − v t h r e s h o l d , v r e s e t = N o n e v r e s e t , o t h e r w i s e v = \left\{\begin{matrix} \begin{alignat*}{2} v-v_{threshold},&\quad v_{reset}=None\\ v_{reset},&\quad otherwise \end{alignat*} \end{matrix}\right. v={vvthreshold,vreset,vreset=Noneotherwise

二、IF神经元

1、神经元模型

(1)整合发放(integrate-and-fire)神经元:neuron.IFNode

理想积分器,无输入时膜电位保持恒定

(2)模型方程: I ( t ) = C d V ( t ) d t I(t)=C\frac{dV(t)}{dt} I(t)=CdtdV(t)

I(t):输入电流
V(t):膜电位
C:膜电容

(3)阈下神经动力学方程: H [ t ] = V [ t − 1 ] + X [ t ] H[t]=V[t-1]+X[t] H[t]=V[t1]+X[t]

(4)充电方程

def neuronal_charge(self, x: torch.Tensor):self.v = self.v + x

(5)构建IF神经元:layer = neuron.IFNode()

构造参数:
①v_threshold=1.0:阈值电压
②v_reset=0.0:重置电压
③surrogate_function=surrogate.Sigmoid():反向传播梯度替代函数
④step_mode=‘s’:步进模式,单步’s’,多步’m’
⑤store_v_seq=False:是否保存所有时间步的膜电位self.v

2、神经元仿真

(1)构建输入与神经元层,前50步输入为1,后50步输入为0

import torch
from torch import nn
from spikingjelly.activation_based import neuron, monitor, functional
from spikingjelly import visualizing
####################构建输入####################
T = 100 # 时间步数
N = 1 # 样本数目
D = 1 # 输入维度/神经元数目
x_seq1 = torch.ones(50, N, D)
x_seq2 = torch.zeros(50, N, D)
x_seq = torch.cat((x_seq1,x_seq2), 0)
# 构建一层IF神经元
net = nn.Sequential(neuron.IFNode(v_threshold=9.0,v_reset=0.0,step_mode='s',store_v_seq=False))
print(net)

神经元数量N由输入维度(T,N)确定
使用脉冲神经元代替神经网络的激活函数

(2)根据输入按时间步更新神经元膜电位与输出
单步模式(默认):逐步传播,深度优先遍历,内存占用小,适用于ANN2SNN
需要手动for循环按时间步计算

####################记录神经元状态####################
v_list = [] # 膜电位
s_list = [] # 神经元输出
####################单步模式:逐步传播####################
with torch.no_grad(): # 计算时关闭自动求导for i in range(T):y = net(x_seq[i])v_list.append(net[0].v)s_list.append(y)
functional.reset_net(net) # 重置神经元状态
####################可视化膜电位与输出####################
v_list = torch.cat(v_list).flatten()
s_list = torch.cat(s_list).flatten()
visualizing.plot_one_neuron_v_s(v_list.numpy(),s_list.numpy(),v_threshold=net[0].v_threshold,v_reset=net[0].v_reset,figsize=(12, 8),dpi=100)

脉冲神经元是有状态的(self.v)
输入一批样本后需要进行复位:functional.reset_net(net)

(3)网络结构

Sequential((0): IFNode(v_threshold=9.0, v_reset=0.0, detach_reset=False, step_mode=s, backend=torch(surrogate_function): Sigmoid(alpha=4.0, spiking=True))
)

4、各时间步神经元的膜电位与输出

三、LIF神经元

1、神经元模型

(1)漏电整合发放(leaky integrate-and-fire)神经元:neuron.LIFNode

引入漏电项,无输入时膜电位恢复至静息电位,模拟离子扩散

(2)模型方程:
I ( t ) − g ( V ( t ) − E ) = C d V ( t ) d t I(t)-g(V(t)-E)=C\frac{dV(t)}{dt} I(t)g(V(t)E)=CdtdV(t)

I(t):输入电流
V(t):膜电位
C:膜电容
g:泄漏电导
E:静息电位

(3)阈下神经动力学方程:

H [ t ] = { V [ t − 1 ] + X [ t ] − 1 τ ( V [ t − 1 ] − V r e s e t ) , d e c a y _ i n p u t = F a l s e V [ t − 1 ] + 1 τ ( X [ t ] − ( V [ t − 1 ] − V r e s e t ) ) , d e c a y _ i n p u t = T r u e H[t] = \left\{\begin{matrix} \begin{alignat*}{2} V[t-1]+X[t]-\frac{1}{\tau}(V[t-1]-V_{reset}),&\quad decay\_input=False\\ V[t-1]+\frac{1}{\tau}(X[t]-(V[t-1]-V_{reset})),&\quad decay\_input=True \end{alignat*} \end{matrix}\right. H[t]= V[t1]+X[t]τ1(V[t1]Vreset),V[t1]+τ1(X[t](V[t1]Vreset)),decay_input=Falsedecay_input=True

decay_input为False时,膜电位V的衰减由 1 τ ( V − V r e s e t ) \frac{1}{\tau}(V-V_{reset}) τ1(VVreset)控制
decay_input为True时,输入X[t]参与衰减,乘以系数 1 τ \frac{1}{\tau} τ1

(4)充电方程

def neuronal_charge(self, x: torch.Tensor):if self.decay_input:if self.v_reset is None or self.v_reset == 0.:self.v = self.v + (x - self.v) / self.tauelse:self.v = self.v + (x - (self.v - self.v_reset) / self.tauelse:if self.v_reset is None or self.v_reset == 0.:self.v = self.v + x - self.v / self.tauelse:self.v = self.v + x - (self.v - self.v_reset) / self.tau

(5)构建LIF神经元:layer = neuron.LIFNode()

构造参数:
①tau=2.0:膜电位时间常数
②decay_input=True:输入是否参与衰减
③v_threshold=1.0:阈值电压
④v_reset=0.0:重置电压
⑤surrogate_function=surrogate.Sigmoid():梯度替代函数
⑥step_mode=‘s’:步进模式
⑦store_v_seq=False:是否保存所有时间步的膜电位self.v

2、神经元仿真

(1)构建输入与神经元层,前50步输入为1,后50步输入为0

####################构建输入####################
T = 100 # 时间步数
N = 1 # 样本数目
D = 1 # 输入维度/神经元数目
x_seq1 = torch.ones(50, N, D)
x_seq2 = torch.zeros(50, N, D)
x_seq = torch.cat((x_seq1,x_seq2), 0)
# 构建一层LIF神经元
net = nn.Sequential(neuron.LIFNode(tau=10.0,decay_input=True,v_threshold=0.9,v_reset=0.0,step_mode='m',store_v_seq=True))
print(net)

(2)根据输入按时间步更新神经元膜电位与输出
多步模式:逐层传播,广度优先遍历,并行速度更快,适用于梯度替代法
直接计算,不需要手动写for循环

####################监视器记录神经元状态####################
# 记录膜电位
monitor_v = monitor.AttributeMonitor('v_seq',pre_forward=False,net=net,instance=neuron.LIFNode)
# 记录输出
monitor_o = monitor.OutputMonitor(net=net,instance=neuron.LIFNode)
####################多步模式:逐层传播####################
with torch.no_grad(): # 计算时关闭自动求导net(x_seq)
functional.reset_net(net) # 重置神经元状态
####################可视化膜电位与输出####################
v_list = monitor_v.records[0].flatten()
s_list = monitor_o.records[0].flatten()
visualizing.plot_one_neuron_v_s(v_list.numpy(),s_list.numpy(),v_threshold=net[0].v_threshold,v_reset=net[0].v_reset,figsize=(12, 8),dpi=100)

使用monitor监视器记录神经元输出与成员变量(膜电位)

(3)网络结构

Sequential((0): LIFNode(v_threshold=0.9, v_reset=0.0, detach_reset=False, step_mode=m, backend=torch, tau=10.0(surrogate_function): Sigmoid(alpha=4.0, spiking=True))
)

(4)各时间步神经元的膜电位与输出

输入为0时,膜电位自发泄漏

(5)当时间常数tau很大时,LIF神经元退化为IF神经元

net = nn.Sequential(neuron.LIFNode(tau=1.0e8,decay_input=False,v_threshold=9.0,v_reset=0.0,step_mode='m',store_v_seq=True))
Sequential((0): LIFNode(v_threshold=9.0, v_reset=0.0, detach_reset=False, step_mode=m, backend=torch, tau=100000000.0(surrogate_function): Sigmoid(alpha=4.0, spiking=True))
)


总结

不同神经元的主要差别在于阈下神经动力学方程(充电方程),而放电方程与重置方程相似;
IF神经元具有记忆效应,在无输入时,神经元膜电位会一直维持在当前状态;
LIF神经元引入漏电流项,在无输入时,膜电位会恢复至静息电位;
通过monitor和visualizing可以方便地监控和绘制神经元的膜电位与输出。

参考:
[1] SpikingJelly的文档——神经元
[2] 脉冲神经网络:模型、学习算法与应用
[3] 脉冲神经网络研究进展综述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/640539.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

x-cmd pkg | yq - 命令行 YAML处理工具

目录 简介首次用户支持格式转换友好的显示和操作语法与 jq 类似竞品和相关作品进一步阅读 简介 yq (YAML Query) 是一个轻量级的 YAML、JSON、XML 处理器&#xff0c;主要用于查询和提取 YAML 数据。 本 yq 的包来自 mikefarah/yq 项目&#xff0c;语法类似于 jq 。相比 kisly…

java数据结构与算法刷题-----LeetCode645. 错误的集合(位运算解法需要重点掌握)

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 文章目录 法一&#xff1a;桶排序思想法二&#xff1a;位运算 法一&#x…

Python文件操作和异常处理:高效处理数据的利器

文章目录 一、引言1.1 文件操作和异常处理对于编程的重要性1.2 Python作为实现文件操作和异常处理的强大工具 二、为什么学习文件操作和异常处理2.1 处理各种文件格式&#xff1a;从文本到图像到音频等2.2 确保代码的鲁棒性&#xff1a;有效处理异常情况 三、文件读取和写入3.1…

什么是关键字?C语言的关键字有哪些?(C语言32个关键字详解)

目录 一、问题 二、解答 1、数据类型关键字&#xff08;12个&#xff09; (1) 声明和定义的区别 (2) 数据类型关键字 • char&#xff1a;声明字符型变量 1、声明字符变量 2、字符数组 3、ASCII码表示 4、指针与字符数组 5、多字节字符集&#xff08;如UTF-8&#xff…

【C++】初识类和对象

引言 在C语言中&#xff0c;我们用结构体来描述一个复杂的对象&#xff0c;这个对象可能包括许多的成员&#xff0c;如用结构体描述一个学生的成绩&#xff0c;或者描述一个日期等。 struct Date {int _year;int _month;int _day; }; 如上是一个描述日期的结构体定义&#x…

超融合基础架构理解

1 超融合基础架构 1.1 定义 超融合基础架构&#xff08;Hyper-converged infrastructure&#xff0c;缩写为HCI&#xff09;&#xff0c;是一种集成了存储设备及虚拟运算的信息基础架构框架。在这样的架构环境中&#xff0c;同一厂商的服务器与存储等硬件单元&#xff0c;搭配…

【网站项目】基于SSM的263货物进销管理系统

&#x1f64a;作者简介&#xff1a;多年一线开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

探索Docker-Compose:从基础到高级命令全解析

探索Docker-Compose&#xff1a;从基础到高级命令全解析 引言Docker-Compose基础1. Docker-Compose简介2. 安装Docker-Compose3. 编写第一个Compose文件4. 基本命令 Docker-Compose文件结构解析1. 理解docker-compose.yml2. 基本组件3. 文件示例4. 配置项解析 常用Docker-Compo…

洛谷P1319 压缩技术(C语言)

这样一道入门题目&#xff0c;本来可以用for循环直接操作&#xff0c;但作者异想天开(xian de dan teng)地把所有数据登记在一个数组里面&#xff0c;然后再统一按格式输出。也就是定义一个数组Map&#xff0c;大小为n成n&#xff0c;然后按照输入数据&#xff0c;把Map中每一个…

【50.2K⭐】Tabby:一款强大、灵活且跨平台的免费终端应用程序

【50.2K⭐】Tabby&#xff1a;一款强大、灵活且跨平台的免费终端应用程序 在快节奏的现代生活中&#xff0c;我们总是在寻找提高工作效率的方法。如果你是一位开发人员&#xff0c;或者是一个对技术充满好奇心的电脑爱好者&#xff0c;我们经常需要在 Windows 上进行远程操作与…

加密机授权报错如何排查?进入加密机后台的方式介绍

我们在此前的文章中介绍过不少TSINGSEE青犀视频安防监控视频平台关于加密机授权操作及相关疑问解答&#xff0c;感兴趣的用户可以翻阅往期的文章进行了解。由于新用户咨询该方面的问题较多&#xff0c;今天我们再来介绍一下用户在使用过程中遇到的问题。 1、如何进入加密机后台…

Vue-33、Vue中为什么使用render函数

1、main.js //该文件是整个项目的入口文件 //引入Vue import Vue from vue //引入APP组件&#xff0c;他是所有组件的父组件 import App from ./App.vue //关闭Vue是生产提示 Vue.config.productionTip false; //创建Vue实例对象---vm new Vue({render: h > h(App), }).$m…

笔试面试题——二叉树进阶(二)

&#x1f4d8;北尘_&#xff1a;个人主页 &#x1f30e;个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上&#xff0c;不忘来时的初心 文章目录 一、二叉搜索树与双向链表1、题目讲解2、思路讲解递归展开图3、代码实现 二、从前序遍历和中序…

安装向量数据库milvus可视化工具attu

使用docker安装的命令和简单就一个命令&#xff1a; docker run -p 8000:3000 -e MILVUS_URL{milvus server IP}:19530 zilliz/attu:v2.3.5sunyuhuasunyuhua-HKF-WXX:~/dockercom/milvus$ docker run -p 8000:3000 -e MILVUS_URL127.0.0.1:19530 zilliz/attu:latest yarn run…

Xcode查看APP文件目录

一、连接真机到MAC电脑上 二、打开Devices 点击window -> Devices and Simulatores 三、选中设备、选择app 四、选择下载内容 五、查看文件内容 得到的文件 右键显示包内容&#xff0c;获得APP内数据 六、分发证书无法下载 使用分发的证书无法下载文件内容&#xf…

k8s的包管理工具helm

Helm是什么? 之前的这篇文章介绍了一开始接触k8s的时候接触到的几个命令工具 kubectl&kubelet&rancher&helm&kubeadm这几个命令行工具是什么关系&#xff1f;-CSDN博客 Helm 是一个用于管理和部署 Kubernetes 应用程序的包管理工具。它允许用户定义、安装和…

阿里云优惠券领取入口、使用方法和限制条件,2024最新

阿里云优惠代金券领取入口&#xff0c;阿里云服务器优惠代金券、域名代金券&#xff0c;在领券中心可以领取当前最新可用的满减代金券&#xff0c;阿里云百科aliyunbaike.com分享阿里云服务器代金券、领券中心、域名代金券领取、代金券查询及使用方法&#xff1a; 阿里云优惠券…

如何在Mac上安装PHP环境

前置环境&#xff1a;HomeBrew # Homebrew 是 Mac 上最好的包管理器之一&#xff0c;可以用于安装各种开源软件。从 Terminal&#xff08;终端&#xff09;执行以下命令安装 Homebrew&#xff1a; /usr/bin/ruby -e $(curl -fsSL https://raw.githubusercontent.com/Homebrew/i…

全流程机器视觉工程开发(一)环境准备,paddledetection和labelme

前言 我现在在准备做一个全流程的机器视觉的工程&#xff0c;之前做了很多理论相关的工作。大概理解了机器视觉的原理&#xff0c;然后大概了解了一下&#xff0c;我发现现在的库其实已经很发展了&#xff0c;完全不需要用到非常多的理论&#xff0c;只需要知道开发过程就可以…

Flutter 滚动布局:sliver模型

一、滚动布局 Flutter中可滚动布局基本都来自Sliver模型&#xff0c;原理和安卓传统UI的ListView、RecyclerView类似&#xff0c;滚动布局里面的每个子组件的样式往往是相同的&#xff0c;由于组件占用内存较大&#xff0c;所以在内存上我们可以缓存有限个组件&#xff0c;滚动…