程序描述:本程序演示了如何使用MATLAB构建、训练和评估一个深度学习模型,特别是一个基于LSTM的分类模型,用于处理具有20个特征的数据。该模型的目标是对数据进行分类,将其分为不同的类别。程序将数据划分为训练集和测试集,对训练集进行训练,然后评估模型在测试集上的性能。
程序步骤:
数据导入:程序首先导入名为"特征数据带标签.xlsx"的Excel文件,其中包含了20个数据特征列和一个样本所属的类别列。共有400个样本。
数据预处理:随机将这400个样本划分为训练集和测试集,其中训练集包含350个样本,测试集包含50个样本。
数据归一化:特征数据经过归一化处理,将它们缩放到0到1的范围内,以确保数据在相同的尺度上进行训练。
构造LSTM网络:定义了一个包含图像输入层、展平层、LSTM层、全连接层、Softmax层和分类输出层的深度学习网络。这个网络用于学习数据的特征并进行分类。
参数设置:设置了模型训练的参数,包括优化算法、批大小、训练周期、学习率等。
网络结构分析:对定义的神经网络结构进行分析和可视化,以便了解网络的层次和连接。
模型训练:使用训练集的特征数据和标签来训练LSTM网络模型。
训练集预测:使用训练好的模型对训练集和测试集进行预测。
性能评价:通过计算准确率来评估模型在训练集和测试集上的性能。
结果可视化:通过图形展示训练集和测试集中的真实值与模型的预测结果之间的比较,以及测试集的混淆矩阵。
程序用途:该程序可用于构建和训练深度学习模型,特别适用于分类任务。用户可以根据自己的数据和需求修改程序中的参数和网络结构,以用于不同的分类问题。
注意:本程序需要MATLAB深度学习工具箱的支持。
程序部分:
%% 清空环境变量
clear
clc
warning off
%% 导入数据
data= xlsread('特征数据带标签.xlsx'); %1:20列为数据特征,第21列为样本所属的类别;每一行为一个样本共计400个样本
%% 随机划分训练集和测试集
temp = randperm(400);
% 训练集——400个样本
P_train = data(temp(1:350),1:20)';
T_train = data(temp(1:350),21)';
M = size(P_train,2);
% 测试集——50个样本
P_test = data(temp(351:end),1:20)';
T_test = data(temp(351:end),21)';
N = size(P_test,2);
%% 数据归一化
[p_train, ps_input] = mapminmax(P_train,0,1);
p_test = mapminmax('apply',P_test,ps_input);
t_train = T_train;
t_test = T_test;
%% 数据平铺
p_train = double(reshape(p_train,20,1,1,M));
p_test = double(reshape(p_test,20,1,1,N));
t_train = categorical(t_train)';
t_test = categorical(t_test)';
%% 构造LSTM网络
layers = [
imageInputLayer([20 1 1],"Name","imageinput")
flattenLayer("Name","flatten")
lstmLayer(128,"Name","lstm")
fullyConnectedLayer(8,"Name","fc")
softmaxLayer("Name","softmax")
classificationLayer("Name","classoutput")];
% 参数设置
options = trainingOptions('sgdm',... % SGDM 梯度下降算法
'MiniBatchSize',10,... % 批大小 每次训练样本个数10
'MaxEpochs',50,... % 最大训练次数 50
'InitialLearnRate',1e-2,... % 初始学习率为0.01
'LearnRateSchedule','piecewise',... % 学习率下降
'LearnRateDropFactor',0.1,... % 学习率下降因子 0.1
'LearnRateDropPeriod',35,... % 经过35次训练后 学习率为 0.01*0.1
'Shuffle','every-epoch',... % 每次训练打乱数据集
'ValidationPatience',Inf,... % 关闭验证
'Plots','training-progress',... % 画出曲线
'Verbose',false);
%% 分析网络结构
analyzeNetwork(layers)
%% 训练
net = trainNetwork(p_train,t_train,layers,options);
%% 训练集预测
t_sim1 = predict(net,p_train);
t_sim2 = predict(net,p_test);
%% 反编码
T_sim1 = vec2ind(t_sim1');
T_sim2 = vec2ind(t_sim2');
%% 性能评价
error1 = sum((T_sim1 == T_train))/M * 100 ;
error2 = sum((T_sim2 == T_test))/N * 100 ;
%% 绘图
figure
plot(1:M,T_train,'c*',1:M,T_sim1,'mo','LineWidth',1)
legend('真实值','预测值')
xlabel('预测样本')
ylabel('预测结果')
string={'训练集预测结果对比';['准确率=' num2str(error1) '%']};
title(string)
grid
figure
plot(1:N,T_test,'c*',1:N,T_sim2,'mo','LineWidth',1)
legend('真实值','预测值')
xlabel('预测样本')
ylabel('预测结果')
string={'测试集预测结果对比';['准确率=' num2str(error2) '%']};
title(string)
grid
%% 绘制混淆矩阵热图
figure
confusionchart(categorical(T_test), categorical(T_sim2));
string={['测试集精度=' num2str(error2) '%']};
title(string)
h= plotconfusion(categorical(T_test), categorical(T_sim2));
title('测试集的混淆矩阵');
% 设置横纵坐标的标签
xlabel('预测输出类别');
ylabel('真实所属类别');
本程序提供小伙伴们免费学习,复制程序部分放在MATLAB脚本即可,限于篇幅,本文数据没有公布,欢迎关注并后台留言,小编会将数据部分发给您,谢谢!