利用Matlab搭建基于CNN的结构损伤识别网络模型
码龄12年,第一次发文,记录Matlab实现CNN进行结构损伤识别过程,原来如此简单,简单记录CNN建立过程及分析。
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,每个组件包含卷积层、小批量归一化、ReLU激活、最大池化。
layers = [
imageInputLayer([28 28 1])% 修改灵活的输入数据尺寸
convolution2dLayer(3,8,'Padding','same') % 卷积核3×3,共8个,也可以修改为其他尺寸的卷积核
batchNormalizationLayer
reluLayer
maxPooling2dLayer(2,'Stride',2)
fullyConnectedLayer(ClassNum)
softmaxLayer
classificationLayer];
定义网络结构后,指定训练选项。使用带有动量的随机梯度下降(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);
验证损伤分类和计算精度。使用训练好的网络预测验证数据的标签,并计算最终验证精度。准确度是网络正确预测的标签的分数。在这种情况下,99%以上的预测标签与验证集的真实标签匹配。
YPred = classify(net,imdsValidation);
YValidation = imdsValidation.Labels;
accuracy = sum(YPred == YValidation)/numel(YValidation)