Shikhar Gupta的SNN解决手写体识别

Shikhar Gupta的SNN解决手写体识别
首先他这个算法是基于LIF(泄露整合发放神经元模型)神经元的一个神经网络。
Shikhar Gupta的SNN解决手写体识别_第1张图片
从这张图中你可以很清晰的看出,他在每一次接受脉冲以后都会有一个短暂的下降,这是因为电流在泄露。
1、 感受野
这里用到感受野的作用就是在模拟人眼,可以做个试验,大家将人眼定睛在某一个点的时候,会有一个范围的视野,但是在视野范围中的物体的清晰程度就是以你定睛物体为中心,越来越不清晰的。所以在这里用了一个感受野矩阵与输入图像进行卷积。
Shikhar Gupta的SNN解决手写体识别_第2张图片
其中sca1 = 0.625,sca2=0.125,sca3=-0.125,sca4=-0.5.影响程度依次递减。
Shikhar Gupta的SNN解决手写体识别_第3张图片
Shikhar Gupta的SNN解决手写体识别_第4张图片
2、 编码
既然是脉冲神经网络,免不了要对图像进行编码。编码方式有频率编码、时序编码以及高斯感受野编码等,在这里使用的是频率编码。
首先输入的是进行感受野卷积处理之后的图片,然后然后将该图上的数据范围映射到(1,20)上去,之后进行频率编码。如果大家是刚开始学习snn的人,那我想可能刚开始都跟我一样不知道频率编码是什么,那我这里就简单介绍一下在这个算法里面他是怎么进行频率编码的。
思路:就是将pot矩阵中的数据映射到【1,20】之间记为freq,然后用600/freq记为freq1,然后如果原pot矩阵中>0就对一个200个数据的temp数组进行编码,将temp数组里面的索引为freq1的倍数的全置为1.pot数组里面的每一个数都对应一个temp数组。pot是2020的数组,原图像是2828的,进行感受野之后变成了2020的。所以最后输出的train矩阵为400201的。
Shikhar Gupta的SNN解决手写体识别_第5张图片
3、 取阈值、每一次的泄露数据
这个阈值就是决定脉冲神经元什么时候发放的阈值。在这里它就是取train数组中每一行的总值里面的最大值的1/3作为阈值。
泄露数据为0.15。
4、 STDP学习规则
STDP算法公式
a+和a-的区别在于一个是突触前神经元先于突触后神经元发放,一个是突出前神经元晚于突触后神经元发放。这个a+和a-分别是两种状态的学习率,Wij则是两个突触之间的权重信息。
在这个算法里面他的突触矩阵是赋值[0,0.4]之间的随机数。
思路:用上述的编码方式将输入的图像编码成脉冲,然后对所获得的脉冲进行学习。
首先train矩阵是一个400*201的矩阵,400是图像的像素值,而201是T时间+1,其实就是记录的是某一时刻,我的理解是这样。
下面这个公式就是计算神经元脉冲的时候,因为这一层是输出层,而这个代码是一个利用LIF神经元进行三分类的代码,所以他这里使用的是3个神经元。
电位值更新

如果当前电位值大于静息电位就开始泄露,三个神经元都收到前层的脉冲之后,就比较谁的电位值更高,最高的那个如果达到阈值,就开始发放,另外两个就算到达阈值也不发放。
Shikhar Gupta的SNN解决手写体识别_第6张图片
最后一部分是更新权重的,这里用到的学习算法就是上述公式的STDP算法,作者用了一个更新权重的窗口,如果该神经元脉冲阈值大于阈值,就开始依据STDP算法更新权重。如果这个神经元没有发放。如果某一时刻所有的脉冲全为0,就把该时刻突触减小0.06,如果该时刻突触小于权重最小值了,那就把它设置为最小值。
Shikhar Gupta的SNN解决手写体识别_第7张图片
Shikhar Gupta的SNN解决手写体识别_第8张图片
Shikhar Gupta的SNN解决手写体识别_第9张图片

你可能感兴趣的:(Shikhar Gupta的SNN解决手写体识别)