CNN-BILSTM-Attention基于卷积神经网络-双向长短期记忆网络结合注意力机制CNN-BILSTM-Attention分类预测,matlab代码,2020版本及以上。 多特征输入单输出的二分类及多分类模型。 程序内注释详细替换数据就可以用。 程序语言为matlab,程序可出分类效果图,迭代优化图,混淆矩阵图。 1.多特征输入,可改分类预测也可以改成回归预测或时间序列预测模型,Matlab版本要在2020B及以上。 2.卷积神经网络(CNN):捕捉数据中的局部模式和特征。 (LSTM-BILSTM-GRU-BiGRU):捕捉关键特征向量的非线性动态变化规律。 注意力机制(Attention):为模型提供了对关键信息的聚焦能力,从而提高预测的准确度。
最近在研究多特征输入的预测模型,发现CNN - BILSTM - Attention这种组合在Matlab里特别好用,今天就来和大家分享分享。这个模型既能做二分类,也能做多分类,而且Matlab 2020B及以上版本就可以轻松驾驭。
一、模型原理
1. 卷积神经网络 (CNN)
CNN的核心就是捕捉数据中的局部模式和特征。比如说我们有一堆图像数据,CNN里的卷积层就像一个个"小窗口",在图像上滑动,去抓取那些局部的特征,像边缘、角点这些。Matlab里构建CNN层代码示例:
matlab
layers = [
imageInputLayer([height width numChannels])
convolution2dLayer(3,16,'Padding','same')
reluLayer()
maxPooling2dLayer(2,'Stride',2)
];
这里convolution2dLayer就是卷积层,3是卷积核大小,16是输出通道数。Padding设为same能保证卷积前后图像尺寸不变。reluLayer激活函数让模型具有非线性,maxPooling2dLayer用来下采样,减少数据量。
2. 双向长短期记忆网络 (BILSTM)
BILSTM属于循环神经网络家族,它能捕捉关键特征向量的非线性动态变化规律。普通的LSTM只能按顺序处理数据,BILSTM则可以同时从正向和反向处理,这样就能更好地捕捉数据序列中的长期依赖关系。比如处理一段语音,正向和反向处理能获取到更全面的信息。在Matlab里添加BILSTM层:
matlab
layers = [layers
bilstmLayer(32)
fullyConnectedLayer(numClasses)
];
这里bilstmLayer(32)表示有32个隐藏单元,fullyConnectedLayer(numClasses)将BILSTM的输出连接到最终分类层。
3. 注意力机制 (Attention)
注意力机制就像是模型的"聚光灯",能为模型提供对关键信息的聚焦能力,大大提高预测准确度。在处理大量数据时,不是所有信息都同等重要,注意力机制可以让模型自动关注那些重要部分。虽然Matlab没有直接一个简单函数就能实现注意力机制,但我们可以自己写代码实现。以下是一个简单的注意力机制实现思路代码(为简化,假设输入特征维度为100,batchSize为16):
matlab
function attentionOutput = simpleAttention(inputFeature)
batchSize = size(inputFeature,1);
featureDim = size(inputFeature,2);
attentionWeights = zeros(batchSize,featureDim);
for i = 1:batchSize
attentionWeights(i,:) = softmax(inputFeature(i,:));
end
attentionOutput = inputFeature.* attentionWeights;
end
这段代码里,先计算每个特征的注意力权重(用softmax函数),然后将权重和原始特征相乘得到加权后的特征。
二、模型应用
1. 多特征输入
我们可以轻松改变模型来处理多特征输入。无论是分类预测,还是改成回归预测或时间序列预测模型都可以。比如,我们有多个传感器收集的数据作为特征,要预测某个事件是否发生(二分类)。
假设数据存储在data变量中,标签存储在labels变量中。划分训练集和测试集代码如下:
matlab
idx = crossvalind('HoldOut',size(data,1),0.2);
trainData = data(~idx,:);
trainLabels = labels(~idx);
testData = data(idx,:);
testLabels = labels(idx);
这里用crossvalind函数以20%的数据作为测试集。
2. 二分类及多分类
对于二分类问题,numClasses设为2;多分类则根据实际类别数设置。在训练模型时:
matlab
options = trainingOptions('adam',...
'MaxEpochs',50,...
'MiniBatchSize',32,...
'InitialLearnRate',0.001,...
'ValidationData',{testData,testLabels},...
'ValidationFrequency',10,...
'Plots','training-progress');
net = trainNetwork(trainData,trainLabels,layers,options);
这里用adam优化器,设置了最大训练轮数、小批量大小、初始学习率等参数,训练过程中还会绘制训练进度图。
3. 生成各类图
Matlab能轻松生成分类效果图、迭代优化图、混淆矩阵图。
- 分类效果图 :可以用
plotconfusion函数根据预测结果和真实标签绘制。
matlab
predictedLabels = classify(net,testData);
plotconfusion(testLabels,predictedLabels);
- 迭代优化图 :在训练时设置
'Plots','training - progress'就会自动生成,展示训练过程中损失函数和准确率的变化。 - 混淆矩阵图 :上面
plotconfusion函数绘制的就是混淆矩阵图,直观展示分类结果的正确和错误情况。
总之,CNN - BILSTM - Attention组合在Matlab里功能强大,注释详细,替换数据就能应用到不同场景,大家不妨试试!
