Use MATLAB para construir un modelo 1DCNN para la clasificación de series temporales

La versión de MATALB es 2022b

datos

Para facilitar la verificación de la viabilidad del experimento, aquí se proporcionan los datos necesarios para el experimento.
Los datos son los datos de aceleración generados durante las actividades humanas, incluido el eje X, el eje Y, el eje Z y la aceleración resultante del sensor de tres ejes.

Enlace de disco de red de Baidu: https://pan.baidu.com/s/1xHufym00DH6fC6ZfylVUVA
Código de extracción: 2023

Este conjunto de datos es solo para sus experimentos de verificación, y está prohibido su uso para disertaciones y artículos de revistas, etc.

El programa de entrenamiento del modelo y la carpeta del conjunto de datos están en el mismo directorio de forma predeterminada. Si no están en el mismo directorio, debe modificar la ruta del archivo en el código fuente.

La carpeta del conjunto de datos contiene dos carpetas, entrenar y probar, y cada carpeta contiene cinco archivos: A.xlsx, X.xlsx, Y.xlsx, Z.xlsx y label.xlsx.

construcción del modelo

El modelo de aprendizaje profundo construido por MATLAB se puede construir directamente usando el código o usando la caja de herramientas.A continuación se presenta el uso de la caja de herramientas para construir el modelo 1DCNN.

1. Haga clic en la caja de herramientas "Diseñador de redes profundas" en la pestaña APLICACIÓN.
inserte la descripción de la imagen aquí
2. Cree una nueva red en blanco.
inserte la descripción de la imagen aquí
3. Construya el modelo.
Puede construir la red arrastrando los módulos a la izquierda.
inserte la descripción de la imagen aquí

4. Configuración de parámetros

Los parámetros de cada capa en el modelo, como el número o el tamaño de los núcleos de convolución de la capa convolucional, se pueden configurar en las "Propiedades" a la derecha haciendo clic en el módulo correspondiente
inserte la descripción de la imagen aquí

5. Después de construir el modelo, se deben configurar parámetros como el optimizador

Haga clic en "Formación"

inserte la descripción de la imagen aquí
Haga clic en "Opciones de entrenamiento"
inserte la descripción de la imagen aquí

Puede establecer parámetros como el optimizador, la tasa de aprendizaje, el tamaño del lote, etc., y modificar los parámetros según sus propias necesidades.
inserte la descripción de la imagen aquí

6. Exporte como código (2DCNN se puede entrenar directamente usando la caja de herramientas, 1DCNN aún no lo he implementado) o exportado al espacio de trabajo, según sus necesidades. Después de generar el código, puede modificar directamente los parámetros en el archivo .m, lo que es más conveniente.
inserte la descripción de la imagen aquí

7. La interfaz después de la exportación

inserte la descripción de la imagen aquí

8. Copie el contenido del grupo de capas creado en su propio archivo .m y luego ejecútelo para realizar el entrenamiento del modelo.

Vale la pena señalar que el código generado no incluye la configuración de parámetros como el optimizador y el tamaño del lote.

El código requerido para la parte de entrenamiento del modelo se proporciona a continuación.

clear all
close all

%% 数据加载和生成
% 数据说明:人体活动加速度数据,包括三轴加速度的X、Y、Z轴和合加速度
train_a = xlsread('dataset\train\A.xlsx');
train_x = xlsread('dataset\train\X.xlsx');
train_y = xlsread('dataset\train\Y.xlsx');
train_z = xlsread('dataset\train\Z.xlsx');
train_label = xlsread('dataset\train\label.xlsx');

test_a = xlsread('dataset\test\A.xlsx');
test_x = xlsread('dataset\test\X.xlsx');
test_y = xlsread('dataset\test\Y.xlsx');
test_z = xlsread('dataset\test\Z.xlsx');
test_label = xlsread('dataset\test\label.xlsx');

% 获取数组维度
[trainRow, trainCol] = size(train_a);
[testRow, testCol] = size(test_a);
% 创建存储加速度数据的元组
train = cell(trainRow,1);
test = cell(testRow, 1);
% 数据集生成
for i = 1:trainRow
    train{
    
    i, 1} = [train_a(i,:); train_x(i,:); train_y(i,:); train_z(i,:)];
end

for i = 1:testRow
    test{
    
    i, 1} = [test_a(i,:); test_x(i,:); test_y(i,:); test_z(i,:)];
end

%% 训练数据处理
% 标签类型转换
train_label = string(train_label);
train_label = categorical(train_label);
test_label = string(test_label);
test_label = categorical(test_label);
% 训练集测试集划分,选择总训练集的80%的数据用来作训练集,20%的数据作验证集
row_trian_1 = length(train)*0.8;
row_trian = int64(row_trian_1);
XTrain = train(1:row_trian, 1);
TTrain = train_label(1:row_trian, 1);
XValidation = train(row_trian:length(train), 1);
TValidation = train_label(row_trian:length(train), 1);
% 类别数量获取
numClasses = numel(categories(test_label));

%% 网络设计
kernelSize = 9;
layers = [
    sequenceInputLayer(4,"Name","sequence","MinLength",128)
    convolution1dLayer(kernelSize,32,"Name","conv1d","Padding","same")
    batchNormalizationLayer("Name","batchnorm")
    reluLayer("Name","relu")
    maxPooling1dLayer(2,"Name","maxpool1d","Padding","same","Stride",2)

    convolution1dLayer(kernelSize,64,"Name","conv1d_1","Padding","same")
    batchNormalizationLayer("Name","batchnorm_1")
    reluLayer("Name","relu_1")
    maxPooling1dLayer(2,"Name","maxpool1d_1","Padding","same","Stride",2)
    
    convolution1dLayer(kernelSize,128,"Name","conv1d_2","Padding","same")
    batchNormalizationLayer("Name","batchnorm_2")
    reluLayer("Name","relu_2")
    maxPooling1dLayer(2,"Name","maxpool1d_2","Padding","same","Stride",2)

    convolution1dLayer(kernelSize,256,"Name","conv1d_3","Padding","same")
    batchNormalizationLayer("Name","batchnorm_3")
    reluLayer("Name","relu_3")
    maxPooling1dLayer(2,"Name","maxpool1d_3","Padding","same","Stride",2)

    convolution1dLayer(kernelSize,512,"Name","conv1d_3","Padding","same")
    batchNormalizationLayer("Name","batchnorm_3")
    reluLayer("Name","relu_3")
    maxPooling1dLayer(2,"Name","maxpool1d_3","Padding","same","Stride",2)

    globalAveragePooling1dLayer("Name","gapool1d")

    fullyConnectedLayer(128,"Name","fc")
    reluLayer("Name","relu_4")
    fullyConnectedLayer(64,"Name","fc_1")
    reluLayer("Name","relu_5")
    fullyConnectedLayer(numClasses,"Name","fc_2")
    softmaxLayer("Name","softmax")
    classificationLayer("Name","classoutput")];

%% 网络训练参数设置
% 批大小
miniBatchSize = 128;
% 优化器设置
options = trainingOptions("adam", ...
    MiniBatchSize=miniBatchSize, ...
    MaxEpochs=10, ...
    ValidationData={
    
    XValidation,TValidation}, ...
    Plots="training-progress", ...
    Verbose=0, ...
    LearnRateSchedule="piecewise",...
    LearnRateDropPeriod=10);
% 模型训练
[net, info] = trainNetwork(XTrain,TTrain,layers,options);

entrenamiento modelo

Este es el progreso de entrenamiento obtenido al ejecutar el código anterior

inserte la descripción de la imagen aquí

guardar modelo

%% 模型保存
% net代表上面模型的名字
% model.mat代表保存后的模型名字和路径
save('model.mat', "net")

cargando modelo

% 请注意,代码最右侧的net一定要写,这与保存模型时,模型的名称对应
net = load("model.mat").net;

evaluación del modelo

El modelo entrenado debe evaluarse utilizando indicadores de evaluación para determinar si el rendimiento del modelo cumple con nuestros requisitos. Los códigos de cálculo para las puntuaciones de precisión, recuperación y F1 de cada categoría, así como el promedio macro (macro) de precisión, recuperación y puntuaciones F1 se proporcionan a continuación.

%% 模型评估
YPred = classify(net, test);
YPred = categorical(YPred);
acc = mean(YPred == test_label);
% 混淆矩阵
m = confusionmat(test_label,YPred);
% 绘制混淆矩阵
confusionchart(m,["类别1","类别2","类别3","类别4","类别5","类别6","类别7","类别8"])

A = m;
% 计算第一类的评价指标
c1_precise = m(1,1)/sum(m(:,1));
c1_recall = m(1,1)/sum(m(1,:));
c1_F1 = 2*c1_precise*c1_recall/(c1_precise+c1_recall);
% 计算第二类的评价指标
c2_precise = m(2,2)/sum(m(:,2));
c2_recall = m(2,2)/sum(m(2,:));
c2_F1 = 2*c2_precise*c2_recall/(c2_precise+c2_recall);
% 计算第三类的评价指标
c3_precise = m(3,3)/sum(m(:,3));
c3_recall = m(3,3)/sum(m(3,:));
c3_F1 = 2*c3_precise*c3_recall/(c3_precise+c3_recall);
% 计算第四类的评价指标
c4_precise = m(4,4)/sum(m(:,4));
c4_recall = m(4,4)/sum(m(4,:));
c4_F1 = 2*c4_precise*c4_recall/(c4_precise+c4_recall);
% 计算第五类的评价指标
c5_precise = m(5,5)/sum(m(:,5));
c5_recall = m(5,5)/sum(m(5,:));
c5_F1 = 2*c5_precise*c5_recall/(c5_precise+c5_recall);
% 计算第六类的评价指标
c6_precise = m(6,6)/sum(m(:,6));
c6_recall = m(6,6)/sum(m(6,:));
c6_F1 = 2*c6_precise*c6_recall/(c6_precise+c6_recall);
% 计算第七类的评价指标
c7_precise = m(7,7)/sum(m(:,7));
c7_recall = m(7,7)/sum(m(7,:));
c7_F1 = 2*c7_precise*c7_recall/(c7_precise+c7_recall);

macroPrecise = (c1_precise+c2_precise+c3_precise+c4_precise+c5_precise+c6_precise+c7_precise)/7;
macroRecall = (c1_recall+c2_recall+c3_recall+c4_recall+c5_recall+c6_recall+c7_recall)/7;
macroF1 = (c1_F1+c2_F1+c3_F1+c4_F1+c5_F1+c6_F1+c7_F1)/7;

La matriz de confusión predeterminada de MATLAB usa números para representar categorías y también puede cambiarla usted mismo. Las líneas sexta y octava del código anterior son la clave para cambiar la categoría de la matriz de confusión. Si usa la matriz de confusión predeterminada de MATLAB, el resultado es la primera imagen a continuación. Si la matriz de confusión generada de acuerdo con el código de este artículo es la segunda imagen
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí

código fuente completo

clear all
close all

%% 数据加载和生成
% 数据说明:人体活动加速度数据,包括三轴加速度的X、Y、Z轴和合加速度
train_a = xlsread('dataset\train\A.xlsx');
train_x = xlsread('dataset\train\X.xlsx');
train_y = xlsread('dataset\train\Y.xlsx');
train_z = xlsread('dataset\train\Z.xlsx');
train_label = xlsread('dataset\train\label.xlsx');

test_a = xlsread('dataset\test\A.xlsx');
test_x = xlsread('dataset\test\X.xlsx');
test_y = xlsread('dataset\test\Y.xlsx');
test_z = xlsread('dataset\test\Z.xlsx');
test_label = xlsread('dataset\test\label.xlsx');

% 获取数组维度
[trainRow, trainCol] = size(train_a);
[testRow, testCol] = size(test_a);
% 创建存储加速度数据的元组
train = cell(trainRow,1);
test = cell(testRow, 1);
% 数据集生成
for i = 1:trainRow
    train{
    
    i, 1} = [train_a(i,:); train_x(i,:); train_y(i,:); train_z(i,:)];
end

for i = 1:testRow
    test{
    
    i, 1} = [test_a(i,:); test_x(i,:); test_y(i,:); test_z(i,:)];
end

%% 训练数据处理
% 标签类型转换
train_label = string(train_label);
train_label = categorical(train_label);
test_label = string(test_label);
test_label = categorical(test_label);
% 训练集测试集划分,选择总训练集的80%的数据用来作训练集,20%的数据作验证集
row_trian_1 = length(train)*0.8;
row_trian = int64(row_trian_1);
XTrain = train(1:row_trian, 1);
TTrain = train_label(1:row_trian, 1);
XValidation = train(row_trian:length(train), 1);
TValidation = train_label(row_trian:length(train), 1);
% 类别数量获取
numClasses = numel(categories(test_label));

%% 网络设计
kernelSize = 9;
layers = [
    sequenceInputLayer(4,"Name","sequence","MinLength",128)
    convolution1dLayer(kernelSize,32,"Name","conv1d","Padding","same")
    batchNormalizationLayer("Name","batchnorm")
    reluLayer("Name","relu")
    maxPooling1dLayer(2,"Name","maxpool1d","Padding","same","Stride",2)

    convolution1dLayer(kernelSize,64,"Name","conv1d_1","Padding","same")
    batchNormalizationLayer("Name","batchnorm_1")
    reluLayer("Name","relu_1")
    maxPooling1dLayer(2,"Name","maxpool1d_1","Padding","same","Stride",2)
    
    convolution1dLayer(kernelSize,128,"Name","conv1d_2","Padding","same")
    batchNormalizationLayer("Name","batchnorm_2")
    reluLayer("Name","relu_2")
    maxPooling1dLayer(2,"Name","maxpool1d_2","Padding","same","Stride",2)

    convolution1dLayer(kernelSize,256,"Name","conv1d_3","Padding","same")
    batchNormalizationLayer("Name","batchnorm_3")
    reluLayer("Name","relu_3")
    maxPooling1dLayer(2,"Name","maxpool1d_3","Padding","same","Stride",2)

    convolution1dLayer(kernelSize,512,"Name","conv1d_3","Padding","same")
    batchNormalizationLayer("Name","batchnorm_3")
    reluLayer("Name","relu_3")
    maxPooling1dLayer(2,"Name","maxpool1d_3","Padding","same","Stride",2)

    globalAveragePooling1dLayer("Name","gapool1d")

    fullyConnectedLayer(128,"Name","fc")
    reluLayer("Name","relu_4")
    fullyConnectedLayer(64,"Name","fc_1")
    reluLayer("Name","relu_5")
    fullyConnectedLayer(numClasses,"Name","fc_2")
    softmaxLayer("Name","softmax")
    classificationLayer("Name","classoutput")];

%% 网络训练参数设置
% 批大小
miniBatchSize = 128;
% 优化器设置
options = trainingOptions("adam", ...
    MiniBatchSize=miniBatchSize, ...
    MaxEpochs=10, ...
    ValidationData={
    
    XValidation,TValidation}, ...
    Plots="training-progress", ...
    Verbose=0, ...
    LearnRateSchedule="piecewise",...
    LearnRateDropPeriod=10);
% 模型训练
[net, info] = trainNetwork(XTrain,TTrain,layers,options);

%% 模型保存
save('model.mat', "net")

%% 模型加载
net = load("model.mat").net;

%% 模型评估
YPred = classify(net, test);
YPred = categorical(YPred);
acc = mean(YPred == test_label);
% 混淆矩阵
m = confusionmat(test_label,YPred);
% 绘制混淆矩阵
confusionchart(m,["类别1","类别2","类别3","类别4","类别5","类别6","类别7","类别8"])

% 计算第一类的评价指标
c1_precise = m(1,1)/sum(m(:,1));
c1_recall = m(1,1)/sum(m(1,:));
c1_F1 = 2*c1_precise*c1_recall/(c1_precise+c1_recall);
% 计算第二类的评价指标
c2_precise = m(2,2)/sum(m(:,2));
c2_recall = m(2,2)/sum(m(2,:));
c2_F1 = 2*c2_precise*c2_recall/(c2_precise+c2_recall);
% 计算第三类的评价指标
c3_precise = m(3,3)/sum(m(:,3));
c3_recall = m(3,3)/sum(m(3,:));
c3_F1 = 2*c3_precise*c3_recall/(c3_precise+c3_recall);
% 计算第四类的评价指标
c4_precise = m(4,4)/sum(m(:,4));
c4_recall = m(4,4)/sum(m(4,:));
c4_F1 = 2*c4_precise*c4_recall/(c4_precise+c4_recall);
% 计算第五类的评价指标
c5_precise = m(5,5)/sum(m(:,5));
c5_recall = m(5,5)/sum(m(5,:));
c5_F1 = 2*c5_precise*c5_recall/(c5_precise+c5_recall);
% 计算第六类的评价指标
c6_precise = m(6,6)/sum(m(:,6));
c6_recall = m(6,6)/sum(m(6,:));
c6_F1 = 2*c6_precise*c6_recall/(c6_precise+c6_recall);
% 计算第七类的评价指标
c7_precise = m(7,7)/sum(m(:,7));
c7_recall = m(7,7)/sum(m(7,:));
c7_F1 = 2*c7_precise*c7_recall/(c7_precise+c7_recall);

macroPrecise = (c1_precise+c2_precise+c3_precise+c4_precise+c5_precise+c6_precise+c7_precise)/7;
macroRecall = (c1_recall+c2_recall+c3_recall+c4_recall+c5_recall+c6_recall+c7_recall)/7;
macroF1 = (c1_F1+c2_F1+c3_F1+c4_F1+c5_F1+c6_F1+c7_F1)/7;

Supongo que te gusta

Origin blog.csdn.net/weixin_49216787/article/details/130110094
Recomendado
Clasificación