SNN介绍-来自脉冲神经网络原理

    神经科学的一些实验证据表明,视觉与听觉等许多生物神经系统都采用神经元发放的动作电位(即脉冲)的时间来编码信息。针对这些问题,更加符合生物神经系统实际情况的第三代人工神经网络模型--脉冲神经网络应运而生。脉冲神经网络使用时间编码的方式进行信息传递与处理,直接利用神经元的脉冲发放时间作为网络模型的输入与输出,从而实现信息的高效处理。

    脉冲神经网络的拓扑结构分为前馈型脉冲神经网络,递归型脉冲神经网络和混合型脉冲神经网络,我们在这里只简要介绍前馈型脉冲神经网络,对于他的模型有大致的了解。神经元的样式这里不再介绍,可能读者在其他很多文章都有见过。在多层前馈脉冲神经网络中,网络中的神经元是分层排列的,每个神经元只与前一层的神经元相连接。和CNN类似,也分为输入层,中间层(隐含层,多个),输出层。输入层各神经元的脉冲序列表示对具体问题输入数据的编码,并将其输入脉冲神经网络的下一层。最后一层为输出层,该层各神经元输出的脉冲序列构成构成网络的输出。如下图所示:

    接下来介绍脉冲神经网络当中单个神经元的数学模型,模拟单个神经元的发放电情况。生物神经元的离子是传递电信号的重要媒介,电信号的产生是由于细胞膜两侧的离子发生流动而形成了浓度差,从而导致细胞膜内外电位差,通过研究神经元膜电位和离子电导变化的关系,给出了描述神经元兴奋的微分方程组。由此产生的生物可解释性的生理模型包括(具体的等效电路图和推导可自行详细了解): Hodgkin-Huxley神经元模型,Morris-Lecar神经元模型,FitzHugh-Nagumo神经元模型,Hindmarsh-Rose神经元模型,Izhikevich神经元模型,Integrate-and-Fire神经元模型等。其中HH模型精确度高,但运算量大。LIF模型运算量小,但牺牲了精确度。Izhikevich模型结合了两者的优势,生物精确性接近HH模型,运算复杂度接近LIF模型。

Izhikevich给出了如下所示的而为脉冲神经元模型:

 如果神经元的膜电位V >= 30mV, 辅助的复位机制为:

    式中,V表示膜电位, U表示恢复变量 ,用来代替生理模型中激活的K+电流和失活的Na+电流,实现对膜电位V的负反馈。

    Izhikevich神经元模型中的参数a,b,c,d是无量纲参数,随着a,b,c,d取值的变化,神经元模型可以表现出丰富的脉冲发放模式, 参数a表示恢复变量U的时间尺度,a的值越小,表示恢复得越慢;参数b表示恢复变量U依赖于膜电位V得阈值下随机波动得敏感程度,参数c表示神经元发放脉冲后膜电位V得复位值;参数d表示神经元发放脉冲后,恢复变量U的复位值。各个参数的意义如下图:

     选取合适的神经元模型后,再参考人的识别流程图,即可组建自己的模型进行具体的图片识别或者分类操作。

参考:

1.脉冲神经网络原理

2.最后一张各参数意义的图来自:SNN系列|神经元模型篇(2) Izhikevich_Tianlong Lee的博客-优快云博客_izhikevich模型

### 使用SNN处理事件驱动图像数据的方法 #### 将连续值深度网络转换为高效事件驱动网络 为了使传统的人工神经网络(ANN)能够适应于脉冲神经网络(SNN),需要通过特定的技术手段完成这一转变。对于基于事件的视觉传感器产生的稀疏、异步的数据,可以利用高效的算法将其映射至SNN结构之中[^1]。 #### 对静态图片进行时间维度扩展 针对MNIST这类原本属于静态形式的图像资料,在应用于SNN之前需先对其进行预处理操作。具体而言就是把单帧的画面重复若干次形成一段短片序列;之后依据各像素强度所对应的概率分布——通常是伯努利分布——随机决定该位置是否发射脉冲信号[^2]。 #### 利用snntorch库实现数据转化 借助专门设计用于支持SNN开发工作的Python工具包`snntorch`,开发者可以获得便捷的方式来准备输入给模型使用的脉冲序列。此过程涉及到了定义合适的时间窗口长度以及调整其他参数以确保最终得到的结果既保留了原始信息又适合后续计算需求[^3]。 ```python import snntorch as snn from torchvision import datasets, transforms from torch.utils.data import DataLoader # 加载并预处理 MNIST 数据集 transform = transforms.Compose([ transforms.ToTensor(), ]) train_dataset = datasets.MNIST(root='./data', train=True, download=True, transform=transform) test_dataset = datasets.MNIST(root='./data', train=False, download=True, transform=transform) train_loader = DataLoader(train_dataset, batch_size=64, shuffle=True) test_loader = DataLoader(test_dataset, batch_size=64, shuffle=False) # 定义速率编码器函数 def rate_coding(image_tensor, num_steps): spike_train = [] for t in range(num_steps): spikes = (image_tensor > torch.rand_like(image_tensor)).float() spike_train.append(spikes.unsqueeze(0)) return torch.cat(spike_train, dim=0) num_timesteps = 50 # 设定模拟周期数 for data, target in train_loader: encoded_data = rate_coding(data.squeeze(), num_timesteps) break # 只取一批样本做演示用途 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值