本程序参考中文EI期刊《基基于格拉姆角差场和卷积神经网络的宽频振荡分类方法》,程序注释清晰,干货满满,下面对文章和程序做简要介绍!
原理:格拉姆角场(GAF)是一种将一维序列转化为图像的方法,分为格拉姆求和(GASF)场和格拉姆差场(GADF)。它对笛卡尔坐标系下的时间序列进行极坐标编码,再通过三角运算生成格拉姆矩阵,从而将一维时间序列转化为二维图像。GAF采用三角函数和差的运算,将一维信号转换为角度(θ)和半径(r),生成二维特征图。转换后的图像可以保留数据的时间依赖性和潜在联系特征,同时具有较大的稀疏性,剔除了多模态间的冗余信息,以正弦信号为例,转化流程:
输入数据格式:(一行一个样本,最后一列表示故障所属类别标签)
训练曲线:准确率和损失变化图
% 清除工作区和命令行窗口
clc
clear all
%% 创建图像数据存储对象,包括图像子文件夹,并以文件夹名称为标签
images = imageDatastore('数据集227×227', ...
'IncludeSubfolders', true, 'LabelSource', 'foldernames');
%% 拆分为训练集和测试集,拆分比例为 70% 的训练集和 30% 的测试集
% 打乱数据顺序
images = shuffle(images);
% 拆分比例为 70% 的训练集和 30% 的测试集
[0.7, 'randomized'); ] = splitEachLabel(images,
%% 构建卷积神经网络层
layers = [
imageInputLayer([227 227 3], "Name", "imageinput") % 输入层,定义输入图像的尺寸为 227x227 像素,3个通道(RGB)
convolution2dLayer([4 4], 8, "Name", "conv_1", "Padding", "same") % 第一个卷积层,使用4x4的卷积核进行卷积操作,共8个卷积核
batchNormalizationLayer("Name", "batchnorm_1") % 批标准化层,对卷积层的输出进行标准化,提高训练稳定性
reluLayer("Name", "relu_1") % ReLU激活层,增加网络的非线性能力
maxPooling2dLayer([3 3], "Name", "maxpool_1") % 最大池化层,进行3x3的最大池化操作,减小特征图的尺寸
convolution2dLayer([4 4], 16, "Name", "conv_2", "Padding", "same") % 第二个卷积层,使用4x4的卷积核进行卷积操作,共16个卷积核
batchNormalizationLayer("Name", "batchnorm_2") % 批标准化层,对卷积层的输出进行标准化,提高训练稳定性
reluLayer("Name", "relu_2") % ReLU激活层,增加网络的非线性能力
maxPooling2dLayer([3 3], "Name", "maxpool_2") % 最大池化层,进行3x3的最大池化操作,减小特征图的尺寸
convolution2dLayer([4 4], 32, "Name", "conv_3", "Padding", "same") % 第三个卷积层,使用4x4的卷积核进行卷积操作,共32个卷积核
batchNormalizationLayer("Name", "batchnorm_3") % 批标准化层,对卷积层的输出进行标准化,提高训练稳定性
reluLayer("Name", "relu_3") % ReLU激活层,增加网络的非线性能力
fullyConnectedLayer(8, "Name", "fc") % 全连接层,将池化后的特征图连接到一个有8个神经元的全连接层
softmaxLayer("Name", "softmax") % Softmax层,对全连接层的输出进行Softmax变换,得到分类概率
classificationLayer("Name", "classoutput")]; % 分类层,用于输出分类结果
%% 设置训练选项
options = trainingOptions('adam', ... % 使用Adam优化器
'MiniBatchSize', 15, ... % 每个迭代的迷你批次大小
'MaxEpochs', 5, ... % 最大训练迭代次数
'InitialLearnRate', 0.001, ... % 初始学习率
'Shuffle', 'every-epoch', ... % 每个迭代都对数据进行洗牌
'Verbose', false, ... % 不显示训练过程中的详细输出
'Plots', 'training-progress'); % 显示训练进度图
%% 使用训练集训练网络
[ ] = trainNetwork(trainSet,layers,options);
欢迎感兴趣的小伙伴点击“阅读原文”或上方链接获得完整版代码哦~,关注小编会继续推送更有质量的学习资料、文章程序代码~