脉冲神经网络:MATLAB实现脉冲神经网络(Spiking Neural Network,SNN) 用于图像分类(提供MATLAB代码)

一、脉冲神经网络

脉冲神经网络 (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%

四、完整MATLAB代码

  • 6
    点赞
  • 71
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
脉冲耦合神经网络spiking neural network, SNN)的图像特征提取在MATLAB中的实现如下: 首先,我们需要将图像转换为SNN可以处理的脉冲序列。这可以通过将每个像素的灰度值映射到一个脉冲发射率来实现,即: ``` spike_rate = grayscale_value / max_gray_value * max_spike_rate ``` 其中,`grayscale_value` 表示像素的灰度值,`max_gray_value` 表示灰度值的最大值,`max_spike_rate` 表示脉冲发射率的最大值。 接下来,我们可以使用SNN对这些脉冲进行处理,提取出图像的特征。这可以通过创建一个SNN模型,并使用该模型对输入脉冲进行处理来实现。下面是一个简单的SNN模型的代码示例: ``` % 设置SNN模型参数 num_inputs = size(input_spikes, 2); num_hidden = 10; num_outputs = 1; tau = 1; % 膜电位时间常数 th = 0.5; % 阈值 % 初始化SNN模型 v = zeros(num_hidden, 1); s = zeros(num_hidden, 1); w = rand(num_hidden, num_inputs); % 随机初始化输入层到隐藏层的权重 % 处理输入脉冲序列 for i = 1:size(input_spikes, 1) % 计算隐藏层神经元的膜电位和脉冲发射率 I = w * input_spikes(i, :)'; dv = (-v + I) / tau; v = v + dv; s(v >= th) = 1; v(v >= th) = 0; % 计算输出神经元的膜电位和脉冲发射率 output_spike_rate = sum(s) / num_hidden; output_voltage = output_spike_rate * tau; output_spikes(i) = output_voltage >= th; end % 提取特征 features = output_spikes(1:10:end); ``` 其中,`input_spikes` 表示输入脉冲序列,`output_spikes` 表示输出脉冲序列,`features` 表示提取出的特征。在此示例中,我们使用一个具有10个隐藏神经元和一个输出神经元的SNN模型来提取特征。在处理输入脉冲序列时,我们首先计算隐藏神经元的膜电位和脉冲发射率,然后计算输出神经元的膜电位和脉冲发射率,并将输出脉冲序列存储在 `output_spikes` 中。最后,我们从输出脉冲序列中提取特征,例如每隔10个脉冲取一个脉冲作为特征。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值