论文阅读-SEFRON: A New Spiking Neuron Model With Time-Varying Synaptic Efficacy Function

该博客介绍了神经元模型中的群体编码方法,通过计算发放强度和发放时间来处理输入数据。接着,初始化权重矩阵和阈值矩阵,并使用LIF神经元模型与STDP的监督学习算法进行训练。在训练过程中,根据发放时间和STDP原则更新权重,以优化神经网络的性能。博客提供了源代码链接,展示了整个过程的实现细节。
摘要由CSDN通过智能技术生成

1、数据编码
首先介绍一下该神经元模型论文里面提到的编码方式:群体编码(population encoding)
编码步骤:
1、计算发放强度(就是指发放的欲望有多大)
在这里插入图片描述
其中第h个接受域的μh和是中心和标准偏差,计算公式如下所示:
在这里插入图片描述
然后根据所计算得到的发放强度去计算发放时间:
在这里插入图片描述

def spiking_genersate(train_data):
    mu=par.mu       #中心
    sigma=par.sigma #偏离
    RF=par.RF       #接收域神经元总数  6
    feature=par.feature #特征,就是指输入维度的意思,所以这里他是4维的
    spike_time=np.zeros((int(train_data.shape[0]),par.feature*par.RF)) #训练样本数*24
    for num in range(train_data.shape[0]):
        fire_value=np.zeros(RF)     #是否发放?
        fire_strength=np.zeros((feature,RF))        #发放强度,不同维度对应
        for t in range(par.feature):
            for i in range(par.RF):
                fire_value[i]=np.exp(-np.power((train_data[num,t]-mu[i]),2)/(2*np.power(sigma,2)))      #这是计算发放强度 (1,6)
            fire_strength[t,:]=fire_value #(4,6)
        spike_time[num,:]=(np.round(par.T_pre*(1-fire_strength))+1).reshape((1,par.feature*par.RF))     #np.round()一般情况下是四舍五入取整,0的时候直接向下取整,ceil()和floor()函数是向下取整
        pyplot.plot(spike_time.T,'.k')
    return spike_time

源代码里面的输入:其中包括四个特征值和一个分类结果。
在这里插入图片描述
得到的发放强度(4,6)的矩阵
在这里插入图片描述
在这里插入图片描述
2、训练
编码完之后开始初始化权重矩阵和阈值矩阵。
1、创建权重矩阵和阈值矩阵大小,权重矩阵(24,301,3)中间的为时间。阈值矩阵大小为(1,3)
2、接下来是根据第一个第一个样本的数据给权重矩阵赋初值。
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

def weights_thershold_reload(train_data,train_label,weights,theta,fire_time):       #初始化阈值
    Output_size=0
    for i in range(train_data.shape[0]):
        temp = int(train_label[i]-1)
        if (theta[int(train_label[i]-1)]==0):   #用模式1的训练数据来初始化权重和θ
                Output_size = Output_size + 1
                weights[:, :, int(train_label[i]-1)] = np.multiply((gaussian_function(par.T_train, fire_time[i,:].transpose())).transpose(), do_uki((par.TID- fire_time[i,:]))[:, np.newaxis])  #timing-vary weigts,weight initial
                theta[int(train_label[i]-1)] = (np.matmul(do_uki((par.TID- fire_time[i,:]))[np.newaxis, :], LIF_e(par.TID - fire_time[i,:].transpose())[:, np.newaxis])).squeeze()     #theta initial
        if (Output_size == par.class_num):   
            break
    return weights,theta

接下来就是训练了,这里的神经元是LIF,算法是STDP的监督版本。
既然是监督学习,那就肯定有根据结果去改变权重的部分。接下来就介绍它是怎么改变权重的。

在这里插入图片描述
其中包括了计算突触后神经元发放时间,如下图所示。
在这里插入图片描述
接下来是利用STDP监督学习算法计算更新,先上理论:
1、计算归一化STDP
这是原始的STDP
在这里插入图片描述
计算完所有发放点的STDP后,对STDP进行归一化
在这里插入图片描述
然后计算文中说的是理想的发放时间
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
接下来是误差损失函数:
在这里插入图片描述
有了误差损失函数就可以计算delta_w
在这里插入图片描述
第一个值为学习率,
时变函数为:
在这里插入图片描述
最后更新权重:
在这里插入图片描述
在这里插入图片描述
完整代码:
源码下载地址:
https://download.csdn.net/download/weixin_43872912/85172793

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值