pytorch实现LSTM(附code)

2023-11-12

目录

一、数据集介绍

二、数据预处理

三、python代码实现

参考


最近搞了一个NASA PCoE的IGBT加速老化数据,想基于pytorch框架写一个LSTM模型进行IGBT退化状态的预测,于是有了这篇文章。

注:LSTM的原理就不多讲了,网上一大堆,不懂的自己去百度,本文主要侧重代码实现。

一、数据集介绍

本数据集是NASA PCoE研究中心公布的IGBT加速老化数据集。数据集含有四种实验条件下的IGBT加速老化数据,以下是实验条件:

(1)新设备的源测量单元(SMU data for new devices)

该文件中含有一组原始实验条件下的电气特性数据,分别是型号为IRG4BC30K的20组IGBT和型号为IRG520Npbf的20组MOSFET,实验中测量的参数分别有泄漏电压、击穿电压、阀值电压,其中数据集中还有IGBT的开通和关断数据。

(2)在直流门电压下的加速热老化实验(Thermal Overstress Aging with DC at gate)

该文件包含器件型号为IRF-G4BC30KD的IGBT在门极施加高压时,由红外传感器进行温度测量,直至包装温度超出限定值,然后关闭门极电源。实验表明器件失效原因是闩锁效应(寄生的PNPN晶间管导通),失效过程中对集电极电流进行监测。

结果证明,集电极电流的变化是导致器件失效的原因,该实验测量数据是取自一个独立的IGBT模块。实验中测量参数分别有集电极电流、集电极电压、门极电压、包装温度,实验参数设置如下:

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3RpbmdfcWlmZW5nbA==,size_16,color_FFFFFF,t_70

(3)在栅极施加方波电压下的加速老化实验(Thermal Overstress Aging with Square Signal at gate)

该文件包含了在栅极施加方波电压下的IGBT加速热老化实验数据。通过对功率器件IRG4BC30K的栅极施加频率为1kHz,占空比为40%,幅值为0-8V的方波信号,将封装温度控制在260°C-270°C,对器件进行持续过流高温老化实验。

其中有PWM(pwm temp controller state)工作条件下,低速(steady state)测量数据和开关装置瞬态(transient)特性下的高分辨率数据。在门极施加方波信号进行热循环实验,通过设备开关时刻收集瞬态数据。该实验目的是:当条件远远超出器件工作安全区时,把该器件作为一个开关使用。

实验中测量的主要参数分别有集电极电流、集电极电压、门极电压、包装温度。实验数据包中记录了器件工作时的集电极电流、集电极电压、门极电压、门极电流、包装温度、散热器温度、数据记录时间等参数。

(4)在栅极施加方波电压下和源测量单元下的热加速老化数据(Thermal Overstress Aging with Square Signal at gate and SMU data)

该文件包含在门极施加方波信号进行热循环,通过设备的开关时刻收集瞬态数据。

其中老化数据包含有三个参数:阈值电压,击穿电压和漏电流。

源测量单元(SMU)参数表征数据包含四个设备的数据,包装温度控制在一定范围内。由于器件开关速度难以控制,在输出波形的上升和下降处存在一些瞬态数据(高速测量下的集电极电流、门极电压、集射极电压)没有采集到,数据采集系统中由于缺乏校正分压器,故低速(过滤)数据没有办法度量。

实验中测量的主要参数分别有集电极电流、集电极电压、门极电圧、包装温度。实验过程中,由于设备老化过程中经历了几个问题,导致部分瞬态数据丢失,使得集电极电流数据存在600mA的漂移,而且稳态数据也不是非常精确。

博主选用数据集(3)中的IGBT集射极关断尖峰电压值(如下图)做为特征参数进行预测算法研究。

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3RpbmdfcWlmZW5nbA==,size_16,color_FFFFFF,t_70

二、数据预处理

为了提高预测准确率,首先对数据进行异常值剔除、平滑和标准化处理。

使用二次指数平滑算法对数据进行平滑处理:

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3RpbmdfcWlmZW5nbA==,size_16,color_FFFFFF,t_70

使用下图所示公式进行标准化处理:

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3RpbmdfcWlmZW5nbA==,size_16,color_FFFFFF,t_70

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3RpbmdfcWlmZW5nbA==,size_16,color_FFFFFF,t_70

由于尖峰电压值为离散的数据值,因此为输入LSTM网络需要构造自相关性时间序列数据样本。

使用滑动时间窗方法构造用于网络训练的数据样本,窗口大小设置为5。如:

使用gif.latex?%5Bx_%7B0%7D%2Cx_%7B1%7D%2Cx_%7B2%7D%2Cx_%7B3%7D%2Cx_%7B4%7D%5D作为样本,gif.latex?x_%7B5%7D为样本标签,以此类推。

三、python代码实现

在保证输入样本参数和学习率不变的情况下,即input_size = 5,out_oput = 1,lr = 0.01,试了很多参数,发现在训练集80%,测试集20%,hidden_size = 20,加一个全连接层时结果最好(代码为CPU版本哦)。

import scipy.io as sio
import numpy as np
import torch
from torch import nn
import matplotlib.pyplot as plt
import matplotlib
import pandas as pd
from torch.autograd import Variable
import math
import csv

# Define LSTM Neural Networks
class LstmRNN(nn.Module):
    """
        Parameters:
        - input_size: feature size
        - hidden_size: number of hidden units
        - output_size: number of output
        - num_layers: layers of LSTM to stack
    """

    def __init__(self, input_size, hidden_size=1, output_size=1, num_layers=1):
        super().__init__()

        self.lstm = nn.LSTM(input_size, hidden_size, num_layers)  # utilize the LSTM model in torch.nn
        self.linear1 = nn.Linear(hidden_size, output_size) # 全连接层

    def forward(self, _x):
        x, _ = self.lstm(_x)  # _x is input, size (seq_len, batch, input_size)
        s, b, h = x.shape  # x is output, size (seq_len, batch, hidden_size)
        x = self.linear1(x)
        return x[-1, :, :]

if __name__ == '__main__':

    # checking if GPU is available
    device = torch.device("cpu")

    if (torch.cuda.is_available()):
        device = torch.device("cuda:0")
        print('Training on GPU.')
    else:
        print('No GPU available, training on CPU.')

    # 数据读取&类型转换
    data_x = np.array(pd.read_csv('Data_x.csv', header=None)).astype('float32')
    data_y = np.array(pd.read_csv('Data_y.csv', header=None)).astype('float32')

    # 数据集分割
    data_len = len(data_x)
    t = np.linspace(0, data_len, data_len + 1)

    train_data_ratio = 0.8  # Choose 80% of the data for training
    train_data_len = int(data_len * train_data_ratio)

    train_x = data_x[5:train_data_len]
    train_y = data_y[5:train_data_len]
    t_for_training = t[5:train_data_len]

    test_x = data_x[train_data_len:]
    test_y = data_y[train_data_len:]
    t_for_testing = t[train_data_len:]

    # ----------------- train -------------------
    INPUT_FEATURES_NUM = 1
    OUTPUT_FEATURES_NUM = 1
    train_x_tensor = train_x.reshape(5, -1, INPUT_FEATURES_NUM) 
    train_y_tensor = train_y.reshape(1, OUTPUT_FEATURES_NUM) 
    # transfer data to pytorch tensor
    train_x_tensor = torch.from_numpy(train_x_tensor)
    train_y_tensor = torch.from_numpy(train_y_tensor)

    lstm_model = LstmRNN(INPUT_FEATURES_NUM, 20, output_size=OUTPUT_FEATURES_NUM, num_layers=1)  # 20 hidden units
    print('LSTM model:', lstm_model)
    print('model.parameters:', lstm_model.parameters)
    print('train x tensor dimension:', Variable(train_x_tensor).size())

    criterion = nn.MSELoss()
    optimizer = torch.optim.Adam(lstm_model.parameters(), lr=1e-2)

    prev_loss = 1000
    max_epochs = 2000

    train_x_tensor = train_x_tensor.to(device)

    for epoch in range(max_epochs):
        output = lstm_model(train_x_tensor).to(device)
        loss = criterion(output, train_y_tensor)

        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

        if loss < prev_loss:
            torch.save(lstm_model.state_dict(), 'lstm_model.pt')  # save model parameters to files
            prev_loss = loss

        if loss.item() < 1e-4:
            print('Epoch [{}/{}], Loss: {:.5f}'.format(epoch + 1, max_epochs, loss.item()))
            print("The loss value is reached")
            break
        elif (epoch + 1) % 100 == 0:
            print('Epoch: [{}/{}], Loss:{:.5f}'.format(epoch + 1, max_epochs, loss.item()))

    # prediction on training dataset
    pred_y_for_train = lstm_model(train_x_tensor).to(device)
    pred_y_for_train = pred_y_for_train.view(-1, OUTPUT_FEATURES_NUM).data.numpy()

    # ----------------- test -------------------
    lstm_model = lstm_model.eval()  # switch to testing model

    # prediction on test dataset
    test_x_tensor = test_x.reshape(5, -1, INPUT_FEATURES_NUM)
    test_x_tensor = torch.from_numpy(test_x_tensor)  # 变为tensor
    test_x_tensor = test_x_tensor.to(device)

    pred_y_for_test = lstm_model(test_x_tensor).to(device)
    pred_y_for_test = pred_y_for_test.view(-1, OUTPUT_FEATURES_NUM).data.numpy()

    loss = criterion(torch.from_numpy(pred_y_for_test), torch.from_numpy(test_y))
    print("test loss:", loss.item())

    # ----------------- plot -------------------
    plt.figure()
    plt.plot(t_for_training, train_y, 'b', label='y_trn')
    plt.plot(t_for_training, pred_y_for_train, 'y--', label='pre_trn')

    plt.plot(t_for_testing, test_y, 'k', label='y_tst')
    plt.plot(t_for_testing, pred_y_for_test, 'm--', label='pre_tst')

    plt.xlabel('t')
    plt.ylabel('Vce')
    plt.show()

结果如下图所示:

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3RpbmdfcWlmZW5nbA==,size_16,color_FFFFFF,t_70

蓝线代表训练集真实值,黄线代表训练集预测值

黑线代表测试集真实值,紫线代表测试集预测值

test_loss=0.004276850726

完整代码及处理好的数据集请点击

参考

[干货]深入浅出LSTM及其Python代码实现 - 知乎

喜欢的话就麻烦动动小手点个赞吧~~~万分感谢啦!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

pytorch实现LSTM(附code) 的相关文章

随机推荐

  • js获取当前时间和倒计时

    一 当前时间 获取当前时间显示年月日 时分秒 function newDate var date new Date var Y date getFullYear var M date getMonth 1 lt 10 0 date getM
  • RAID介绍及RAID5配置实例

    一 RAID磁盘阵列介绍 1 1RAID磁盘阵列介绍 RAID是Redundant Array of Independent Disks的缩写 中文简称为独立冗余磁盘阵列 把多块独立的物理硬盘按不同的方式组合起来形成一个硬盘组 逻辑硬盘 从
  • python制作网络社交图

    python制作网络社交图 制作说明 python语言是可以制作网络社交图的 在制作之前需要先导入python内部的一个库 import networkx as nx 该库是一个用python语言开发的图论与复杂网络建模工具 内置了常用的图
  • Redis-关于RDB的几点顿悟-COW(Copy On Write)

    文章目录 摘要 问题概述 问题解决 使用Copy On Write 写时复制 详细 解答 Copy On Write 机制 Linux中CopyOnWrite实现原理 CopyOnWrite的好处 Redis中的CopyOnWrite 摘要
  • Linux(Centos6.5)下如何解压.zip和.rar文件

    Windows下常见的压缩文件类型是 zip和 rar 在Linux下如何压缩和解压缩呢 1 zip linux下提供了zip和unzip命令 zip是压缩 unzip是解压缩 举例如下 zip myFile zip jpg 将所有jpg文
  • Linux--权限管理

    学习目标 1 Linux权限管理 1 1 用户分类 2 用户类型和访问权限 2 1 理解什么是权限 3 文件类型和权限操作 3 1 修改权限 3 2 关于root 3 3 更改文件拥有者 3 4 修改组权限 3 5 目录权限 3 5 1 粘
  • 基于jsp的学生网上报名系统

    学生网上报名系统分为五大模块 信息查询模块 信息修改模块 信息录入模块和导出印模块以及信息发布模块 其中信息录入模块是进行信息的添加 存储和删除 是系统运行的基础 信息查询模块是学生通过自己的姓名和学号登陆系统 进入报名界面时由系统按照预先
  • 【JS基础】一些个人积累的原生JS编码设计思想,和大家一起开拓下思维

    文章目录 前言 对象配置 链式调用 队列调用 并发执行 条件判断优化 给数据做封装 尝试先写JS再写界面 前言 以下都是我个人遇到的前端JS原生编码设计上的一些案例记录 希望能帮助新手开拓写代码的思想 并且能够结合自己的想法应用在实际的项目
  • 为什么要使用npm

    文章转载自 https zhuanlan zhihu com p 24357770 网上的 npm 教程主要都在讲怎么安装 配置和使用 npm 却不告诉新人 为什么要使用 npm 今天我就来讲讲这个话题 本文目标读者是 不太了解 npm 的
  • 【项目功能模块】SpringBoot+vue实现登录手机验证码

    SpringBoot vue实现登录需要手机验证码 要在Spring Boot和Vue中实现登录需要手机验证码功能 你需要进行以下步骤 后端 Spring Boot 实现 添加相关依赖 在pom xml文件中添加以下依赖
  • KVM添加文件夹存储

    创建基于文件夹的存储池 1 定义一个存储池 virsh pool define as kvm images dir kvm images 2 查看创建的存储池信息 virsh pool list all 3 建立基于文件夹的存储池 virs
  • OPENGL学习(二)OPENGL渲染管线

    Vertex processor 对顶点进行预处理 原始点都是三维的 最终我们看到的点都是二维的 这个映射过程和点的实际位置 和我们从哪个视角去看都有关系 需要通过一系列矩阵调整点的坐标 另外 还需要确定点的颜色 这个和点到镜头的距离和光照
  • 前端与后端通信最简单的三个方式

    在HTML和Java后端之间进行通信通常是通过使用服务器端的技术来实现的 以下是一些常用的方法 使用表单提交 在HTML中 可以使用表单元素来收集用户输入的数据 当用户提交表单时 可以使用POST或GET方法将数据发送到Java后端 在Ja
  • R语言 判别分析:线性判别、K最邻近、有权重的K最邻近、朴素贝叶斯

    关注微信公共号 小程在线 关注CSDN博客 程志伟的博客 class包 提供Knn 函数 kknn包 提供kknn 函数及miete数据集 房租信息 kknn函数 实现有权重的K最近邻 knn函数 实现K最近邻算法 klaR包 提供Navi
  • Spring Boot 实现Mybatis多数据源

    文章目录 Spring Boot 多数据源 1 背景 2 定义数据源 2 1 定义动态数据源 2 3 定义自定义数据源 3 配置数据库链接 4 编写数据源切面 Spring Boot 多数据源 1 背景 项目日产生的数据量比较大 所以规定每
  • 基于FPGA的FFT算法实现

    基于FPGA的FFT算法实现 项目简述 FFT IP的定制及详解 Block Design设计 仿真结果 总结 项目简述 前面的一篇博客我们已经讲解了FFT算法的发展历程 至于FFT的原理感兴趣的同学可以查阅书本数字信号处理 书本上面的知识
  • 1.6 CPU性能公式

    CPU时间 一个程序在CPU上运行的时间 不包括 I O 时间 时钟周期 系统的时间周期越短 相应的CPU性能就越好 程序的时钟周期数 CPU时间 执行程序所需的时钟周期数 X 时钟周期时间 时钟周期时间是时钟频率的倒数 指令周期数 CPI
  • Cross-Domain Adaptive Teacher for Object Detection安装环境以及运行代码

    1 首先在官网上下载代码以及数据集 代码下载如下 git clone URL网址 git clone https github com facebookresearch adaptive teacher git 2 安装环境 这是作者给的r
  • [蓝桥杯]乘积尾零

    核心思路 想要出现0 即2 5 4 5 8 5 4 8又可以分解为2 末尾本来就有0的也可以分解为5 所以我们只需要把这100个数都尽量拆分为因子 2 5 相乘的形式 并统计2 5的个数 然后看一共有多少对 2 5 即可 ok 上ACcod
  • pytorch实现LSTM(附code)

    目录 一 数据集介绍 二 数据预处理 三 python代码实现 参考 最近搞了一个NASA PCoE的IGBT加速老化数据 想基于pytorch框架写一个LSTM模型进行IGBT退化状态的预测 于是有了这篇文章 注 LSTM的原理就不多讲了