简单的基于Transformer的滚动轴承故障诊断(Pytorch)

news2024/11/24 11:05:33

递归神经网络在很长一段时间内是序列转换任务的主导模型,其固有的序列本质阻碍了并行计算。因此,在2017年,谷歌的研究人员提出了一种新的用于序列转换任务的模型架构Transformer,它完全基于注意力机制建立输入与输出之间的全局依赖关系。在训练阶段,Transformer可以并行计算,大大减小了模型训练难度,提高了模型训练效率。Transformer由编码器和解码器两部分构成。其编解码器的子模块为多头注意力MHA和前馈神经网络FFN。此外,Transformer还利用了位置编码、层归一化、残差连接、dropout等技巧来增强模型性能。

图片

鉴于此,简单地采用Transformer对滚动轴承进行故障诊断,没有经过什么修改,效果不是很好,准确率较低,数据集采用江南大学轴承数据集。

import numpy as npimport torchimport torch.nn as nnimport torch.nn.functional as Fimport torch.optim as optimimport scipy.io as ioimport pandas as pdimport matplotlib.pyplot as pltfrom torch.utils.data import Dataset, DataLoader

d_k = 64d_v = 64class ScaledDotProductAttention(nn.Module):    def __init__(self):        super(ScaledDotProductAttention, self).__init__()    def forward(self, Q, K, V):        scores = torch.matmul(Q, K.transpose(-1, -2)) / np.sqrt(d_k)        weights = nn.Softmax(dim=-1)(scores)        context = torch.matmul(weights, V)        return context, weights
# Q = torch.randint(0, 9, (4, 8, 512)).to(torch.float32)# K = torch.randint(0, 4, (4, 8, 512)).to(torch.float32)# V = torch.randint(0, 2, (4, 8, 512)).to(torch.float32)# SDPA = ScaledDotProductAttention()# context, weights = SDPA(Q, K, V)
# print(weights.shape)# print(V.shape)# print(context.shape)

d_embedding = 512n_heads = 2batch_size = 32seq_len = 4class MultiHeadAttention(nn.Module):    def __init__(self):        super(MultiHeadAttention, self).__init__()        self.W_Q = nn.Linear(d_embedding, d_k*n_heads)        self.W_K = nn.Linear(d_embedding, d_k*n_heads)        self.W_V = nn.Linear(d_embedding, d_v*n_heads)        self.Linear = nn.Linear(n_heads*d_v, d_embedding)        self.layer_norm = nn.LayerNorm(d_embedding)    def forward(self, Q, K, V):        residual, batch_size = Q, Q.size(0)        # input[batch_size, len, d_embedding]->output[batch_size, len, d_k*n_heads]->        # {view}->output[batch_size, len, n_heads, d_k]->{transpose}->output[batch_size, n_heads, len, d_k]        q_s = self.W_Q(Q).view(batch_size, -1, n_heads, d_k).transpose(1, 2)         k_s = self.W_K(K).view(batch_size, -1, n_heads, d_k).transpose(1, 2)        v_s = self.W_V(V).view(batch_size, -1, n_heads, d_v).transpose(1, 2)        context, weights = ScaledDotProductAttention()(q_s, k_s, v_s)        context = context.transpose(1, 2).contiguous().view(batch_size, -1, n_heads*d_v)        output = self.Linear(context)        output = self.layer_norm(output + residual)        return output, weights# data = torch.randn([4, 4, 512])# # [4, 4, 512]->[4, 4, 2, 64]->[4, 2, 4, 64]->{SDPA}->[4, 2, 4, 64]->{transpose}->[4, 4, 2, 64]->{view}->[4, 4, 128]->{Linear}->[4, 4, 512]# # q_s.shape[4, 2, 4, 64]=[batch_size, n_heads, len, d_v]->weight = q_s .* k_s = [4, 2, 4, 4]->weight .* q_v = [4, 2, 4, 64]# MHA = MultiHeadAttention()# output, weights = MHA(data, data, data)# print(output.shape, weights.shape)

class PoswiseFeedForward(nn.Module):    def __init__(self, d_ff=1024):        super(PoswiseFeedForward, self).__init__()        self.conv1 = nn.Conv1d(in_channels=d_embedding, out_channels=d_ff, kernel_size=1)        self.conv2 = nn.Conv1d(in_channels=d_ff, out_channels=d_embedding, kernel_size=1)        self.layernorm = nn.LayerNorm(d_embedding)    def forward(self, inputs):        residual = inputs        output = nn.ReLU()(self.conv1(inputs.transpose(1, 2)))        output = self.conv2(output).transpose(1, 2)        output = self.layernorm(output + residual)        return output# data = torch.randn([4, 4, 512])# PFF = PoswiseFeedForward()# output = PFF(data)# print(output.shape)


class EncoderLayer(nn.Module):    def __init__(self):        super(EncoderLayer, self).__init__()        self.enc_self_attn = MultiHeadAttention()        self.pos_ffn = PoswiseFeedForward()    def forward(self, enc_inputs):        enc_outputs, attn_weights = self.enc_self_attn(enc_inputs, enc_inputs, enc_inputs)        enc_outputs = self.pos_ffn(enc_outputs)        return enc_outputs, attn_weights


n_layers = 2num_classes = 4
class Encoder(nn.Module):    def __init__(self):        super(Encoder, self).__init__()        self.layers = nn.ModuleList(EncoderLayer() for _ in range(n_layers))        self.linear = nn.Linear(seq_len * d_embedding, num_classes)    def forward(self, enc_inputs):        for layer in self.layers:            enc_outputs, _ = layer(enc_inputs)        enc_outputs = enc_outputs.view(-1, seq_len * d_embedding)        enc_outputs = self.linear(enc_outputs)        return enc_outputs

from sklearn.model_selection import train_test_splitfrom torch.utils.data import TensorDataset, DataLoaderimport os
gpu = "0"os.environ['CUDA_DEVICE_ORDER'] = 'PCI_BUS_ID'os.environ['CUDA_VISIBLE_DEVICES'] = gpudevice = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu')
epochs = 200lr = 0.0001

normal_data = torch.cat([torch.Tensor(pd.read_csv('./dataset/n600_3_2.csv', header=None).values[:409600].reshape(-1, seq_len, d_embedding)).to(torch.float32),\                           torch.Tensor(pd.read_csv('./dataset/n800_3_2.csv', header=None).values[:409600].reshape(-1, seq_len, d_embedding)).to(torch.float32),\                           torch.Tensor(pd.read_csv('./dataset/n1000_3_2.csv', header=None).values[:409600].reshape(-1, seq_len, d_embedding)).to(torch.float32)], dim=0)           
inner_data = torch.cat([torch.Tensor(pd.read_csv('./dataset/ib600_2.csv', header=None).values[:409600].reshape(-1, seq_len, d_embedding)).to(torch.float32),\                          torch.Tensor(pd.read_csv('./dataset/ib800_2.csv', header=None).values[:409600].reshape(-1, seq_len, d_embedding)).to(torch.float32),\                          torch.Tensor(pd.read_csv('./dataset/ib1000_2.csv', header=None).values[:409600].reshape(-1, seq_len, d_embedding)).to(torch.float32)])
outer_data = torch.cat([torch.Tensor(pd.read_csv('./dataset/ob600_2.csv', header=None).values[:409600].reshape(-1, seq_len, d_embedding)).to(torch.float32),\                          torch.Tensor(pd.read_csv('./dataset/ob800_2.csv', header=None).values[:409600].reshape(-1, seq_len, d_embedding)).to(torch.float32),\                          torch.Tensor(pd.read_csv('./dataset/ob1000_2.csv', header=None).values[:409600].reshape(-1, seq_len, d_embedding)).to(torch.float32)])
roller_data = torch.cat([torch.Tensor(pd.read_csv('./dataset/tb600_2.csv', header=None).values[:409600].reshape(-1, seq_len, d_embedding)).to(torch.float32),\                           torch.Tensor(pd.read_csv('./dataset/tb800_2.csv', header=None).values[:409600].reshape(-1, seq_len, d_embedding)).to(torch.float32),\                           torch.Tensor(pd.read_csv('./dataset/tb1000_2.csv', header=None).values[:409600].reshape(-1, seq_len, d_embedding)).to(torch.float32)])
data = torch.cat((normal_data, inner_data, outer_data, roller_data), dim=0)labels = torch.cat([torch.Tensor(np.repeat(i, normal_data.shape[0])).to(torch.long) for i in range(num_classes)])x_train, x_test, y_train, y_test = train_test_split(data, labels, test_size=0.3)
train_dataset = TensorDataset(x_train, y_train)test_dataset = TensorDataset(x_test, y_test)
train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True)test_loader = DataLoader(test_dataset, batch_size=batch_size, shuffle=True)

model = Encoder()model = model.to(device)
criterion = nn.CrossEntropyLoss()optimizer = optim.Adam(model.parameters(), lr=lr)
epoch_counter = []# train_counter = [i for i in range(1, EPOCH + 1)]# test_counter = [i for i in range(1, EPOCH + 1)]train_error = []test_error = []
train_acc = []train_loss = []test_acc = []test_loss = []
for epoch in range(epochs):    print('------------------------\nEpoch: %d------------------------' % (epoch + 1))    model.train()    sum_loss = 0.0    correct = 0.0    total = 0.0    for i, data in enumerate(train_loader, 0):        length = len(train_loader)        inputs, labels = data        inputs, labels = inputs.to(device), labels.to(device)        optimizer.zero_grad()        outputs = model(inputs)        loss = criterion(outputs, labels)        loss.backward()        optimizer.step()        sum_loss += loss.item()        _, predicted = torch.max(outputs.data, 1) # predicted denotes indice of the max number in output's second dimension        total += labels.size(0)        correct += predicted.eq(labels.data).cpu().sum()        print('[epoch:%d, iter:%d] Loss: %.03f | Acc: %.3f%% ' % (epoch + 1, (i + 1 + epoch * length), sum_loss / (i + 1), 100. * correct / total))    epoch_counter.append(epoch+1)    train_loss.append(sum_loss / len(train_loader))    train_acc.append(correct / total)    train_error.append(100. - 100. * correct / total)
    print("-------------------TEST------------------")    with torch.no_grad():        real_label = []        pred_label = []        sum_test_loss = 0.0        correct_test = 0        total_test = 0 # num of total test samples        for data in test_loader:            model.eval()            input_test, label_test = data            input_test, label_test = input_test.to(device), label_test.to(device)            output_test = model(input_test)            test_losses = criterion(output_test, label_test)            sum_test_loss += test_losses.item()            _, predicted_test = torch.max(output_test.data, 1)            total_test += label_test.size(0)            correct_test += (predicted_test == label_test.data).cpu().sum()            real_label.append(label_test.cpu())            pred_label.append(predicted_test.cpu())        test_loss.append(sum_test_loss / len(test_loader))        test_acc.append(correct_test / total_test)        print('=================测试分类准确率为:%.2f%%===================' % (100. * correct_test / total_test))        acc = 100. * correct / total

real_label = np.array(torch.cat(real_label, dim=0))pred_label = np.array(torch.cat(pred_label, dim=0))def save_np_files(filename, data):    np.save('./acc&loss/' + filename + '.npy', np.array(data))

save_np_files("real_label", real_label)save_np_files("pred_label", pred_label)save_np_files("epoch", epoch_counter)save_np_files("train_acc", train_acc)save_np_files("train_loss", train_loss)save_np_files("test_acc", test_acc)save_np_files("test_loss", test_loss)

train_acc = np.load('./acc&loss/train_acc.npy')train_loss = np.load('./acc&loss/train_loss.npy')test_acc = np.load('./acc&loss/test_acc.npy')test_loss = np.load('./acc&loss/test_loss.npy')epoch = np.load('./acc&loss/epoch.npy')plt.figure(figsize=(8, 4))
plt.subplot(121)plt.plot(epoch, train_acc, label="train_acc")plt.plot(epoch, test_acc, label="test_acc")plt.legend()plt.subplot(122)plt.plot(epoch, train_loss, label="train_loss")plt.plot(epoch, test_loss, label="test_loss")plt.legend()plt.tight_layout()plt.show()

图片

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1817550.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

计算机图形学入门09:深度缓存

在前面知道了怎么将一个三角形显示到屏幕上,那么如果有很多三角形,各自距离相机的远近也不一样,并且三角形会相互遮挡。也就是三维空间中有很多物体,通常近处的物体会遮挡住远处的物体,那么在计算机渲染中该如何处理呢…

出现 Error creating bean with name xxx defined in class 的解决方法

目录 1. 问题所示2. 原理分析3. 解决方法4. Demo1. 问题所示 此类问题来自私信,本着探究问题的缘由,理性分析了下,让大家也学会分析Bug解决Bug 问题如下所示: Error creating bean with name xxx defined in class截图如下所示: 2. 原理分析 通用的原理进行分析 出现…

【C语言初阶】数组

🌟博主主页:我是一只海绵派大星 📚专栏分类:C语言 ❤️感谢大家点赞👍收藏⭐评论✍️ 目录 一、一维数组的创建和初始化 1、数组的创建 1.1数组的创建方式 1.2数组创建的实例 2、数组的初始化 二、一维数组的使用…

vue.js+node.js+mysql在线聊天室源码

vue.jsnode.jsmysql在线聊天室源码 技术栈:vue.jsElement UInode.jssocket.iomysql vue.jsnode.jsmysql在线聊天室源码

word怎么单页横向设置(页码不连续版)

打开word,将光标放在第一页的最后位置。 然后点击布局下的分隔符,选择下一页。 将光标放在第二页的开头,点击布局下的纸张方向,选择横向即可。 效果展示。 PS:如果那一页夹在两页中间,那么在…

基于C#开发web网页管理系统模板流程-主界面密码维护功能完善

点击返回目录-> 基于C#开发web网页管理系统模板流程-总集篇-CSDN博客 前言 紧接上篇->基于C#开发web网页管理系统模板流程-主界面统计功能完善-CSDN博客 一个合格的管理系统,至少一定存在一个功能——用户能够自己修改密码,理论上来说密码只能有用…

上位机图像处理和嵌入式模块部署(h750 mcu串口命令处理)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 前面学习103和407的时候,当时学过串口的收发。不过当时使用的主要是阻塞的方式。这一次,我们看下应该怎么利用中断的形式进…

互联网时代:挑战与机遇并存

随着科技的飞速发展和互联网的广泛普及,我们已然踏入了一个以信息为主导的互联网时代。这个时代以其鲜明的特点,正在深刻地改变着我们的生活方式、工作节奏以及社会交往模式。而如此深刻的社会变革,也引发了人们对于互联网时代所带来的挑战与…

计算机毕业三年的我,辞职两次后找不到工作回家,此时是真的羡慕有手艺在手的人

栀子花香,弥漫在空气中,却掩盖不了内心的苦涩。 半年,两份工作,两次裸辞,我,又成了一个身无分文的“废人”。 曾经,我也是人人羡慕的互联网人,月薪6K,过着“955”的“神…

【DevOps】Nginx配置文件详解与实战部署PHP站点

目录 引言 Nginx配置文件概述 基本结构 关键指令 Nginx配置文件实战 全局指令配置 HTTP指令配置 服务器指令配置 位置指令配置 实战部署PHP站点 步骤1:安装Nginx和PHP 步骤2:创建网站目录和文件 步骤3:配置Nginx服务器块 步骤4…

2024年金融、贸易与创意产业国际会议(ICFTCI 2024)

2024 International Conference on Financial Trade and Creative Industries 【1】大会信息 会议简称:ICFTCI 2024 大会地点:中国西安 投稿邮箱:icftcisub-paper.com 【2】会议简介 2024年金融贸易与创意产业国际会议即将召开&#xff…

果园预售系统的设计

管理员账户功能包括:系统首页,个人中心,管理员管理,用户管理,果树管理,果园管理,果园预约管理 前台账户功能包括:系统首页,个人中心,论坛,公告&a…

王炸! Suno史诗级更新,随便哼哼就能出一首好听的歌曲?

suno史诗级更新,随便哼哼就能出一首好听的歌曲? 就在今天,suno迎来史诗级更新! 先看截图! 来不及解释,我先试了一下,简直太牛了,先看看看效果,点开链接听歌! …

明星百科大全PHP网站源码

源码介绍 明星百科大全网站源码,国内外明星娱乐音乐、新闻八卦、写真照片、相关影视作品等等的明星百科网站源码。 源码截图 源码下载 明星百科大全PHP网站源码

day36| 860.柠檬水找零 406.根据身高重建队列 452. 用最少数量的箭引爆

文章目录 前言860.柠檬水找零思路方法一 406.根据身高重建队列思路方法一 452. 用最少数量的箭引爆气球思路方法一 总结 前言 860.柠檬水找零 思路 很简单,贪心只有一个,如果20优先用105找零,因为5更加万能一些 方法一 class Solution(ob…

Python版本管理器-Miniconda

随着Python的版本更新,我们在开发Python软件的时候,对Python的版本选择越来越重要,但同时又要兼容已经开发好了的Python软件,因此选择一款合适的Python版本管理器对提高开发效率也越来越重要,今天就推荐一款Python的版…

登录/注册- 滑动拼图验证码(IOS/Swift)

本章介绍如何使用ios开发出滑动拼图验证码,分别OC代码和swift代码调用 1.导入项目model文件OC代码(下载完整Demo) 2.放入你需要显示的图片 一:OC调用 #import "ViewController.h" #import "CodeView.h"…

GStreamer应用程序——第一个应用程序

本章将总结您在前几章中学到的所有内容。它描述了一个简单的GStreamer应用程序的所有方面,包括初始化库、创建元素、将元素打包到管道中以及播放此管道。通过完成所有这些,您将能够构建一个简单的Ogg/Vorbis音频播放器。 Hello world 我们将创建一个简…

企业的crm客户管理系统的部署方式,是选私有云部署,还是公有云部署?

随着,现代化企业的发展,企业在选型CRM客户管理系统后,通过会选一种部署方式,然后才将其与企业现有的管理系统对接,那么一般企业在部署CMR客户管理系统时,一般会选哪种部署方式呢?是私有云crm部署…

PHP在线生成查询产品防伪证书系统源码

源码介绍 PHP在线生成查询产品防伪证书系统源码,源码自带90套授权证书模板,带PSD公章模板,证书PSD源文件。 环境要求:PHPMYSQL,PHP 版本请使用PHP5.1 ~5.3。 图片截图 源码安装说明 1.上传所有文件至你的空间服务器…