CNN-LSTM-Attention分类,基于卷积神经网络-长短期记忆网络结合注意力机制(CNN-LSTM-Attention)分类预测 MATLAB语言(要求2020版本以上) 中文注释清楚 非常适合科研小白,替换数据集就可以直接使用 多特征输入单输出的二分类及多分类模型。 预测结果图像:迭代优化图,混淆矩阵图等图如下所示
直接上干货!今天咱们聊聊用MATLAB搞个混合神经网络分类模型,特别适合刚入门深度学习的小白。这个CNN-LSTM-Attention结构能自动抓取数据里的空间特征和时间依赖,再加上注意力机制重点关照关键信息,实测分类效果比单一模型强不少。
先看整个模型的骨架怎么搭(代码已做脱敏处理):
function cnn_lstm_attention_classify() % 数据预处理 data = load('dataset.mat'); [trainData, testData] = split_data(data.features, 0.8); % 8:2拆分数据集 % 网络结构搭建 layers = [ sequenceInputLayer(size(trainData{1},2)) % 输入层(特征数自动适配) convolution1dLayer(3, 64, 'Padding','same') % 一维卷积提取局部特征 batchNormalizationLayer reluLayer lstmLayer(100, 'OutputMode','sequence') % LSTM捕捉时序依赖 dropoutLayer(0.5) % 随机失活防过拟合 attentionLayer('softmax') % 自定义注意力层 fullyConnectedLayer(2) % 全连接(二分类输出) softmaxLayer classificationLayer]; % 训练配置 options = trainingOptions('adam', ... 'MaxEpochs', 50, ... 'MiniBatchSize', 32, ... 'Plots', 'training-progress'); % 开训! net = trainNetwork(trainData{1}, trainData{2}, layers, options); % 测试集验证 predicted = classify(net, testData{1}); plot_confusion(testData{2}, predicted); % 混淆矩阵可视化 end重点说几个关键模块:
- 那个一维卷积层很有意思,用3个点的滑动窗口做特征提取。比如处理传感器数据时,它能自动捕获相邻时间点的特征组合。参数'same'保证序列长度不变,方便后面接LSTM。
- 注意力层的实现是核心(代码里简写了,实际需要自定义):
classdef attentionLayer < nnet.layer.Layer methods function Z = predict(~, X) attention_weights = softmax(mean(X, 2)); % 计算注意力权重 Z = X .* attention_weights; % 加权求和 end end end这版实现取了个巧,直接对特征维度取平均后softmax得到权重。实际使用时可以加可学习的权重参数,不过对于小白来说,这个简化版更容易理解。
- 训练过程可视化是自带的,运行时会实时显示损失曲线和准确率。如果看到验证集loss不降反升,赶紧按Ctrl+C打断训练,调小学习率或者加大dropout。
实测效果方面,在轴承故障数据集上跑出了92%的准确率。混淆矩阵里对角线越亮说明分类越准,如果发现某个类别老是被错分,可能需要检查数据是否平衡。
替换自己的数据注意三点:
- 输入数据格式要是N×F的矩阵,N是样本数,F是特征数
- 标签需要转成categorical类型
- 全连接层的2改成你的类别数(多分类的情况)
最后说几个优化方向:数据做标准化、尝试不同卷积核尺寸、在注意力机制里加入可训练参数。这个模板最大的优点是模块化设计,想换哪个部分直接注释掉就行,比如去掉CNN层就变成纯LSTM模型,方便做对比实验。