SpikingFlow.encoding package¶
Module contents¶
-
class
SpikingFlow.encoding.
BaseEncoder
[源代码]¶ 基类:
torch.nn.modules.module.Module
所有编码器的基类
编码器将输入数据(例如图像)编码为脉冲数据
-
forward
(x)[源代码]¶ - 参数
x – 要编码的数据
- 返回
编码后的脉冲,或者是None
将x编码为脉冲。少数编码器(例如ConstantEncoder)可以将x编码成时长为1个dt的脉冲,在这种情况下,本函数返回编码后的脉冲
多数编码器(例如PeriodicEncoder),都是把x编码成时长为n个dt的脉冲out_spike,out_spike.shape=[n, *]
因此编码一次后,需要调用n次step()函数才能将脉冲全部发放完毕
第index调用step()会得到out_spike[index]
-
training
: bool¶
-
-
class
SpikingFlow.encoding.
ConstantEncoder
[源代码]¶ 基类:
SpikingFlow.encoding.BaseEncoder
将输入简单转化为脉冲,输入中大于0的位置输出1,其他位置输出0
-
training
: bool¶
-
-
class
SpikingFlow.encoding.
PeriodicEncoder
(out_spike)[源代码]¶ 基类:
SpikingFlow.encoding.BaseEncoder
- 参数
out_spike – shape=[T, *],PeriodicEncoder会不断的输出out_spike[0], out_spike[1], …, out_spike[T-1], out_spike[0], out_spike[1], …
给定out_spike后,周期性的输出out_spike[0], out_spike[1], …, out_spike[T-1]的编码器
-
set_out_spike
(out_spike)[源代码]¶ - 参数
out_spike – 新设定的out_spike,必须是torch.bool
- 返回
None
重新设定编码器的输出脉冲self.out_spike为out_spike
-
training
: bool¶
-
class
SpikingFlow.encoding.
LatencyEncoder
(max_spike_time, function_type='linear', device='cpu')[源代码]¶ 基类:
SpikingFlow.encoding.BaseEncoder
- 参数
max_spike_time – 最晚(最大)脉冲发放时间
function_type – ‘linear’或’log’
device – 数据所在设备
延迟编码,刺激强度越大,脉冲发放越早。要求刺激强度已经被归一化到[0, 1]
脉冲发放时间 \(t_i\) 与刺激强度 \(x_i\) 满足
- type=’linear’
- \[t_i = (t_{max} - 1) * (1 - x_i)\]
- type=’log’
- \[t_i = (t_{max} - 1) - ln(alpha * x_i + 1)\]
\(alpha\) 满足
\[(t_{max} - 1) - ln(alpha * 1 + 1) = 0\]这导致此编码器很容易发生溢出,因为
\[alpha = exp(t_{max} - 1) - 1\]当 \(t_{max}\) 较大时 \(alpha\) 极大
示例代码
x = torch.rand(size=[3, 2]) max_spike_time = 20 le = encoding.LatencyEncoder(max_spike_time) le(x) print(x) print(le.spike_time) for i in range(max_spike_time): print(le.step())
-
forward
(x)[源代码]¶ - 参数
x – 要编码的数据,任意形状的tensor,要求x的数据范围必须在[0, 1]
将输入数据x编码为max_spike_time个时刻的max_spike_time个脉冲
-
training
: bool¶
-
class
SpikingFlow.encoding.
PoissonEncoder
[源代码]¶ 基类:
SpikingFlow.encoding.BaseEncoder
泊松频率编码,输出脉冲可以看作是泊松流,发放脉冲的概率即为刺激强度,要求刺激强度已经被归一化到[0, 1]
示例代码
pe = encoding.PoissonEncoder() x = torch.rand(size=[8]) print(x) for i in range(10): print(pe(x))
-
training
: bool¶
-
-
class
SpikingFlow.encoding.
GaussianTuningCurveEncoder
(x_min, x_max, tuning_curve_num, max_spike_time, device='cpu')[源代码]¶ 基类:
SpikingFlow.encoding.BaseEncoder
- 参数
x_min – float,或者是shape=[M]的tensor,表示M个特征的最小值
x_max – float,或者是shape=[M]的tensor,表示M个特征的最大值
tuning_curve_num – 编码每个特征使用的高斯函数(调谐曲线)数量
max_spike_time – 最大脉冲发放时间,所有数据都会被编码到[0, max_spike_time - 1]范围内的脉冲发放时间
device – 数据所在设备
Bohte S M, Kok J N, La Poutre H. Error-backpropagation in temporally encoded networks of spiking neurons[J]. Neurocomputing, 2002, 48(1-4): 17-37.
高斯调谐曲线编码,一种时域编码方法
首先生成tuning_curve_num个高斯函数,这些高斯函数的对称轴在数据范围内均匀排列 对于每一个输入x,计算tuning_curve_num个高斯函数的值,使用这些函数值线性地生成tuning_curve_num个脉冲发放时间
待编码向量是M维tensor,也就是有M个特征
1个M维tensor会被编码成shape=[M, tuning_curve_num]的tensor,表示M * tuning_curve_num个神经元的脉冲发放时间
需要注意的是,编码一次数据,经过max_spike_time步仿真,才能进行下一次的编码
示例代码
x = torch.rand(size=[3, 2]) tuning_curve_num = 10 max_spike_time = 20 ge = encoding.GaussianTuningCurveEncoder(x.min(0)[0], x.max(0)[0], tuning_curve_num=tuning_curve_num, max_spike_time=max_spike_time) ge(x) for i in range(max_spike_time): print(ge.step())
-
training
: bool¶