利用Matlab搭建基于CNN的结构损伤识别网络模型

利用Matlab搭建基于CNN的结构损伤识别网络模型

码龄12年,第一次发文,记录Matlab实现CNN进行结构损伤识别过程,原来如此简单,简单记录CNN建立过程及分析。

文章目录

  • 一、导入数据
  • 二、指定训练、验证集
  • 三、CNN网络架构
    • 1.定义CNN架构
    • 2.设置网络参数
  • 四、训练网络
  • 五、损伤识别分类结果统计
  • 总结


一、导入数据

将采集的结构加速度信号数据加载为图像数据存储(需提前将采集的加速度信号构造成jpg、png等图片格式,方便读取,注意每个损伤分类下的数据存放在一个文件夹内,并以“0”~“9”(取决于要进行的损伤类别个数)命名,作为损伤标签),下面则以图像为对象进行设计。
digitDatasetPath = 'E:\matlabCNNDataSet\imageData_28p28fromCH1\';
imds = imageDatastore(digitDatasetPath, ...
    'IncludeSubfolders',true,'FileExtensions','.png','LabelSource','foldernames');%包含子文件夹;标签选择文件夹名称

通过调用imageDatastore函数,根据文件夹名称自动标记数据,并将数据存储为imageDatastore对象。


下面读取一下每个标签和总数量
labelCount = countEachLabel(imds);
Label Count 备注
0 200 无损伤
1 200 结构1节点轻度损伤
2 200 结构1节点中度损伤
3 200 结构1节点重度损伤
4 200 结构2节点轻度损伤
5 200 结构2节点中度损伤
6 200 结构2节点重度损伤
7 200 结构3节点轻度损伤
8 200 结构3节点中度损伤
9 200 结构3节点重度损伤

二、指定训练、验证集

将读取的数据划分为训练和验证数据集,以便训练集中的每个类别包含80%的训练数据,验证集包含每个标签中的其余数据。如我对每个损伤情况采集200组数据,将80%划为训练数据,其余则为验证数据。

numTrainFiles = 200*0.8;% 用80%数据训练
[imdsTrain,imdsValidation] = splitEachLabel(imds,numTrainFiles,'randomize');

三、CNN网络架构

1.定义CNN架构

定义CNN网络架构,可灵活设计网络深度。此处设计一个具有1个组件的CNN,每个组件包含卷积层、小批量归一化、ReLU激活、最大池化。

layers = [
    imageInputLayer([28 28 1])% 修改灵活的输入数据尺寸    
    convolution2dLayer(3,8,'Padding','same') % 卷积核3×3,共8个,也可以修改为其他尺寸的卷积核
    batchNormalizationLayer
    reluLayer    
    maxPooling2dLayer(2,'Stride',2)   
    
    fullyConnectedLayer(ClassNum)
    softmaxLayer
    classificationLayer];

2.设置网络参数

定义网络结构后,指定训练选项。使用带有动量的随机梯度下降(SGDM)训练网络,初始学习率为0.01。将最大Epoch设置为4。通过指定验证数据和验证频率,在培训期间监控网络准确性。每个历元对数据进行洗牌。软件根据训练数据对网络进行训练,并在训练期间定期计算验证数据的准确性。验证数据不用于更新网络权重。打开“训练进度”绘图,并关闭命令窗口输出。

options = trainingOptions('sgdm', ...
    'InitialLearnRate',learnRate, ...   %灵活设定
    'MaxEpochs',maxEpochs, ...  %灵活设定
    'Shuffle','every-epoch', ...
    'ValidationData',imdsValidation, ...
    'ValidationFrequency',30, ...
    'Verbose',false, ...
    'Plots','training-progress');

四、训练网络

使用由网络层、训练数据和训练选项定义的体系结构训练网络。默认情况下,trainNetwork使用GPU(如果有,可以用gpuDevice查询)。否则,它将使用CPU。
训练进度图显示了小批量损失和准确度以及验证损失和准确度。这种采用交叉熵损失函数,准确度是网络正确分类的损伤百分比。

net = trainNetwork(imdsTrain,layers,options);

利用Matlab搭建基于CNN的结构损伤识别网络模型_第1张图片

五、损伤识别分类结果统计

验证损伤分类和计算精度。使用训练好的网络预测验证数据的标签,并计算最终验证精度。准确度是网络正确预测的标签的分数。在这种情况下,99%以上的预测标签与验证集的真实标签匹配。

YPred = classify(net,imdsValidation);
YValidation = imdsValidation.Labels;
accuracy = sum(YPred == YValidation)/numel(YValidation)

在这里插入图片描述


总结

利用Matlab搭建简单的CNN,对结构损伤10分类进行初步损伤识别,简单的4个Epoch即达到了98.75%的识别准确率,在有GPU硬件平台的支撑下,训练效率可观。后期进一步探索对多损伤情况进行识别,欢迎同领域人员交流探讨。

你可能感兴趣的:(Matlab+CNN+SDI,matlab,cnn,分类)