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

递归神经网络在很长一段时间内是序列转换任务的主导模型,其固有的序列本质阻碍了并行计算。因此,在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()

图片

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【JAVA】javadoc,如何生成标准的JAVA API文档

目录 1.什么是JAVA DOC 2.标签 3.命令 1.什么是JAVA DOC 当我们写完JAVA代码,别人要调用我们的代码的时候要是没有API文档是很痛苦的,只能跟进源码去一个个的看,一个个方法的猜,并且JAVA本来就不是一个重复造轮子的游戏&#…

javaWeb项目-ssm+vue网上租车系统功能介绍

本项目源码:java-基于ssmvue的网上租车系统源码说明文档资料资源-CSDN文库 项目关键技术 开发工具:IDEA 、Eclipse 编程语言: Java 数据库: MySQL5.7 框架:ssm、Springboot 前端:Vue、ElementUI 关键技术:springboot、…

Python基础教程(十五):面向对象编程

💝💝💝首先,欢迎各位来到我的博客,很高兴能够在这里和您见面!希望您在这里不仅可以有所收获,同时也能感受到一份轻松欢乐的氛围,祝你生活愉快! 💝&#x1f49…

Diffusers代码学习-SDXL

Stable Diffusion XL(SDXL)是一个强大的文本到图像生成模型,它以三种关键方式迭代以前的Stable Differsion模型: 1. UNet大3倍,SDXL将第二个文本编码器(OpenCLIP-ViT-bigG/14)与原始文本编码器…

Kubernetes 基础架构最佳实践:从架构设计到平台自动化

本文探讨了如何将DigitalOcean Kubernetes (DOKS)应用于生产环境,并提供实现生产准备(production readiness)的指导。 规划您的基础架构 Kubernetes 基础架构的规划至关重要,因为它为稳定且可扩展的应用部署平台奠定了基础。通过适…

Coze+Discord:打造你的免费AI助手(教您如何免费使用GPT-4o/Gemini等最新最强的大模型/Discord如何正确连接Coze)

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 文章内容 📒📝 准备Discord📝 准备Coze🔌 连接💡 测试效果⚓️ 相关链接 ⚓️📖 介绍 📖 你是否想免费使用GPT-4o/Gemini等最新最强的大模型,但又不想花费高昂的费用?本文将教你如何通过Coze搭建Bot,并将其转发…

计算机网络(2) 网络层:IP服务模型

一.Internet Protocol在TCP/IP四层模型中的作用 第三层网络层负责数据包从哪里来到哪里去的问题。传输层的数据段提交给网络层后,网络层负责添加IP段,包含数据包源地址与目的地址。将添加IP段的数据包交由数据链路层添加链路头形成最终在各节点传输中所需…

YASKAWA机器人HW1171921-B电缆维修

安川机器人作为现代工业自动化的重要设备,其稳定运行对于生产线的连续性和效率至关重要。然而,随着使用时间的增长,可能会出现各种YASKAWA机器人本体线缆故障,如断线、短路、接触不良等。 一、安川工业机器人电缆维修前的准备 在进…

Java | Leetcode Java题解之第147题对链表进行插入排序

题目: 题解: class Solution {public ListNode insertionSortList(ListNode head) {if (head null) {return head;}ListNode dummyHead new ListNode(0);dummyHead.next head;ListNode lastSorted head, curr head.next;while (curr ! null) {if (…

糖尿病患者血糖控制困难,4个辅助降糖方法分享。

对于糖尿病患者来讲,血糖控制极为困难,稍不留意就会致使忽高忽低的情况出现,今天我来教你 4 个办法来辅助降糖。 第一,在饮食上可多进食全谷类食物,中医认为谷类食物是脾胃的主食。经常吃这类食物不但能够给脾胃提供充…

流媒体传输协议HTTP-FLV、WebSocket-FLV、HTTP-TS 和 WebSocket-WS的详细介绍、应用场景及对比

一、前言 HTTP-FLV、WS-FLV、HTTP-TS 和 WS-TS 是针对 FLV 和 TS 格式视频流的不同传输方式。它们通过不同的协议实现视频流的传输,以满足不同的应用场景和需求。接下来我们对这些流媒体传输协议进行剖析。 二、传输协议 1、HTTP-FLV 介绍:基于 HTTP…

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

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

Github 2024-06-13 Go开源项目日报Top10

根据Github Trendings的统计,今日(2024-06-13统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Go项目10TypeScript项目1Shell项目1多存储文件列表/WebDAV程序 创建周期:1265 天开发语言:Go协议类型:GNU Affero General Public License v…

TIA博途Wincc与S7-1500 (V2.9) 或S7-1200 (V4.5) 及更高版本固件PLC通信失败的原因汇总

TIA博途Wincc与S7-1500 (V2.9) 或S7-1200 (V4.5) 及更高版本固件PLC通信失败的原因汇总 从TIA Portal V17开始,对于S7-1500PLC新增了V2.9的固件,S7-1200新增了V4.5的固件,PLC侧默认激活了“仅支持PG/PC和HMI的安全通信”, 注意事项1 如果PLC侧激活了“仅支持PG/PC和HMI的安…

Golang | Leetcode Golang题解之第148题排序链表

题目&#xff1a; 题解&#xff1a; func merge(head1, head2 *ListNode) *ListNode {dummyHead : &ListNode{}temp, temp1, temp2 : dummyHead, head1, head2for temp1 ! nil && temp2 ! nil {if temp1.Val < temp2.Val {temp.Next temp1temp1 temp1.Next} …

opencv_特征检测和描述

理解特征 寻找独特的特定模式或特定特征&#xff0c;可以轻松跟踪和比较。 拼图&#xff1a;在图像中搜索这些特征&#xff0c;找到它们&#xff0c;在其他图像中查找相同的特征并对齐它们。而已。 基本上&#xff0c;角被认为是图像中的好特征。 在本单元中&#xff0c;我…

graalvm编译springboot3 native应用

云原生时代容器先行&#xff0c;为了更好的拥抱云原生&#xff0c;spring boot3之后&#xff0c;推出了graalvm编译boot项目&#xff0c;利用jvm的AOT&#xff08; Ahead Of Time &#xff09;运行前编译技术&#xff0c;可以将javay源码直接构建成机器码二进制的文件&#xff…

光伏项目管理——数字化改革

随着全球对可再生能源的迫切需求以及环保意识的日益增强&#xff0c;光伏产业作为清洁能源的重要组成部分&#xff0c;正迎来快速发展的黄金时期。然而&#xff0c;传统的光伏项目管理方式已逐渐无法满足现代化、高效化的需求&#xff0c;数字化改革成为了行业发展的必然趋势。…

如何在Excel中快速找出含有多位小数的数字

在日常工作中&#xff0c;使用Excel处理数据是一项常见任务。然而&#xff0c;有时我们会遇到一些看似简单&#xff0c;却令人头疼的问题。例如&#xff0c;当我们在一个包含大量数据的列中发现某个数字的小数点位数过多时&#xff0c;如何快速找到这个数字&#xff1f;本文将介…

.net8 blazor auto模式很爽(二)用.net8创建Blazor自动模式项目

在vs2022中创建新项目&#xff0c;在搜索框里输入blazor&#xff0c;选择blazor web app 在其他信息里框架选.net8&#xff0c;模式选择auto,点创建。 我们可以看到&#xff0c;vs自动创建了两个项目。一个叫BlazorApp1&#xff0c;另外一个叫BlazorApp1.Client。没有Client就…