有监督SNN网络——SLAYER Linux安装配置

SLAYER是来自NUS的成果,文章被收录到NeurIPS2018

原文链接
http://papers.nips.cc/paper/7415-slayer-spike-layer-error-reassignment-in-time.pdf

文章内容简述

由于SNN(spiking neural network) 中神经元模型发放的离散脉冲信号不可微,所以传统CNN的BP策略不再适用。文章主要贡献就是提出了一种新的可适用于SNN的BP算法来训练weights(突触权重)和axonal delays(轴突延时)。模型中使用的是Spike Response Model(SRM) 神经元模型。具体算法由于文章省略了部分细节导致没有彻底搞懂,等我把源码看完了再回来补一个算法细节的帖子吧:)

安装过程

环境要求

作者对硬件建议是这样写的

GPU hardware with cc 6.0 or higher.

我用的是 NVIDIA GeForce GTX 1050Ti 有点吃力

环境方面作者使用

  • CUDA 9.2
  • CUDNN 7.2
  • yaml-cpp 我是传送门(注意cmake的时候一定要选择 -DBUILD_SHARED_LIBS=ON 来动态编译)

安装

  1. CUDA和CUDNN的安装网上教程比较多,在这里就不再赘述了,要提醒大家的是一定要添加环境变量!!!
  2. YAML-CPP安装
    新建一个文件夹YAML-CPP-installer打开终端输入下面代码
git clone https://github.com/jbeder/yaml-cpp.git
cd yaml-cpp
mkdir build
cd build
cmake -DBUILD_SHARED_LIBS=ON ..		//默认安装目录为 /usr/local
make -j4
sudo make install -j4

注意安装完成后要把YAML的动态链接库添加到缓存,否则编译时一直找不到!!!!
下面是添加方法

cd /etc/ld.so.conf.d		//打开动态链接库目录
sudo touch local.conf		//新建一个链接库目录
sudo gedit local.conf		//打开这个目录,打开以后文件中加入动态链接库地址后保存退出。默认安装在 /usr/local 所以该文件中填写 /usr/local/lib
sudo ldconfig				
ldconfig -p					//查看动态链接库,出现下图结果即为成功

添加动态链接库结果:
有监督SNN网络——SLAYER Linux安装配置_第1张图片

  1. 框架安装
    首先下载源码
	git clone https://bitbucket.org/bamsumit/slayer/src.git

但是我试了一下特别慢所以在Windows下下载了bitbucket本地环境再下载的。

  • CPP版本安装
    下载完成后到slayerCPP文件夹下修改makefile中CUDA和YAML的安装路径。如果是默认安装的话应为:
CUDA_PATH := /usr/local/cuda
YAML_PATH := /usr/local

然后直接make就好啦

  • MATLAB版本安装
    作者给MATLAB版本写了很多适配的文件处理代码且用起来更加直观,所以建议安装MATLAB版本。(我自己把两个版本都装了一下,大家可以也自己对比一下)

开始安装,首先打开MATLAB(我用的2016b),路径找到slayerMEX文件夹下,这里需要用到mex编译器,正常情况下应该已经预装了。在MATLAB命令行输入mex -setup然后根据提示选择C++的编译器。
打开同文件夹下的nvmex.m修改CUDA和YAML安装路径,路径内容同CPP版本。修改后在MATLAB命令行中输入

nvmex('spikeLearn.cu')
nvmex('spikerun.cu')

分别编译学习和测试部分代码。

至此整个框架就全部编译完成啦。下面我们跑一下作者提供的example,是对M-MNIST数据集的部分数据进行训练和测试。

测试

进入example文件夹,解压数据NMNISTsmall.zip

unzip NMNISTsmall.zip

其中:

  • 1.bs21000.bs2是训练数据。
  • 60001.bs260100.bs2是测试集。
  • Desired_10_60是定义末层神经元期望脉冲发放数量的文件,在这个数据集中定义正确的结果发放60脉冲,错误结果发放10脉冲。
  • train1K.txt指定了训练数据的标签。
  • test100.txt指定了测试数据的标签。

需要指出的是框架的逻辑必须把所有数据放在同一个文件夹下,也就是说像MINIST这样把每一类数据放在一个子文件夹下的数据必须混在一起才能用,而且是训练集和测试集混用。个人认为这种代码逻辑不利于数据处理,不过和作者联系后确认确实写框架的时候没有别的数据提取逻辑,现在只能这样用。不过作者也表示会想办法写一个数据处理脚本来解决这一问题。当然,我自己写了一套数据处理的代码,接下来在介绍怎么用框架训练新的数据集的时候顺便公开。

然后在MATLAB中打开exampleTrain.m适当修改一下snn.maxIter来调整最大训练次数直接运行即可。此处最大训练次数应远大于训练集样本数,自己做训练集训练时注意要把训练集顺序打乱,否则会训练集中到某个样本上导致最终效果不佳。 训练结果会保存在代码同文件夹下OutFiles文件夹中,不过不会自动生成这个文件夹,所以需要自己提前建一个名为OutFiles的文件夹。

结果

有监督SNN网络——SLAYER Linux安装配置_第2张图片
有监督SNN网络——SLAYER Linux安装配置_第3张图片
运行exampleRun.m可以用训练好的参数来测试测试集中数据并画出统计直方图。不过代码默认使用作者训练好的模型,如果想用自己刚训练好的模型需要将代码开头的载入注释掉。

% load('exampleNetwork.mat')

有监督SNN网络——SLAYER Linux安装配置_第4张图片
这是我训练2000次结果

你可能感兴趣的:(SNN系列)