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

本项目为飞桨领航团AI达人创造营第二期作业。
在电机生产线上普遍采用人工听音的方法分辨良、次品,不仅成本高,而且重复、单调的听音工作极易引起人员疲劳,容易出现误判,若个别不良品混入整批成品中,会给工厂带来严重经济损失,甚至严重影响产品声誉。
(数据对应的比赛)本次大赛要求参赛者基于加速度传感器采集的振动信号,利用机器学习、深度学习等人工智能技术,设计智能检验的算法,要求算法对故障电机不能有漏识别,在召回100%的情况下,尽量提高预测准确率,以达到替代人工质检的目的。
文件清单:
每个样本包含F和B两份csv,每个csv文件包含79999×2个数据。使用多个全连接层进行预测。使用的损失函数为交叉熵。
模型如下:
! unzip -oq data/data31822/Motor_tain.zip! unzip -oq data/data31822/Motor_testP.zip
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')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)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) break0 [16, 159998] [16, 159998] [16]
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 xmodel = 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 |
# 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())]+=1recordarray([[455., 45.],
[ 0., 480.]])本项目使用了极简方式构造了一个电机异音AI诊断模型,最终结果表明模型可以将全部正样本(异常)都判断正确,并且负样本的占比为9%。除去模型效果的因素外,本项目有以下不足,可以继续改进:
以上就是【AI达人创造营第二期】电机异音AI诊断的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号