一、脉冲神经网络
脉冲神经网络 (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部分代码如下:
Tmax=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 == i
if val == 0 %理应为1,但为0,与标签不符合,则需要更新权值
W(i,:) = train(spiking(j,:), W(i,:), label2);
[val,maxT,maxI] = tempotron(spiking(j,:),W(i,:));
end
else
if val == 1 %理应为0,但为1,与标签不符合,则需要更新权值
W(i,:) = train(spiking(j,:), W(i,:), label1);
[val,maxT,maxI] = tempotron(spiking(j,:),W(i,:));
end
end
end
end
%% 预测结果
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;
end
fprintf('\n');
%% 判断预测分类是否正确
if (sum(DataPre)==1)
if (find(DataPre==1)==i)
CorrectRate=CorrectRate+1;%分类准确则加1
end
end
end
fprintf('正确率:%f:\n',CorrectRate/10);
Curve(k)=CorrectRate/10;
end
save W_new W;
figure
plot(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%。