0

0

【AI达人创造营第二期】电机异音AI诊断

P粉084495128

P粉084495128

发布时间:2025-07-23 11:09:47

|

831人浏览过

|

来源于php中文网

原创

本项目针对电机异音AI诊断,利用飞桨平台构建模型。因人工质检易误判,项目基于振动信号,用机器学习技术实现智能检验,要求故障电机零漏检。通过复制正样本解决数据不平衡,修改损失函数,用全连接层训练。结果显示正样本全对,负样本准确率91%,可改进为卷积层并设验证集。

☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜

【ai达人创造营第二期】电机异音ai诊断 - php中文网

电机异音AI诊断

本项目为飞桨领航团AI达人创造营第二期作业。

项目背景

在电机生产线上普遍采用人工听音的方法分辨良、次品,不仅成本高,而且重复、单调的听音工作极易引起人员疲劳,容易出现误判,若个别不良品混入整批成品中,会给工厂带来严重经济损失,甚至严重影响产品声誉。

(数据对应的比赛)本次大赛要求参赛者基于加速度传感器采集的振动信号,利用机器学习、深度学习等人工智能技术,设计智能检验的算法,要求算法对故障电机不能有漏识别,在召回100%的情况下,尽量提高预测准确率,以达到替代人工质检的目的。

数据说明

文件清单:

  1. Motor_tain.zip:用于训练的采集数据,其中,文件夹“正样本”包含30个异常电机的数据样本,文件夹“负样本”包含500个正常电机的数据样本;
  2. Motor_testP.zip:用于测试的采集数据,包含500个电机的数据样本;
    文件说明:采集数据时是分别对电机正转、反转时的振动信号进行采集。也就是说每台电机有两条数据,其中F代表正转,B代表反转。每条数据包含两路振动信号,数据文件命名规则:编号_旋转方向.csv。比赛链接:http://jingsai.julyedu.com/v/25820185621432447/dataset.jhtml

项目方案

每个样本包含F和B两份csv,每个csv文件包含79999×2个数据。使用多个全连接层进行预测。使用的损失函数为交叉熵。

Cardify卡片工坊
Cardify卡片工坊

使用Markdown一键生成精美的小红书知识卡片

下载

模型如下:

【AI达人创造营第二期】电机异音AI诊断 - php中文网        

处理方案

  1. 重采样:针对数据不平衡,复制多份正向样本,从而训练时达到类别均衡采样的效果
  2. 修改损失:针对题目要求的保证TP最大,尽可能减小FP的问题,将label==1的损失权重设定为1.1。

代码

预处理

In [1]
! unzip -oq data/data31822/Motor_tain.zip! unzip -oq data/data31822/Motor_testP.zip
   
In [31]
import os

train_pos_dir='Motor_tain/╒¤╤∙▒╛/'train_neg_dir='Motor_tain/╕║╤∙▒╛/'# 生成三份文件便于按照类别比例划分with open('train_pos.txt','w') as f:    for item in list(set([item[:len(item)-6] for item in os.listdir(train_pos_dir)])):        if '.ipynb' not in item:
            f.write(train_pos_dir+item+'\t1\n')with open('train_neg.txt','w') as f:    for item in list(set([item[:len(item)-6] for item in os.listdir(train_neg_dir)])):        if '.ipynb' not in item:
            f.write(train_neg_dir+item+'\t0\n')with open('train.txt','w') as f:    for item in list(set([item[:len(item)-6] for item in os.listdir(train_pos_dir)])):        if '.ipynb' not in item:            for i in range(int(500/30)):
                f.write(train_pos_dir+item+'\t1\n')    for item in list(set([item[:len(item)-6] for item in os.listdir(train_neg_dir)])):        if '.ipynb' not in item:
            f.write(train_neg_dir+item+'\t0\n')
   

构造读取器

In [33]
import paddleimport numpy as npimport paddle.vision.transforms as Tfrom PIL import Imageimport pandas as pdclass MyDateset(paddle.io.Dataset):
    def __init__(self,txt_dir):
        super(MyDateset, self).__init__()
        
        self.path=[]
        self.label=[]        with open(txt_dir,'r') as f:            for line in f.readlines():
                self.path.append(line.split('\t')[0])
                self.label.append(line.split('\t')[1][0])    def __getitem__(self, index):
        path = self.path[index]
        label = int(self.label[index])

        F=pd.read_csv(path+'_F.csv')
        B=pd.read_csv(path+'_B.csv')

        F=paddle.to_tensor(F.values).flatten(0).astype('float32')
        B=paddle.to_tensor(B.values).flatten(0).astype('float32')

        label = np.array(label).astype('int64')        return F,B,label    def __len__(self):
        return len(self.label)
   
In [34]
train_dataset=MyDateset('train.txt')

train_dataloader = paddle.io.DataLoader(
    train_dataset,
    batch_size=16,
    shuffle=True,
    drop_last=False)for step, data in enumerate(train_dataloader):
    F, B, label = data    print(step, F.shape, B.shape, label.shape)    break
       
0 [16, 159998] [16, 159998] [16]
       

构造网络模型

In [35]
class MyNet(paddle.nn.Layer):
    def __init__(self):
        super(MyNet,self).__init__()
        self.fc_F = paddle.nn.Linear(in_features=159998, out_features=2000)
        self.fc_B = paddle.nn.Linear(in_features=159998, out_features=2000)

        self.fc_1  = paddle.nn.Linear(in_features=4000, out_features=1000)
        self.fc_2  = paddle.nn.Linear(in_features=1000, out_features=200)
        self.fc_3  = paddle.nn.Linear(in_features=200, out_features=2)    def forward(self,F,B):
        F = self.fc_F(F)
        B = self.fc_B(B)
        x = paddle.concat([F,B],axis=-1)
        x = self.fc_1(x)        # x = paddle.nn.functional.relu(x)
        x = self.fc_2(x)        # x = paddle.nn.functional.relu(x)
        x = self.fc_3(x)        return x
   

训练

In [38]
model = MyNet()
model.train()

max_epoch=10opt = paddle.optimizer.SGD(learning_rate=0.001, parameters=model.parameters())

now_step=0for epoch in range(max_epoch):    for step, data in enumerate(train_dataloader):
        now_step+=1

        F, B, label = data
        pre = model(F,B)
        loss = paddle.nn.functional.cross_entropy(pre,label,weight=paddle.to_tensor([1,1.1]),reduction='mean')
        loss.backward()
        opt.step()
        opt.clear_gradients()        if now_step%100==0:            print("epoch: {}, batch: {}, loss is: {}".format(epoch, step, loss.mean().numpy()))

paddle.save(model.state_dict(), 'model.pdparams')
       
epoch: 1, batch: 37, loss is: [0.631444]
epoch: 3, batch: 13, loss is: [0.63104683]
epoch: 4, batch: 51, loss is: [0.63319224]
epoch: 6, batch: 27, loss is: [0.5660453]
epoch: 8, batch: 3, loss is: [0.5968682]
epoch: 9, batch: 41, loss is: [0.5927209]
       

查看混淆矩阵

格式为


预测为0 预测为1
实际为0 value value
实际为1 value value
In [39]
# mydict = paddle.load("model_1.pdparams")# model.set_state_dict(mydict)record=np.zeros([2,2])for i in range(len(train_dataset)):
    F,B,label=train_dataset[i]
    pre=model(F,B)    # print(f'real label: {label} pre label: {np.argmax(pre.numpy())}')
    record[label.tolist()][np.argmax(pre.numpy())]+=1record
       
array([[455.,  45.],
       [  0., 480.]])
               

总结

本项目使用了极简方式构造了一个电机异音AI诊断模型,最终结果表明模型可以将全部正样本(异常)都判断正确,并且负样本的占比为9%。除去模型效果的因素外,本项目有以下不足,可以继续改进:

  1. 本项目构造了一个简单的全连接层网络模型,但由于数据量较大,需要在第一个全连接层尽可能地压缩节点数。可以尝试使用卷积替换全连接层。
  2. 由于样本量较少(正向样本仅30个),仅设置了训练集,没有设定验证集。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
页面置换算法
页面置换算法

页面置换算法是操作系统中用来决定在内存中哪些页面应该被换出以便为新的页面提供空间的算法。本专题为大家提供页面置换算法的相关文章,大家可以免费体验。

502

2023.08.14

http500解决方法
http500解决方法

http500解决方法有检查服务器日志、检查代码错误、检查服务器配置、检查文件和目录权限、检查资源不足、更新软件版本、重启服务器或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

498

2023.11.09

http请求415错误怎么解决
http请求415错误怎么解决

解决方法:1、检查请求头中的Content-Type;2、检查请求体中的数据格式;3、使用适当的编码格式;4、使用适当的请求方法;5、检查服务器端的支持情况。更多http请求415错误怎么解决的相关内容,可以阅读下面的文章。

453

2023.11.14

HTTP 503错误解决方法
HTTP 503错误解决方法

HTTP 503错误表示服务器暂时无法处理请求。想了解更多http错误代码的相关内容,可以阅读本专题下面的文章。

3632

2024.03.12

http与https有哪些区别
http与https有哪些区别

http与https的区别:1、协议安全性;2、连接方式;3、证书管理;4、连接状态;5、端口号;6、资源消耗;7、兼容性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2927

2024.08.16

传感器故障解决方法
传感器故障解决方法

传感器故障排除指南:识别故障症状(如误读或错误代码)。检查电源和连接(确保连接牢固,无损坏)。校准传感器(遵循制造商说明)。诊断内部故障(目视检查、信号测试、环境影响评估)。更换传感器(选择相同规格,遵循安装说明)。验证修复(检查信号准确性,监测异常行为)。

499

2024.06.04

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

42

2026.03.13

Python异步编程与Asyncio高并发应用实践
Python异步编程与Asyncio高并发应用实践

本专题围绕 Python 异步编程模型展开,深入讲解 Asyncio 框架的核心原理与应用实践。内容包括事件循环机制、协程任务调度、异步 IO 处理以及并发任务管理策略。通过构建高并发网络请求与异步数据处理案例,帮助开发者掌握 Python 在高并发场景中的高效开发方法,并提升系统资源利用率与整体运行性能。

79

2026.03.12

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

234

2026.03.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
10分钟--Midjourney创作自己的漫画
10分钟--Midjourney创作自己的漫画

共1课时 | 0.1万人学习

Midjourney 关键词系列整合
Midjourney 关键词系列整合

共13课时 | 0.9万人学习

AI绘画教程
AI绘画教程

共2课时 | 0.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号