SNN系列|编码篇(2)时序编码

Tempotral Coding

选择编码方法是要根据编码对象以及模型如何处理编码信息进行选择,如下是一种时序信息的编码对比:

Threshold-based encoding

又称为tempotral contrast,该方法可以用于编解码一段序列,当差值超过阈值时发放脉冲,阈值是根据编码的序列自适应变化的。

使用该编码方法时,实值序列最好是沿时间变化的,因为在根据差分决定是否发放脉冲后,脉冲的顺序与差分顺序有关。

Time-to-first spike coding

该编码方法将信息用神经元首次脉冲的发放时间来表示,假设神经元只产生一个脉冲,产生脉冲后神经元处于抑制状态直到下一个刺激到来,产生脉冲的时刻与模拟量的值成正比,这表明,在接收刺激后产生的第一个脉冲的时间包含了刺激的所有信息。

使用该编码方法的理论是有学者认为,大脑没有时间在每个进程中处理一个以上的脉冲,该方法能够解释视觉刺激快速编码与处理,但是由于每个神经元只能发放一个脉冲,限制了神经元的计算能力。

(对刺激强度进行解读的话,可以与注意力机制结合,将刺激强度与显著性结合而不是仅仅与像素强度。)

一种可行的方案是余弦平方时间编码
F i j = T cos ⁡ 2 ( p i j p m a x ) F_{ij} = T\cos ^2(\frac{p_{ij}}{p_{max}}) Fij=Tcos2(pmaxpij)

在此基础上,可以加上延迟差异,针对感受野距离设置延迟时间。

Rank order Coding

信息通过神经元之间发放脉冲的相对次序进行编码,而抛弃精确的时间信息,因为这样更容易实现。比如使用6个神经元进行编码, C > E > D > A > B C>E>D>A>B C>E>D>A>B

使用N个神经元进行编码,其信息容量为 log ⁡ 2 ( N ! ) \log_2(N!) log2(N!)

Population Rank Order Coding

详见GRF。

单个输入变量被编码成多个神经元的脉冲序列,这些神经元具有重叠的高斯感受野,按照其对应的值的大小决定脉冲发放顺序,值越大,脉冲发放时间越早。

Latency Coding

神经元发放脉冲的特性是脉冲的形式是固定的,只有数量和时间上的区别,接受越强的刺激,脉冲生成得越早,因此,可以使用单调递减函数将实值强度与脉冲发放时间的早晚相结合。

使用N个神经元在T时间内编码,其信息容量为 log ⁡ 2 ( T N ) \log_2(T^N) log2(TN)

Phase Coding

相位编码的一般思路是,在大脑区域(例如theta(4-8Hz)或γ(40-80Hz)频带)内会发生一些背景振荡,并且各个神经元的尖峰时间相对于背景种群振荡编码某种类型的信息。

相位编码的最著名示例是海马体中的“相位进动”。大鼠海马中有神经元,称为“位置细胞”,仅在动物靠近特定的熟悉位置时才会发射。这些位置细胞的神经尖峰相对于海马背景theta振荡的时机编码了动物与该位置的物理距离。

脉冲相位编码的思想可以用于随时间变化的模拟量的编码,一个时间周期内的模拟量的值可以用一个脉冲时间表示,将所有时间周期连接起来得到的脉冲序列就可以表示整个时间过程中模拟量的变化。

Latency Phase Coding

见latency phase coding总结

BSA

使用有限脉冲响应滤波器,因此适合编码高频信号(待日后详看)

Step Forward Encoding

类似于threshold-based编码,设给定信号序列 S ( t ) S(t) S(t),定义基准 B ( t ) B(t) B(t),并令 B ( 1 ) = S ( 1 ) B(1)=S(1) B(1)=S(1),如果 S ( t 1 ) > B ( t 1 − 1 ) + T h S(t_1)>B(t_1-1)+ Th S(t1)>B(t11)+Th,则发放正脉冲,并且 B ( t 1 ) = B ( t 1 − 1 ) + T h B(t_1)=B(t_1-1)+Th B(t1)=B(t11)+Th;如果 S ( t 1 ) < B ( t 1 − 1 ) − T h S(t_1)<B(t_1-1)- Th S(t1)<B(t11)Th,则发放负脉冲,并且 B ( t 1 ) = B ( t 1 − 1 ) − T h B(t_1)=B(t_1-1)-Th B(t1)=B(t11)Th,其他情况不发放脉冲,且 B ( t 1 ) = B ( t 1 − 1 ) B(t_1) = B(t_1-1) B(t1)=B(t11)

Moving Window Spike Encoding

对上述方法的改进为 B ( t ) B(t) B(t)定义为过去时间窗口T内的信号强度的均值。

  • 7
    点赞
  • 68
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
SNN(Spiking Neural Networks)目标检测是一种模仿生物神经网络的脉冲神经网络(Spiking Neural Networks)进行目标检测的方法。与传统的卷积神经网络(CNN)不同,SNN在时间域内工作,通过模拟神经元产生的脉冲(即动作电位)来处理信息,从而能够处理时序信息。 在编写SNN目标检测代码时,通常会使用专门的神经网络框架,比如PyNN、Brian、NEST等,这些框架提供了模拟生物神经网络的工具。不过,由于SNN在深度学习中的应用尚不如CNN广泛,所以相关的深度学习库可能不会直接提供SNN模型的实现。 一个简单的SNN目标检测的代码框架可能包括以下步骤: 1. 初始化神经元和网络结构:定义脉冲神经元,设置网络中的层,包括输入层、隐藏层和输出层等。 2. 神经元模型参数设置:配置神经元的参数,例如阈值、膜电位、脉冲发放机制等。 3. 输入数据预处理:将图像数据转换为适合SNN处理的格式,可能涉及到数据的编码过程,比如脉冲编码。 4. 网络训练与学习规则:在训练过程中,需要实现一种学习规则,如时间依赖的可塑性(STDP),以更新神经元之间的连接权重。 5. 目标检测与后处理:运行网络并进行脉冲解码,以识别和定位图像中的目标。 下面是一个非实际代码的伪代码示例,用于展示SNN目标检测的大致流程: ```python # 引入必要的库和模块 import snn_framework as snn # 初始化网络参数 network_params = { 'neuron_type': 'IF', # 使用的神经元模型,例如积分-发放模型(Integrate-and-Fire) 'num神经元': 1000, # 网络中神经元的数量 # 其他参数... } # 创建网络结构 network = snn.Network(network_params) # 加载数据并进行预处理 images, labels = snn.load_and_preprocess_data('dataset_path') # 训练网络 for epoch in range(num_epochs): for image, label in zip(images, labels): # 将图像编码为脉冲信号 encoded_image = snn.encode_image(image) # 运行网络 network.forward(encoded_image) # 更新网络权重 network.learn() # 测试网络并进行目标检测 for test_image in test_images: # 同样将图像编码为脉冲信号 encoded_test_image = snn.encode_image(test_image) # 运行网络进行检测 network.forward(encoded_test_image) # 解码网络输出以识别目标 detections = snn.decode_output(network.get_output()) # 输出检测结果 print(detections)
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值