52matlab技术网站,matlab教程,matlab安装教程,matlab下载

标题: 卷积神经网络对时序信号的分类预测 [打印本页]

作者: matlab的旋律    时间: 2018-9-10 09:43
标题: 卷积神经网络对时序信号的分类预测
本帖最后由 matlab的旋律 于 2019-3-5 01:02 编辑

       人工智能、机器学习和深度学习是当前非常热门的话题,仅在学术界有很多论文,在工业界也有许多的实际运用。在网上很容易找到概念,但是实际中人们又很容易将其混淆。通常来说,三者的关系可以归纳为:人工智能包含机器学习,机器学习包含深度学习,如下面的图所示:
[attach]238[/attach]
图1 人工智能、机器学习和深度学习的关系图

       上面图示深度学习是机器学习分支的概念非常重要,它继承了机器学习依赖模型自身获得参数的优点,同时它又超越了传统机器学习人工提取特征的限制,能够在大数据中进行自学习提取特征。但它同所有机器学习一样受限于训练数据和输入数据不同的问题。
       本文要用到的卷积神经网络(ConvolutionalNeural Network,CNN),主要包含卷积技术以及深度神经网络。区别传统的机器学习, 卷积神经网络将特征提取器与机器学习有机的结合了起来。
       卷积神经网络处理的数据形式,具有局部与整体的关系,并且由低层次特征组合可以形成高层次的特征,还能得到不同特征间的空间相关性。图像信息具有典型性,因此当前的卷积神经网络技术主要应用在机器视觉领域。其实, 这种局部与整体的关系也可以看作是不同的频率信息构建的特征,许多序列信号也具有这样的特征,以人体信号为例,处于不同频段和幅度的PQRST波构成了ECG信号,而波形的变化也与对应的病征具有很强的关联性。因此,使用CNN对以ECG为代表的时序信号进行处理也是可行的。
      有关CNN的原理、特点以及在机器视觉领域的应用已经有非常多的资料可查,这里就不展开叙述了。本文旨在通过对ECG信号的四类目标正常(N),室性早搏(V),右束支阻滞(R),左束支阻滞(L)进行分类,其中的数据样本来源请参阅论坛www.52matlab.com。下面直接通过源码来说明CNN分类过程。
Step1: 加载数据,数据以.mat存放在Data文件夹,其中四个.mat文件的文件名对应目标分类值;
%% 加载数据;
fprintf('Loadingdata...\n');
tic;
load('Data\N_dat.mat');
load('Data\L_dat.mat');
load('Data\R_dat.mat');
load('Data\V_dat.mat');
fprintf('Finished!\n');
Step2: 加标签值,给对应的数据加上分类标签,其中的标签用元胞数组表示;
%% 控制使用数据量,每一类5000,并生成标签,用1 2 3 4表示
fprintf('Datapreprocessing...\n');
tic;
Nb =Nb(1:5000,: );
Label1 =repmat({'N'},1,5000);
Vb =Vb(1:5000,: );
Label2 =repmat({'V'},1,5000);
Rb =Rb(1:5000,: );
Label3 =repmat({'R'},1,5000);
Lb =Lb(1:5000,: );
Label4 =repmat({'L'},1,5000);
Data =[Nb;Vb;Rb;Lb];
Label =[Label1,Label2,Label3,Label4];
clear Nb;clearLabel1;%定向清除内存
clear Rb;clearLabel2;
clear Lb;clearLabel3;
clear Vb;clearLabel4;
fprintf('Finished!\n');
toc;
Step3: 对数据进行归一化操作,这部分程序直接放在函数CNNModeTrainFunc.m当中调用,对数据归一化主要有两种,一种是最大最小法,对应Matlab库函数mapminmax,一种是平均数方差法,对应Matlab库函数mapstd,归一化的目的主要是消除不同数据采集设备的数量级差别,当然在数据样本较少的情形下也可以认为起到有效特征提取的作用;
function [X,Y] =getCNNDataFunc(x,y)
Y = categorical(y);
for k = 1:length(y)
    X(1,:,1,k) = mapstd(x(k,: )); %等价于  X(1,:,1,k) = (x(k,: ) -mean(x(k,: ))) / std(x(k,: ));
end
Step4: 结构层设计,Matlab自带的库函数是处理图像的,因此输入层也是图片的输入格式,但是序列信号可以看作图像信息的特例,将其中的过程矩阵用行向量取代,本文介绍的CNN实例,包含四个卷积层,三个池化层,两个全连接层(即BP网络中的隐藏层),使用的激活函数为ReLU,全连接层的权系数节点丢弃率为0.2,同时设计softmax的多分类;
layers = [
    imageInputLayer([inputSize 250 1]) %输入数据1*250*1
   convolution2dLayer([1,11],4,'Padding','same')%滤波器长度为11,个数为4,输出的数据跟输入维度相同
    batchNormalizationLayer
    reluLayer%激活函数
   averagePooling2dLayer([1,3],'Stride',[1,2])%平均池化函数,三点平均,滑窗长度为2
   convolution2dLayer([1,13],16,'Padding','same')
    batchNormalizationLayer
    reluLayer
    averagePooling2dLayer([1,3],'Stride',[1,2])
  
    convolution2dLayer([1,15],32,'Padding','same')
    batchNormalizationLayer
    reluLayer
    averagePooling2dLayer([1,3],'Stride',[1,2])
   
   convolution2dLayer([1,17],64,'Padding','same')
    batchNormalizationLayer
    reluLayer
        
    dropoutLayer(0.2)%权系数节点丢弃率
    fullyConnectedLayer(numClasses)
    softmaxLayer
    classificationLayer];
Step5: CNN训练参数的设定,其中的训练方法为’sgdm’ ,即动量驱动的随机梯度下降法,使用验证数据在训练过程中进行实施验证,其中的小批量尺寸设置为120;
options =trainingOptions('sgdm',...%动量法驱动的随机梯度下降
    'MiniBatchSize',miniBatchSize,...%小批量尺寸大小
    'MaxEpochs',9,...%轮数
    'InitialLearnRate',1e-3,...%初始学习率
    'LearnRateSchedule','piecewise',...
    'LearnRateDropFactor',0.1,...
    'LearnRateDropPeriod',20,...
    'Shuffle','every-epoch',...
   'ValidationData',{XValidation,YValidation},...%验证数据
   'ValidationFrequency',validationFrequency,...%验证频率
    'ValidationPatience',Inf,...
    'Plots','training-progress',...
    'Verbose',false);
Step6: 训练CNN网络;
net =trainNetwork(XTrain,YTrain,layers,options);
[attach]239[/attach]

2 CNN训练过程


Step7: 使用训练好的CNN网络对输入序列进行预测分类,这里使用验证数据集作为测试数据集,同时给出混淆矩阵绘图。
YPred =classify(cnn_net,validation_x, 'MiniBatchSize',miniBatchSize,'SequenceLength', 'longest');
plotconfusion(YPred,validation_y');%绘制混淆矩阵
[attach]240[/attach]

3 用验证集做测试的混乱矩阵


       通过预测集和实际集的混淆矩阵,可以很具体的分析各类的性能分析,这里不再叙述。对以CNN为代表的深度学习分类方法,对训练和输入数据的一致性要求严格,这也对传感器的稳定性提出了要求,同时在训练过程中也需要尽可能保持各类数据样本的均衡。



作者: 技术小白    时间: 2018-11-2 13:05
您好,在输入层中,数据大小为什么是1*250*1?
作者: 技术小白    时间: 2018-11-2 13:31
输入层也是图片的输入格式,但是序列信号可以看作图像信息的特例?博主,这句话怎么理解?
作者: matlab的旋律    时间: 2018-11-5 04:06
技术小白 发表于 2018-11-2 13:31
输入层也是图片的输入格式,但是序列信号可以看作图像信息的特例?博主,这句话怎么理解?

比如图像是 64*64*3的三维信号, 序列信号一般是一维或者二维信号,以一维为例,序列信号长为100, 可以当作1*100*1的图像. 当然这里涉及到一个时间的问题, 64*64*3的图像是同一个时间,而这里长为100的时间序列对应的时刻为100个,因此将一维信号当作图像来处理的时候就没有时间这个维度了
作者: leiwang9305    时间: 2020-2-20 08:54
博主有没有数据集啊?
作者: matlab的旋律    时间: 2020-2-21 19:10
leiwang9305 发表于 2020-2-20 08:54
博主有没有数据集啊?

用的MIT的数据库分割的
作者: leiwang9305    时间: 2020-2-24 16:47
可不可以把你分割后的数据集我发一份,QQ邮箱1946604122@qq.com
作者: Neurant    时间: 2020-6-1 02:26
matlab的旋律 发表于 2018-11-5 04:06
比如图像是 64*64*3的三维信号, 序列信号一般是一维或者二维信号,以一维为例,序列信号长为100, 可以当作1 ...

请问楼主有完整的代码可以分享吗?例如 XTrain是怎么定义的?数据集的下载链接可以分享一下吗
作者: 豹纹096    时间: 2020-6-7 07:29
学习了




欢迎光临 52matlab技术网站,matlab教程,matlab安装教程,matlab下载 (http://test.52matlab.com/) Powered by Discuz! X3.2