Building and training a deep spiking neural network for ECG classification
-
提出一种有效的方法来构建和训练用于ECG分类的深度SNN,方法是构建深度ANN的对应结构,转移训练的参数,并将激活函数替换为泄漏的积分和激发(LIF)神经元。结果表明,深度SNN的精度甚至超过了原来的ANN。
-
传统ECG分类机器学习方法:SVM LDA
-
在本文中,旨在提出一种有效的方法来构建和训练用于ECG分类的深度SNN。首先为心电图分类任务构建和训练深度ANN ,以通过卷积和池化操作捕获心电图特征。然后,设置了一个由与 ANN 层对应的卷积层和池化层组成的深度 SNN,并将训练的参数从 ANN 传输到 SNN。通过这种方式,我们避免了直接训练SNN的难度。最后,为了模拟尖峰神经元,我们对数据进行泊松分布尖峰编码,以生成输入尖峰序列,进行模拟实验并评估性能。
-
本文的主要贡献如下:构建并训练了一个用于心电图分类的14层深度SNN模型,这是迄今为止用于心电图相关任务的最深的SNN模型。比较并讨论了不同激活函数对ANN到SNN转换的影响。实验表明,采用ReLU激活函数的ANN变换SNN的准确率达到84.41%,在具有不同激活函数的模型中是最高的。精度与原始 ANN 模型的性能相当(即使 0.35更高)。
-
2017年PhysioNet/Computing in Cardiology Challenge的ECG分类ANN模型
-
配置 ANN 后,我们设置了一个具有相同基本结构的 SNN。SNN 包含与 ANN 的卷积层、池化层和完全连接层对应的层,但没有丢弃层和批量规范化层。为了接收两种类型层的效果,我们应用参数归一化将每个丢弃层和每个批处理归一化层合并到附近的卷积层中。
-
在对 ANN 进行良好训练后,我们将卷积层和池化层的参数传递给 SNN。除了基本结构外, ANN的激活功能全部替换为LIF神经元,如图1所示。我们不仅测试 ReLU,还测试其他类型的激活函数。
-
最后,应用泊松分布式尖峰编码和时钟驱动仿真方法,利用SNN实现心电图分类。泊松分布式尖峰编码是将输入信号转换为尖峰序列。它是一种基于速率的编码方法,具有较大的输入值,对应于给定时间窗口中的更多峰值,并且计算符合 Poission 分布。**时钟驱动的仿真方法与事件驱动的仿真方法相对,前者在每个时间步长上更新神经元状态,而后者在峰值到达时更新神经元状态。**在时钟驱动方法下,每个神经元等待特定的时间步长来积累输入尖峰,整个网络建立神经连接所花费的时间步数称为模拟持续时间。我们测试了不同长度的仿真持续时间,以找到合适的仿真时间,以便SNN实现与ReLU的原始ANN相似的分类性能,并将相同的仿真时间应用于所有传输的模型。
-
数据集:The dataset of the study is from the 2017 PhysioNet/CinC Challenge。
数据增强的方法:
在本文中,通过添加高斯白噪声来实现数据增强,并使用噪声系数来控制添加的噪声。 -
采用一维卷积运算来提取ECG信号的特征,因为已经证明一维CNN(1D-CNN)在时间序列分析中表现良好[26]。此外,一些研究表明,SNN可以调整卷积操作,而不会影响ANN到SNN的转换 1*1的卷积核 降维和升维的妙用
-
一维卷积通常用于序列模型中,所以在自然语言处理中,通常使用的是一维卷积。1、升维和降维,通常将一维卷积当做全连接使用 2、加入非线性。卷积层之后经过激励层,11 的卷积在前一层的学习表示上添加了非线性激励( non-linear activation ),提升网络的表达能力;3、跨通道信息交互(channal 的变换)第一点说的升维和降维通常是通道间的变换,33,64channels 的卷积核前面添加一个 11,28channels 的卷积核,就变成了 33,28channels 的卷积核,原来的 64 个 channels 就可以理解为跨通道线性组合变成了 28channels,这就是通道间的信息交互。
-
Bodo等人指出,Max Pooling对于尖峰神经元来说并非易事。最大池化在 ANN 中只需要一层,但在 SNN 中需要两层。因此,SNN中需要更多的神经元,导致额外的复杂性和准确性的损失。为了解决这个问题,使用平均池而不是最大池。
-
使用四种ReLU,Leaky ReLU,SELU,GELU进行训练,当输入值较小时,ELU具有软饱和度,这提高了对噪声的鲁棒性,而SELU是自规范化的,可用于训练多层深度网络,因为使用SELU学习非常健壮。高斯误差线性单位(GELU)将随机正则化的思想引入激活。GELU通过其值非线性加权输入,而不是像ReLU [18]中那样通过其符号输入门。它在直观上与生物神经元的自然反应一致,并且使用GELU比使用ReLU或ELU获得更好的实验结果是标准高斯累积分布函数。。GELU激活函数的公式如下:其中是标准的高斯累积分布函数。
-
我们将参数转移到前面的卷积层。下面的方程显示了批归一化层中的参数(α、β、μ和σ)如何被集成到卷积层的权重和偏差中,这已被证明是一个经验无损操作[37]。在下面的方程中,W和b表示原始卷积层的权重和偏差,而W‘和b’表示新卷积层的包含批标准化信息的权重和偏差。
-
首先训练一个深度 ANN,损失函数是交叉熵损失,优化器是 Adam 优化器,学习速率设置为 0.0001。 当验证集的准确性开始下降时,通过反向传播进行的模型训练停止。训练epochs为 80。训练深度 ANN 后,我们将网络的参数传输到具有相同基本结构的深度 SNN。通过这种方式,我们获得了一个深度SNN,其中包含经过训练以理解ECG的神经元。为了证明ANN到SNN转换的有效性,我们在同一训练数据集上模拟SNN。采用泊松分布尖峰编码和时钟驱动仿真方法建立峰值网络。在T时间步长之后,每个神经元从输出层的放电频率等于N除以T,其中N是从神经元释放的尖峰数。最后,我们从效率和准确性方面探索ECG分类任务的适当仿真时间,并将仿真时间步长T设置为1000。
-
在本研究中,ANN是使用Python(版本3.6.1),PyTorch(版本1.9)和CUDA(版本11.1)实现和训练的。PyTorch提供了一个GPU加速的,基于数组的编程模型,可以通过集成到Python生态系统中的自动差异化来区分。对于SNN,利用SpikingJelly,这是一个开源框架,可以完成从ANN到SNN的转换。SpikingJelly使用PyTorch作为自动区分后端,包括C++和CUDA扩展以增强性能,并支持CPU和GPU。使用SpikingJelly框架,我们基于ANN构建SNN,并使用时钟驱动的方法对其进行模拟。模拟硬件设置是英特尔®酷睿(TM)i7-9700F CPU,32 GB RAM和NVIDIA GeForce RTX 2080Ti显卡。
-
除了整体性能之外,我们发现使用ReLU比在NORMAL,AF和其他类中使用非ReLU激活函数具有更好的性能。对于 NOISE 类,使用 ReLU 函数的性能不如使用 Leaky ReLU。这可能是因为当x小于零时,Leaky ReLU函数提供微小的负激活值,并且噪声输入为系统带来了动态,从而修补了由微小的负值引起的ANN和SNN之间的差异。
尽管使用 ReLU 的性能并不总是各种指标的最佳性能,但它在模型转换之前和之后都显示出稳定性。如表 2、表 5 所示,在大多数性能指标中,使用 SELU 的性能不如使用其他激活函数。这与我们的假设一致,即负激活值会导致传输的 SNN 性能较差。SELU函数对于任何小于零的输入都有一个相对较大的负激活值,因此原始ANN中的许多神经元可能通过传播输出负值,其行为与SNN中不产生负输出的神经元不同。因此,使用 SELU 可能会使传输的 SNN 的性能比使用其他激活函数更差。 -
我们的工作仍然有一些局限性,以至于我们无法实现最大池化,并且与现有作品相比,我们无法获得最高的分类准确性。在未来的研究中,我们需要找到在SNN中实现最大池化层的解决方案,并探索更多的网络结构进行转换,以提高ECG分类的准确性。