首页/文章/ 详情

DeepSeek PHM实战:3个案例告诉你,如何用AI一键生成维修指南!

15小时前浏览18

    💡 各位读者们注意啦!上期的《DeepSeek学习资料分享》大家都get到了吗?还没看的速速上车👉戳DeepSeek学习资料分享 | 第2期直达。

            🌟 本期干货预警!DeepSeek在工业领域的故障预测与健康管理(PHM)技术实战案例分享!

      目录

      1 案例一

            1.1 故障现象(机床电机故障)

      1.2 案例来源

      1.3 DeepSeek分析

      1.4 人为检查故障结论

      1.5 结论对比

      2 案例二

      2.1 故障现象(泵叶轮磨损故障)

      2.2 案例来源

      2.3 DeepSeek分析

      2.4 人为检查故障结论

      2.5 结论对比

      3 案例三

      3.1 故障现船舶发电机故障)

      3.2 案例来源

      3.3 DeepSeek分析

      3.4 人为检查故障结论

      3.5 结论对比

      4 指令优化秘籍

      5 总结


      1 案例一

      1.1 故障现象(机床电机故障)

      CQ6230轻车床,运行中出现电机过热,主轴转动无力,伴随较大的振动和噪声。

      1.2 案例来源  

      https://baijiahao.baidu.com/s?id=1768598558332145715&wfr=spider&for=pc  

      1.3 DeepSeek分析  

      输入指令

      故障现象:CQ6230轻型车床,运行中出现电机过热,主轴转动无力,伴随较大的振动和噪声。

      分析结果

      1.4 人为检查故障结论

      初步检查三相电源电压正常,按照先机损后电路原则,拆下主轴电机传动皮带,手动转动电机,发现在转到某一特殊角度时有明显擦刮现象。打开电机,发现电机一端轴承严重损坏,导致转子偏心和定子铁芯相擦。更换轴承,并对定子铁芯修刮后重新浸漆,故障修复。  

       

      1.5 结论对比  

      DeepSeek在故障原因分析的第一部分提到了电机轴承损坏的可能性,可能导致电流异常和机械摩擦。同时在排查步骤中也提到了检查轴承状态,手动旋转是否有卡顿或异响,以及更换轴承的建议。  

      人工的实际处理步骤是先检查电源,然后机械部分,拆下皮带后测试电机,发现轴承问题。DeepSeek建议里也提到了断开电源检查电机轴是否卡滞,测量绝缘电阻,运行中检测电流等,这些步骤和人工的操作是一致的。  

      总体来说,DeepSeek的分析在故障原因和排查步骤上基本正确,覆盖了轴承问题,但可能在具体部件的区分(电机轴承与主轴轴承)以及定子修复方面不够详细。人工的实际操作验证了轴承损坏是主要原因,DeepSeek的建议虽然提供了正确的排查路径,帮助人工定位问题,但无法更精准地区分不同部件的可能性,并补充定子修复的步骤。


      2 案例二

      2.1 故障现象(泵叶轮磨损故障)

      泵长期以来稳定运行,各方向振动幅值在3mm/s以下,12月3日后泵振动缓慢增加至6mm/s左右。泵驱动端及非驱动端速度频谱中主要振动频率均为叶片通过频率63Hz及其谐频成分。  

      2.2 案例来源

      https://baijiahao.baidu.com/s?id=1763677487937342080&wfr=spider&for=pc

      2.3 DeepSeek分析

      输入指令

      泵长期以来稳定运行,各方向振动幅值在3mm/s以下,12月3日后泵振动缓慢增加至6mm/s左右。泵驱动端及非驱动端速度频谱中主要振动频率均为叶片通过频率63Hz及其谐频成分。  

      分析结果

      2.4 人为检查故障结论

      振动速度是在长期运行中逐渐爬升起来的,这就可以排除管道流阻的设计问题。初步判断为叶轮流体问题导致,因此决定对泵进行解体检查,结果发现:泵叶轮等过流件磨损严重。更换过流件部件后,泵振动恢复正常,振动速度降至3mm/s以下。

      2.5 结论对比

      DeepSeek列出导致故障发生可能的原因,包括叶轮磨损、气蚀、流量偏离、管道共振、叶轮松动和轴承问题。人工检查后的实际故障是叶轮磨损,在DeepSeek的分析中被列为最可能的原因之一,特别是叶轮磨损或异物附着导致动态失衡,进而激发叶片通过频率的振动。这点与实际情况吻合。  

      人工检查中实际进行了解体检查,直接发现叶轮磨损,DeepSeek给出的建议包括检查运行参数、叶轮状态、频谱细化分析、管道支撑和轴承检测。最终的实际解决方法是更换过流部件,与DeepSeek给出的解决方案中清理叶轮或更换磨损叶片的建议符合。  

      总体来说,DeepSeek分析在主要故障原因和排查步骤上与实际情况一致。


      3 案例三

      3.1 故障现象(船舶发电机故障

      船舶发电机故障:1号发电机故障,6月24号上午,船上值班轮机员发现1号发电机电压过低,故障原因不明。轮机长检查后发现原动机转速稳定,但电压不稳定,于是紧急起动2号发电机承载负荷,并将1号发电机解列后重启,但依然没有排除故障。

      3.2 案例来源

      https://www.thepaper.cn/newsDetail_forward_30214295

      3.3 DeepSeek分析

      输入指令

      轮船1号发电机电压过低,故障原因不明,轮机长检查后发现原动机转速稳定,但电压不稳定,于是紧急起动2号发电机承载负荷,并将1号发电机解列后重启,但依然没有排除故障。请分析1号发电机故障发生的主要原因。    

      分析结果

       



      3.4 人为检查故障结论

      经海事执法人员和修理工程师现场初步检查,怀疑1号发电机AVR(电压调节器)故障。在拆卸发电与励磁控制箱并检测后发现AVR(电压调节器)工作正常,但是励磁线圈输出电压不稳定。随后打开1号发电机盖板检查,发现联轴器震动较大,于是决定继续拆卸发电机上端励磁组。检查励磁线圈后发现励磁线圈擦伤严重,经测量励磁线圈对地绝缘电阻为26欧姆,远低于正常值。进一步拆卸发现发电机轴承损坏。

      3.5 结论对比  

      DeepSeek的分析中明确将励磁线圈故障 (如绝缘下降、短路)和机械连接问题 (联轴器震动)列为可能原因,与人为检查的故障结论中“励磁线圈擦伤、绝缘电阻低”以及“联轴器震动”高度吻合,但deepseek的分析未明确将轴承损坏作为独立潜在原因列出。在该案例中,轴承损坏是引发联轴器震动、转子偏心及励磁线圈擦伤的根本原因。  


      4 指令优化秘籍

      想要DeepSeek秒变“老师傅”?输入指令记住这3个【黄金法则】   

      1️⃣  现象具象化   

      ❌ 劣质输入:"设备震动大"  

      ✅ 优质输入:"垂直方向振动值从2mm/s升至6mm/s,1250Hz频段能量占比超30%"  

      2️⃣  状态全景描述   

      ❌ 劣质输入:"机器不工作了"  

      ✅ 优质输入:"急停前负载率85%,变频器报Err05,油温68℃(正常范围<60℃)"  

      3️⃣  数据对比锚点   

      ❌ 劣质输入:"温度有点高"  

      ✅ 优质输入:"轴承座温度较同工况历史均值+22℃,且温升速率快3倍"


       

      自动化模板推荐 

      [设备类型]:________(如离心泵/数控机床)    
      [异常现象]:________(数值变化+感官描述)    
      [关联参数]:________(振动/温度/电流等监测值)    
      [对比基准]:________(历史数据/同类设备参照值)    
      [特殊工况]:________(是否超负荷/环境突变等)  
       

      5 总结

      结合3个故障诊断实际案例,DeepSeek在输入大概的故障现象指令下,无需大量的先验知识可以给出主要的故障原因及操作步骤,与实际故障结论对比存在较高的相似性,给出的维修的步骤与人为操作步骤一致,可以有效提高故障诊断与故障维修的效率。  

      DeepSeek受限于提示指令,指令越详细给出的故障原因越准确,如何总结合适的故障诊断指令,细化输入文本,基于现有PHM(故障预测与健康管理)监测技术,自动触发数据关联分析(如自动关联同期振动频谱、温度梯度曲线), 快速详细对故障进行反应总结,缩短故障维修反应时间,可使DeepSeek诊断准确率大幅提升 。


      编辑:肖鑫鑫
      校核:李正平、陈凯歌、赵栓栓、曹希铭、赵学功、白亮、任超、海洋、Tina、陈宇航、陈莹洁、王金、赵诚
      该文案例资料搜集自网络,仅用作学术分享,不做商业用途,若侵权,后台联系小编进行删除


      来源:故障诊断与python学习
      振动旋转机械电源电路航空船舶海洋声学电机传动
      著作权归作者所有,欢迎分享,未经许可,不得转载
      首次发布时间:2025-03-09
      最近编辑:15小时前
      故障诊断与python学习
      硕士 签名征集中
      获赞 77粉丝 92文章 178课程 0
      点赞
      收藏
      作者推荐

      手把手教你安装GPU版Pytorch环境及手把手带大家跑通第一个故障诊断案例!!!(下)

      故障诊断方向而言,无论是信号处理、特征提取、故障分类还是寿命预测,所有的方法实现基本都依靠于Python代码,很多小白遇到的第一个拦路虎便是代码环境的配置。Pytorch是Python第三方库的一种,里面包含很多深度学习机器学习的函数,Pytorch本身有两个版本,一个是简便的CPU版本,一个是高速高效的GPU版本。另外代码编辑器可以直接用于编写、编辑和运行代码。它们提供了代码高亮、自动补全、代码调试、版本控制集成等功能,以提高开发效率和代码质量,也是故障诊断相关代码的必备工具之一。本期给大家带来Pytorch环境(Anaconda)安装教程,并附带代码编辑器配置过程。每一部分内容都附带推荐的视频教程以及教程链接,保证每一位故障诊断学习者都能搭建自己的代码平台。此外,后续文章还手把手带大家跑通第一个故障诊断案例,代码包含数据处理,1DCNN模型搭建,模型训练,以及模型评估等故障诊断完整过程,特别适合研一、研二小白入门。 本期涉及代码非常详细,所占篇幅也非常多,所以分三次呈现给大家,第1篇文章主要介绍主要介绍了Python环境以及各个软件环境安装【初学者必看教程 | 手把手教你安装GPU版Pytorch环境及手把手带大家跑通第一个故障诊断案例!!!(上)】。第2篇文章主要介绍西储大学数据集以及一些所需深度学习基础知识,文章后半部分讲解了本期代码的数据预处理以及数据切割等部分【初学者必看教程| 手把手教你安装GPU版Pytorch环境及手把手带大家跑通第一个故障诊断案例!!!(中)】。本篇为第3篇文章主要构建1DCNN模型框架以及模型训练模型检测等内容。数据集下载:通过点击最左下角的阅读原文进行下载。目录1 引言2 安装Anaconda 2.1 Anaconda介绍 2.2 Anaconda安装3 配置Pytorch环境(CPU版) 3.1 Pytorch介绍 3.2 Pytorch配置教程(CPU版)4 配置Pytorch环境(GPU版) 4.1 两种Pytorch区别(看是否支持GPU) 4.2 CUDA安装 4.3 Pytorch配置教程(GPU版)5 配置代码编辑器 5.1 代码编辑器区别 5.2 VScode编辑器 5.3 Pycharm编辑器 5.4 JupyterNotebook编辑器6 故障诊断代码示例 (重中之重) 6.1 代码介绍 6.2 检验Pytorch 6.3 故障诊断实战代码(模型构建及训练测试部分)注:小编能力有限,如有不恰之处,请多多指正~1 引 言在学习故障诊断相关代码时,拥有一个强大且灵活的开发环境是至关重要的。Anaconda和Pytorch正是这样的工具,它们为我们提供了一个完整的生态系统,用于进行数据分析、模型训练和部署,是目前常用的工具软件资源。虽然网上Anaconda及Pytorch安装教程资源比较丰富,但对一些细节部分,比如在安装GPU版本的Pytorch时,是否需要安装CUDA、以及如何查看CUDA版本等问题上仍存在一些歧义。本文将用通俗易懂的语言及方法带大家了解这些概念,并选择自己最合适的方法。此外,本文提供了下载GPU版Pytorch的快捷方式,以及通俗易懂的视频教程链接,为读者朋友们在安装过程中尽可能带来更多的便利。本期第2篇、第3篇提供了故障诊断实例以及学习代码的必备基础知识,代码包含数据处理,1DCNN模型搭建,模型训练,以及模型评估等故障诊断完整过程,为读者朋友们提供了基本的代码框架。总的来说,本期文章旨在为初学者及入门小白提供一个全面的指南,第1篇科普一些基本概念的同时,提供详细操作过程,帮助大家安装和配置Anaconda环境,以及在该环境中配置Pytorch(包含CPU和GPU两种版本)。此外,本期第2篇、第3篇还带大家学习一个完整故障诊断代码示例,深入学习故障诊断代码的各个框架,为接下来学习打下夯实的基础。无论您是在寻找一个全新的开发环境,还是希望优化现有的工作流程,本期文章都将为您提供必要的指导和资源。6 故障诊断代码示例6.1 代码介绍6.1.1 代码流程数据提取部分代码,把.mat文件中正常数据和12kHz驱动端数据提取成Datafram格式,接着通过预处理将数据划分为长度1024、重叠率0.5的多个样本。并转化为适合深度学习的tensor格式。模型搭建部分构建了1DCNN模型框架,然后模型训练部分调用基本1DCNN模型框架以及训练集验证集通过多次训练生成最佳模型,最后模型测试部分加载最佳模型和测试集并通过准确率,召回率,混淆矩阵等多指标检验模型效果。6.1.2 基础知识6.2 检验Pytorch6.3 故障诊断实战代码6.3.1 数据预处理注:第6节上半部分在上一篇【初学者必看教程| 手把手教你安装GPU版Pytorch环境及手把手带大家跑通第一个故障诊断案例!!!(中)】可查看。6.3.2 模型搭建 该部分定义VGG1DModel 模型,通过 CNN 部分提取输入数据的局部特征,然后通过自适应平均池化层将特征压缩为固定长度的向量,最后通过全连接层将特征映射到分类结果。这种结构适用于处理一维数据的分类任务,能够有效地捕捉数据中的特征并进行分类。代码分成:类定义和初始化、CNN 卷积池化结构构建、前向传播、模型实例化。import torchfrom joblib import dump, loadimport torch.utils.data as Dataimport numpy as npimport pandas as pdimport torchimport torch.nn as nn# 定义VGG-1D模型class VGG1DModel(nn.Module): #类定义和初始化 def __init__(self, batch_size, input_channels, conv_archs, num_classes): super(VGG1DModel, self).__init__() self.batch_size = batch_size # CNN参数 self.conv_arch = conv_archs # 网络结构 self.input_channels = input_channels # 输入通道数 self.features = self.make_layers() # 自适应平局池化 在这里做了改进,摒弃了 大参数量的三层全连接层,改为自适应平均池化来替代 self.avgpool = nn.AdaptiveAvgPool1d(1)# # 定义全连接层 self.classifier = nn.Linear(conv_archs[-1][-1], num_classes) # CNN卷积池化结构构建 def make_layers(self): layers = [] for (num_convs, out_channels) in self.conv_arch: for _ in range(num_convs): layers.append(nn.Conv1d(self.input_channels, out_channels, kernel_size=3, padding=1)) layers.append(nn.ReLU(inplace=True)) self.input_channels = out_channels layers.append(nn.MaxPool1d(kernel_size=2, stride=2)) return nn.Sequential(*layers) #前向传播 def forward(self,input_seq): # torch.Size([32, 1024]) #改变输入形状,适应网络输入[batch,dim, seq_length] input_seq = input_seq.view(self.batch_size, 1, 1024) # 送入CNN网络模型 features = self.features(input_seq) # 调用,torch.Size([32, 128, 128]) # 自适应平均池化 x = self.avgpool(features) # ttorch.Size([32, 128, 1]) # 平铺 flat_tensor = x.view(self.batch_size, -1) # torch.Size([32, 128]) output = self.classifier(flat_tensor) # torch.Size([32, 10]) return output(1) 类定义和初始化 __init__batch_size:批次大小,表示每次训练时同时处理的数据样本数量。input_channels:输入数据的通道数。对于一维数据,通常为 1。conv_archs:CNN 网络结构的配置,是一个列表,其中每个元素是一个元组,指定了每个卷积块中卷积层的数量和输出通道数。num_classes:输出的维度,即分类任务中的类别数。self.batch_size:存储传入的参数batch_size,即每批次样本数量。self.conv_arch :存储传入的参数conv_archs,即每个卷积块中卷积层的数量和输出通道数。self.input_channels :存储传入的参数input_channels,即输入数据的通道数。self.features:通过调用 self.make_layers() 方法构建 CNN 的卷积和池化层。self.avgpool:定义一个自适应平均池化层,用于将特征图的空间维度压缩为1。self.classifier:定义一个全连接层,用于将特征映射到输出类别。(2) CNN 卷积池化结构构建 make_layers作用:根据 conv_archs 和 input_channels 构建 CNN 的卷积和池化层。遍历 conv_archs 中的每个元组,每个元组表示一个卷积块。对于每个卷积块,根据指定的卷积层数量和输出通道数,添加相应数量的卷积层 和 ReLU 激活层。在每个卷积块的末尾添加一个最大池化层,用于降低特征图的空间维度。返回值:将构建的层组合成一个 nn.Sequential 模块并返回。(3) 前向传播forward输入数据处理:将输入数据 input_seq 重塑为 [batch_size, 1, 1024] 的形状,以适应网络的输入要求。这里假设输入数据的长度为 1024,且只有一个特征通道。通过 CNN 层:将输入数据通过 self.features,提取特征,得到 features。输出形状为 [batch_size, 128, 128]。自适应平均池化:使用 self.avgpool 对特征图进行全局平均池化,输出形状为 [batch_size, 128, 1]。展平操作:将池化后的特征展平为 [batch_size, 128] 的形状。通过全连接层:将展平后的特征通过 self.classifier 全连接层进行分类,输出最终的分类结果,形状为 [batch_size, num_classes]。(4) 模型实例化#模型实例化batch_size = 32conv_archs = conv_archs = ((2, 32), (1, 64), (1, 128)) # vgg11input_channels = 1 # 做 1 D卷积, 输入维度为1num_classes = 10model = VGG1DModel(batch_size, input_channels, conv_archs, num_classes)batch_size = 32:批次大小为 32。conv_archs = ((2, 32), (1, 64), (1, 128)):CNN 网络结构配置,表示有三个卷积块,第一个卷积块包含两个卷积层,输出通道数为 32;第二个卷积块包含一个卷积层,输出通道数为 64;第三个卷积块包含一个卷积层,输出通道数为 128。input_channels = 1:输入通道数为 1,表示一维卷积。num_classes = 10:输出类别数为 10。(5) 打印模型观察框架print(model)#检查模型框架图1 1DCNN模型结构根据输出结果可以看出这个VGG1DModel是一个为一维数据设计的卷积神经网络模型,它由一系列卷积层、激活层、池化层以及最后的全连接层组成。模型的输入层接受单通道的一维数据,随后通过两个具有32个输出通道的卷积层,每个卷积层后面紧跟一个ReLU激活函数,用于增加非线性。接着是一个最大池化层,用于降低特征图的维度。然后,模型通过一个具有64个输出通道的卷积层,再次应用ReLU激活,随后是第二个最大池化层。接下来,模型通过一个具有128个输出通道的卷积层和第三个最大池化层,这之后是一个自适应平均池化层,将特征图的每个维度缩减到1。最后,一个全连接层将128个输入特征映射到10个输出类别,通常用于分类任务。整个网络结构旨在通过层层抽象提取一维数据的特征,并最终实现有效的分类。6.3.3模型训练# 训练模型import timeimport torch.nn.functional as Fimport matplotlibimport matplotlib.pyplot as pltmatplotlib.rc(&quot;font&quot;, family=&#39;Microsoft YaHei&#39;)def model_train(batch_size, epochs, train_loader, val_loader, model, optimizer, loss_function): model = model.to(device) # 定义损失函数和优化函数 loss_function = nn.CrossEntropyLoss(reduction=&#39;sum&#39;) # loss learn_rate = 0.0003 optimizer = torch.optim.Adam(model.parameters(), learn_rate) # 优化器 # 样本长度 train_size = len(train_loader) * batch_size val_size = len(val_loader) * batch_size # 最高准确率 最佳模型 best_accuracy = 0.0 best_model = model train_loss = [] # 记录在训练集上每个epoch的loss的变化情况 train_acc = [] # 记录在训练集上每个epoch的准确率的变化情况 validate_acc = [] validate_loss = [] # 计算模型运行时间 start_time = time.time() for epoch in range(epochs): # 训练 model.train() loss_epoch = 0. #保存当前epoch的loss和 correct_epoch = 0 #保存当前epoch的正确个数和 for seq, labels in train_loader: seq, labels = seq.to(device), labels.to(device) # print(seq.size(), labels.size()) torch.Size([32, 7, 1024]) torch.Size([32]) # 每次更新参数前都梯度归零和初始化 optimizer.zero_grad() # 前向传播 y_pred = model(seq) # torch.Size([16, 10]) # 对模型输出进行softmax操作,得到概率分布 probabilities = F.softmax(y_pred, dim=1) # 得到预测的类别(最大概率的标签) predicted_labels = torch.argmax(probabilities, dim=1) # 与真实标签进行比较,计算预测正确的样本数量 # 计算当前batch预测正确个数 correct_epoch += (predicted_labels == labels).sum().item() # 损失计算 loss = loss_function(y_pred, labels) loss_epoch += loss.item() # 反向传播和参数更新 loss.backward() optimizer.step() # break # break # 计算准确率 train_Accuracy = correct_epoch/train_size train_loss.append(loss_epoch/train_size) train_acc.append(train_Accuracy) print(f&#39;Epoch: {epoch+1:2} train_Loss: {loss_epoch/train_size:10.8f} train_Accuracy:{train_Accuracy:4.4f}&#39;) # 每一个epoch结束后,在验证集上验证实验结果。 with torch.no_grad(): loss_validate = 0. correct_validate = 0 for data, label in val_loader: data, label = data.to(device), label.to(device) pre = model(data) # 对模型输出进行softmax操作,得到概率分布 probabilities = F.softmax(pre, dim=1) # 得到预测的类别 predicted_labels = torch.argmax(probabilities, dim=1) # 与真实标签进行比较,计算预测正确的样本数量 # 计算当前batch预测正确个数 correct_validate += (predicted_labels == label).sum().item() loss = loss_function(pre, label) loss_validate += loss.item() # print(f&#39;validate_sum:{loss_validate}, validate_Acc:{correct_validate}&#39;) val_accuracy = correct_validate/val_size &#39;&#39; print(f&#39;Epoch: {epoch+1:2} val_Loss:{loss_validate/val_size:10.8f}, validate_Acc:{val_accuracy:4.4f}&#39;) validate_loss.append(loss_validate/val_size) validate_acc.append(val_accuracy) # 如果当前模型的准确率优于之前的最佳准确率,则更新最佳模型 #保存当前最优模型参数 if val_accuracy &gt; best_accuracy: best_accuracy = val_accuracy best_model = model# 更新最佳模型的参数 # 保存最后的参数 # torch.save(model, &#39;final_model_1dvgg.pt&#39;) # 保存最好的参数 torch.save(best_model, &#39;best_model_1dvgg.pt&#39;) print(f&#39;\nDuration: {time.time() - start_time:.0f} seconds&#39;) # 保存结果 方便 后续画图处理 dump(train_loss, &#39;train_loss&#39;) dump(train_acc, &#39;train_acc&#39;) dump(validate_loss, &#39;validate_loss&#39;) dump(validate_acc, &#39;validate_acc&#39;) print(&quot;best_accuracy :&quot;, best_accuracy)# batch_size = 32epochs = 50# 模型训练model_train(batch_size, epochs, train_loader, val_loader, model, optimizer, loss_function)这段代码定义了一个 ’model_train‘的函数,用于训练一个深度学习模型。首先将模型移动到指定的设备上,计算训练集和验证集的样本总数,并初始化用于记录训练和验证过程中损失和准确率的列表以及存储最佳模型和最高准确率的变量。然后,在指定的训练轮数内,通过遍历训练数据加载器中的每个批次,进行前向传播、损失计算、反向传播和参数更新,同时记录每个 epoch 的训练损失和准确率。在每个 epoch 结束后,使用验证数据加载器评估模型性能,计算验证集的损失和准确率,并根据验证准确率更新最佳模型。最后,保存训练过程中最佳的模型参数到文件&#39;best_model_1dvgg.pt&#39;中,并计算模型训练的总运行时间。整个过程包含模型的训练、验证和性能评估等多个环节。图2 训练过程及结果(GPU版)根据代码结果可知,训练50次的情况下用时71s,其中验证集上最好的准确率是0.96,接着我们可以用曲线具体描述模型训练过程。import matplotlibimport matplotlib.pyplot as pltimport numpy as npfrom joblib import dump, loadmatplotlib.rc(&quot;font&quot;, family=&#39;Microsoft YaHei&#39;)# 加载数据train_loss = load(&#39;train_loss&#39;)train_acc = load(&#39;train_acc&#39;)validate_loss = load(&#39;validate_loss&#39;)validate_acc = load(&#39;validate_acc&#39;)# 创建训练损失图# 创建左侧图:损失plt.figure(figsize=(14, 7), dpi=300)plt.subplot(1, 2, 1)plt.plot(train_loss, label=&#39;Train-loss&#39;, marker=&#39;^&#39;, color=&#39;blue&#39;) # o ^ * s + x , marker=&#39;o&#39;plt.plot(validate_loss, label=&#39;Validate-loss&#39;, marker=&#39;+&#39;, color=&#39;red&#39;) # 颜色 曲线类型 可灵活替换plt.xlabel(&#39;Epochs&#39;, fontsize=12)plt.ylabel(&#39;Loss&#39;, fontsize=12)plt.xticks(fontsize=10)plt.yticks(fontsize=10)plt.legend(fontsize=12)plt.title(&#39;training visualization : Training and Validation Loss&#39;, fontsize=16)# 创建右侧图:准确率plt.subplot(1, 2, 2)plt.plot(train_acc,color = &#39;orange&#39;, marker=&#39;o&#39;,label = &#39;Train-accuracy&#39;)plt.plot(validate_acc, color = &#39;green&#39;, marker=&#39;*&#39;,label = &#39;Validate_accuracy&#39;)plt.xlabel(&#39;Epochs&#39;, fontsize=12)plt.ylabel(&#39;Accuracy&#39;, fontsize=12)plt.xticks(fontsize=10)plt.yticks(fontsize=10)plt.legend(fontsize=12)plt.title(&#39; training visualization : Training and Validation Accuracy&#39;, fontsize=16)plt.tight_layout() # 用于确保子图之间的距离适当plt.show()这段代码加载训练过程中的各个结果,其中train_loss代表训练集损失值、train_acc代表训练集准确率、validate_loss代表验证集损失值、validate_acc代表验证集准确率,并通过曲线图绘制训练过程,包含每次训练的准确率以及损失函数变化。图3 训练过程曲线结果如图所示,其中左图蓝色曲线是训练集损失函数变化,红色是验证集损失函数,右图中黄色是验证集准确率变化曲线,绿色是验证集准确率变化曲线。随着训练次数增加,损失函数逐渐减少,准确率逐渐增加趋近于1。6.3.4 模型验证模型验证部分代码首先用测试集输入最佳模型,并通过折线图以及准确率、召回率等指标检验模型效果,最后通过混淆矩阵进一步分析实验结果。# 模型 测试集 验证 from sklearn.metrics import confusion_matriximport torch.nn.functional as Fdevice = torch.device(&quot;cuda&quot; if torch.cuda.is_available() else &quot;cpu&quot;) # 有GPU先用GPU训练print(device)# 得出每一类的分类准确率model = torch.load(&#39;best_model_1dvgg.pt&#39;)model = model.to(device)# 使用测试集数据进行推断并计算每一类的分类准确率true_labels = [] # 存储类别标签predicted_labels = [] # 存储预测的标签with torch.no_grad(): for test_data, test_label in test_loader: # 将模型设置为评估模式 model.eval() test_data = test_data.to(device) test_output = model(test_data) probabilities = F.softmax(test_output, dim=1) predicted = torch.argmax(probabilities, dim=1) true_labels.extend(test_label.tolist()) predicted_labels.extend(predicted.tolist())# 混淆矩阵confusion_mat = confusion_matrix(true_labels, predicted_labels)from sklearn.metrics import classification_report# 计算每一类的分类准确率report = classification_report(true_labels, predicted_labels, digits=4)print(report)首先,代码设置了一个设备变量 &#39;device&#39;,用于确定模型将在 CPU 还是 GPU 上运行。如果系统中有可用的 CUDA(GPU)设备,&#39;device&#39;将被设置为 &quot;cuda&quot;,否则将使用 &quot;cpu&quot;。然后,打印出当前选择的设备,以确认模型将在哪个设备上运行。接下来,代码加载了预训练的最佳模型参数文件 &#39;best_model_1dvgg.pt&#39;,并将模型移动到之前设置的设备上。true_labels用于存储测试集的真实标签、predicted_labels用于存储测试集预测标签。然后,代码进入一个 &#39;with torch.no_grad()&#39; 块,这个上下文管理器用于禁用梯度计算,因为在推断过程中不需要计算梯度,这样可以减少内存消耗和加快计算速度。在该块内,代码遍历测试数据加载器&#39;test_loader&#39;中的每个批次数据 &#39;test_data&#39; 和对应的标签 &#39;test_label&#39;。对于每个批次的数据,将模型设置为评估模式 &#39;model.eval()&#39;,这会关闭模型中的一些特定于训练的行为,如 &#39;Dropout&#39; 层。接着,将测试数据移动到指定的设备上,并进行前向传播 &#39;est_output = model(test_data)&#39;,得到模型对测试数据的输出。然后,对模型输出进行 &#39;softmax&#39; 操作 &#39;F.softmax(test_output, dim=1)&#39;,得到每个类别的概率分布。使用 &#39;torch.argmax(probabilities, dim=1)&#39;获取预测的类别标签,并将真实标签和预测标签分别添加到&#39;true_labels&#39;和 &#39;predicted_labels&#39;列表中。在完成所有测试数据的推断后,代码使用 &#39;confusion_matrix`&#39;函数计算混淆矩阵。混淆矩阵的行表示真实标签,列表示预测标签,矩阵中的每个元素表示对应类别对的样本数量。最后,代码使用 &#39;classification_report&#39;函数生成一个文本报告,显示主要的分类指标,包括精确率、召回率、F1 分数和支持度。&#39;digits=4&#39;参数表示结果保留四位小数。打印出分类报告,以查看每一类的分类准确率和其他指标,从而评估模型在测试集上的整体性能。图4 测试集文本报告根据生成文本报告,我们可以初步判断在调用训练得到的最佳模型对测试集检验时,标签0、标签1、标签3、标签7、标签9的F1得分达到了百分百,总体准确率为0.93。注:在机器学习和数据科学中,评价指标是用来衡量模型性能的标准。不同的问题类型(如分类、回归、聚类等)会使用不同的评价指标。以下是一些常见的评价指标:1) 分类问题的评价指标:准确率(Accuracy):正确预测的样本数占总样本数的比例。精确率(Precision):预测为正类的样本中实际为正类的比例。召回率(Recall):所有实际为正类的样本中,被正确预测为正类的比例。F1-score:精确率和召回率的调和平均数。AUC-ROC曲线:接收者操作特征曲线下的面积,用于衡量模型区分正负类的能力。混淆矩阵(Confusion Matrix):显示真实类别与预测类别之间的关系。 宏平均(Macro Average):这种方法计算每个类别的指标(如精确度、召回率、F1分数等),然后取这些指标的算术平均值。它对所有类别给予相同的权重,不考虑类别之间的样本数量差异。这意味着每个类别对最终的宏平均指标的贡献是相同的。 加权平均(Weighted Average):与宏平均不同,加权平均在计算指标时会考虑每个类别的样本数量。它为每个类别的指标赋予权重,这个权重通常是该类别样本数量占总样本数量的比例。因此,样本数量较多的类别对最终的加权平均指标的贡献更大 。2) 回归问题的评价指标:均方误差(Mean Squared Error, MSE):预测值与真实值差的平方的平均值。均方根误差(Root Mean Squared Error, RMSE):MSE的平方根。平均绝对误差(Mean Absolute Error, MAE):预测值与真实值差的绝对值的平均值例如,我们通过加载上述混淆矩阵并画出具体矩阵图分析模型效果。# 绘制混淆矩阵import matplotlib.pyplot as pltimport seaborn as sns# 原始标签和自定义标签的映射label_mapping = { 0: &quot;C1&quot;,1: &quot;C2&quot;,2: &quot;C3&quot;,3: &quot;C4&quot;,4: &quot;C5&quot;, 5: &quot;C6&quot;,6: &quot;C7&quot;,7: &quot;C8&quot;,8: &quot;C9&quot;,9: &quot;C10&quot;,}# 绘制混淆矩阵plt.figure(figsize=(10, 8), dpi=300)sns.heatmap(confusion_mat, xticklabels=label_mapping.values(), yticklabels=label_mapping.values(),annot=True, fmt=&#39;d&#39;, cmap=&#39;summer&#39;)plt.xlabel(&#39;Predicted Labels&#39;)plt.ylabel(&#39;True Labels&#39;)plt.title(&#39;Confusion Matrix&#39;)plt.show()图5 测试集混淆矩阵如图,混淆矩阵的行表示真实标签,列表示预测标签,矩阵中的每个元素表示对应类别对的样本数量。例如对标签2数据分析可知,标签2真实数据有48个,其中45个预测为标签2,有3个预测为标签8。在所有预测为标签2的数据中,有45个是正确的,其中1个标签5和4个标签8错误的预测为标签2。混淆矩阵那可以非常直观明了确定真实标签以及预测标签的分布情况。6.3.5 对比CPU版Pytorch图6 训练过程及结果(CPU版)通过对比可得,在简单的基础模型条件下,使用GPU计算可比CPU计算节省一半时间,在更复杂的数据及模型中GPU的运算速度及优势将更为明显。编辑:赵栓栓校核:李正平、陈凯歌、曹希铭、赵学功、白亮、王金、陈莹洁、陈宇航、任超、海洋、Tina、赵诚该文资料搜集自网络,仅用作学术分享,不做商业用途,若侵权,后台联系小编进行删除点击左下角阅读原文,即可在线阅读论文。 来源:故障诊断与python学习

      未登录
      还没有评论
      课程
      培训
      服务
      行家
      VIP会员 学习计划 福利任务
      下载APP
      联系我们
      帮助与反馈