一、脉冲神经网络
脉冲神经网络 (Spiking Neural Network,SNN) ,是第三代神经网络。其旨在弥合神经科学和机器学习之间的差距,使用最拟合生物神经元机制的模型来进行计算,更接近生物神经元机制。脉冲神经网络与目前流行的神经网络和机器学习方法有着根本上的不同。SNN 使用脉冲——这是一种发生在时间点上的离散事件——而非常见的连续值。每个峰值由代表生物过程的微分方程表示出来,其中最重要的是神经元的膜电位。本质上,一旦神经元达到了某一电位,脉冲就会出现,随后达到电位的神经元会被重置。对此,最常见的模型是 Leaky Integrate-And-Fire (LIF) 模型。此外,SNN 通常是稀疏连接的,并会利用特殊的网络拓扑。
二、数据集简介
训练集共有十张光学字符图片构成分别是1,2,3,4,5,6,7,8,9,0。其对应类别可表示为:
1: 1 0 0 0 0 0 0 0 0 0
2: 0 1 0 0 0 0 0 0 0 0
3: 0 0 1 0 0 0 0 0 0 0
4: 0 0 0 1 0 0 0 0 0 0
5: 0 0 0 0 1 0 0 0 0 0
6: 0 0 0 0 0 1 0 0 0 0
7: 0 0 0 0 0 0 1 0 0 0
8: 0 0 0 0 0 0 0 1 0 0
9: 0 0 0 0 0 0 0 0 1 0
0: 0 0 0 0 0 0 0 0 0 1
原始图像(训练集):
将上述10个光学字符图像编码成时间脉冲:
含噪图像(测试集):
三、MATLAB实现
3.1部分代码如下:
代码链接:https://mbd.pub/o/bread/YpyUmJptTmax=30;%最大训练次数(可以自己修改)spiking = cell2mat(struct2cell(load('spiking.mat')));%已经为时间脉冲的10张图像label1 = 0;%标签1为不点火,若测试样本点火则调整权重label2 = 1;%标签2为点火,若测试样本点火则调整权重% 随机生成10组权重值 w1 = rand(1,400);w2 = rand(1,400);w3 = rand(1,400);w4 = rand(1,400);w5 = rand(1,400);w6 = rand(1,400);w7 = rand(1,400);w8 = rand(1,400);w9 = rand(1,400);w10 = rand(1,400);W = [w1; w2; w3; w4; w5; w6; w7; w8; w9; w10];%训练十个输出神经元识别image1~10,使对应序号神经元点火,其他不点火for k = 1 : 1 : Tmax fprintf('第%d次训练:\n',k);for i = 1 : 1 : 10 %10个输出神经元for j = 1 : 1 : 10 %10个脉冲时间序列 [val,maxT,maxU] = tempotron(spiking(j,:), W(i,:));if j == iif val == 0 %理应为1,但为0,与标签不符合,则需要更新权值W(i,:) = train(spiking(j,:), W(i,:), label2);[val,maxT,maxI] = tempotron(spiking(j,:),W(i,:));endelseif val == 1 %理应为0,但为1,与标签不符合,则需要更新权值W(i,:) = train(spiking(j,:), W(i,:), label1);[val,maxT,maxI] = tempotron(spiking(j,:),W(i,:));endendendend%% 预测结果CorrectRate=0;for i = 1 : 1 : 10 %10个输出神经元DataPre=zeros(1,10);%预测值fprintf('%d:\t',i);for j = 1 : 1 : 10 %10个脉冲时间序列[val,maxT,maxU] = tempotron(spiking(j,:), W(i,:));fprintf('%d\t',val);DataPre(j)=val;endfprintf('\n');%% 判断预测分类是否正确if (sum(DataPre)==1)if (find(DataPre==1)==i)CorrectRate=CorrectRate+1;%分类准确则加1endendendfprintf('正确率:%f:\n',CorrectRate/10);Curve(k)=CorrectRate/10;endsave W_new W;figureplot(Curve,'r-*')xlabel('训练次数')ylabel('准确率')
最大训练次数为30次,训练集上准确率随迭代次数的变化图如下:
可以看出SNN在训练集上准确率达到90%。
3.2测试集上的预测效果:
预测值为:
1: 1 0 0 0 0 0 0 0 0 0 (正确)
2: 0 1 0 0 0 0 1 0 0 0 (错误)
3: 0 0 1 0 0 0 0 0 0 0 (正确)
4: 0 0 0 1 0 0 0 0 0 0 (正确)
5: 0 0 0 0 1 0 0 0 0 0 (正确)
6: 0 0 0 0 0 1 0 0 0 0 (正确)
7: 0 0 0 0 0 0 1 0 0 0 (正确)
8: 0 0 0 1 0 0 0 1 0 0 (错误)
9: 0 0 0 0 0 0 0 0 1 0 (正确)
0: 0 0 0 0 0 0 0 0 0 1 (正确)
由此可以看出,SNN在测试集上的准确率为80%。
四、参考代码见博主微信朋友圈
代码链接:https://mbd.pub/o/bread/YpyUmJpt代码链接:https://mbd.pub/o/liang/work代码链接:/s/11I6eMyMU3k-UHfUu1O_mIA 提取码:1234
脉冲神经网络:MATLAB实现脉冲神经网络(Spiking Neural Network SNN) 用于图像分类(提供MATLAB代码)