当前位置:   article > 正文

pytorch实现LSTM(附code)_pytorch lstm

pytorch lstm

目录

一、数据集介绍

二、数据预处理

三、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。如:

使用\left ( x_1, x_2, x_3, x_4, x_5 \right )作为样本,x_6为样本标签,以此类推。

三、python代码实现

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

  1. import scipy.io as sio
  2. import numpy as np
  3. import torch
  4. from torch import nn
  5. import matplotlib.pyplot as plt
  6. import matplotlib
  7. import pandas as pd
  8. from torch.autograd import Variable
  9. import math
  10. import csv
  11. # Define LSTM Neural Networks
  12. class LstmRNN(nn.Module):
  13. """
  14. Parameters:
  15. - input_size: feature size
  16. - hidden_size: number of hidden units
  17. - output_size: number of output
  18. - num_layers: layers of LSTM to stack
  19. """
  20. def __init__(self, input_size, hidden_size=1, output_size=1, num_layers=1):
  21. super().__init__()
  22. self.lstm = nn.LSTM(input_size, hidden_size, num_layers) # utilize the LSTM model in torch.nn
  23. self.linear1 = nn.Linear(hidden_size, output_size) # 全连接层
  24. def forward(self, _x):
  25. x, _ = self.lstm(_x) # _x is input, size (seq_len, batch, input_size)
  26. s, b, h = x.shape # x is output, size (seq_len, batch, hidden_size)
  27. x = self.linear1(x)
  28. return x[-1, :, :]
  29. if __name__ == '__main__':
  30. # checking if GPU is available
  31. device = torch.device("cpu")
  32. if (torch.cuda.is_available()):
  33. device = torch.device("cuda:0")
  34. print('Training on GPU.')
  35. else:
  36. print('No GPU available, training on CPU.')
  37. # 数据读取&类型转换
  38. data_x = np.array(pd.read_csv('Data_x.csv', header=None)).astype('float32')
  39. data_y = np.array(pd.read_csv('Data_y.csv', header=None)).astype('float32')
  40. # 数据集分割
  41. data_len = len(data_x)
  42. t = np.linspace(0, data_len, data_len + 1)
  43. train_data_ratio = 0.8 # Choose 80% of the data for training
  44. train_data_len = int(data_len * train_data_ratio)
  45. train_x = data_x[5:train_data_len]
  46. train_y = data_y[5:train_data_len]
  47. t_for_training = t[5:train_data_len]
  48. test_x = data_x[train_data_len:]
  49. test_y = data_y[train_data_len:]
  50. t_for_testing = t[train_data_len:]
  51. # ----------------- train -------------------
  52. INPUT_FEATURES_NUM = 1
  53. OUTPUT_FEATURES_NUM = 1
  54. train_x_tensor = train_x.reshape(5, -1, INPUT_FEATURES_NUM)
  55. train_y_tensor = train_y.reshape(1, OUTPUT_FEATURES_NUM)
  56. # transfer data to pytorch tensor
  57. train_x_tensor = torch.from_numpy(train_x_tensor)
  58. train_y_tensor = torch.from_numpy(train_y_tensor)
  59. lstm_model = LstmRNN(INPUT_FEATURES_NUM, 20, output_size=OUTPUT_FEATURES_NUM, num_layers=1) # 20 hidden units
  60. print('LSTM model:', lstm_model)
  61. print('model.parameters:', lstm_model.parameters)
  62. print('train x tensor dimension:', Variable(train_x_tensor).size())
  63. criterion = nn.MSELoss()
  64. optimizer = torch.optim.Adam(lstm_model.parameters(), lr=1e-2)
  65. prev_loss = 1000
  66. max_epochs = 2000
  67. train_x_tensor = train_x_tensor.to(device)
  68. for epoch in range(max_epochs):
  69. output = lstm_model(train_x_tensor).to(device)
  70. loss = criterion(output, train_y_tensor)
  71. optimizer.zero_grad()
  72. loss.backward()
  73. optimizer.step()
  74. if loss < prev_loss:
  75. torch.save(lstm_model.state_dict(), 'lstm_model.pt') # save model parameters to files
  76. prev_loss = loss
  77. if loss.item() < 1e-4:
  78. print('Epoch [{}/{}], Loss: {:.5f}'.format(epoch + 1, max_epochs, loss.item()))
  79. print("The loss value is reached")
  80. break
  81. elif (epoch + 1) % 100 == 0:
  82. print('Epoch: [{}/{}], Loss:{:.5f}'.format(epoch + 1, max_epochs, loss.item()))
  83. # prediction on training dataset
  84. pred_y_for_train = lstm_model(train_x_tensor).to(device)
  85. pred_y_for_train = pred_y_for_train.view(-1, OUTPUT_FEATURES_NUM).data.numpy()
  86. # ----------------- test -------------------
  87. lstm_model = lstm_model.eval() # switch to testing model
  88. # prediction on test dataset
  89. test_x_tensor = test_x.reshape(5, -1, INPUT_FEATURES_NUM)
  90. test_x_tensor = torch.from_numpy(test_x_tensor) # 变为tensor
  91. test_x_tensor = test_x_tensor.to(device)
  92. pred_y_for_test = lstm_model(test_x_tensor).to(device)
  93. pred_y_for_test = pred_y_for_test.view(-1, OUTPUT_FEATURES_NUM).data.numpy()
  94. loss = criterion(torch.from_numpy(pred_y_for_test), torch.from_numpy(test_y))
  95. print("test loss:", loss.item())
  96. # ----------------- plot -------------------
  97. plt.figure()
  98. plt.plot(t_for_training, train_y, 'b', label='y_trn')
  99. plt.plot(t_for_training, pred_y_for_train, 'y--', label='pre_trn')
  100. plt.plot(t_for_testing, test_y, 'k', label='y_tst')
  101. plt.plot(t_for_testing, pred_y_for_test, 'm--', label='pre_tst')
  102. plt.xlabel('t')
  103. plt.ylabel('Vce')
  104. plt.show()

结果如下图所示:

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

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

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

test_loss=0.004276850726

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

参考

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/酷酷是懒虫/article/detail/955041
推荐阅读
相关标签
  

闽ICP备14008679号