您现在的位置是:首页 > 技术教程 正文

深度学习模型的准备和使用教程,LSTM用于锂电池SOH预测(第一节)(附Python的jypter源代码)

admin 阅读: 2024-03-25
后台-插件-广告管理-内容页头部广告(手机)

 

本Python笔记本显示和分析了如何处理NASA获得的电池充电/放电数据集。

对于这个模型的训练阶段,需要安装Python 3.x以及以下库:

Tensorflow 2.0

Numpy

Pandas

Scipy

Sci-kit learn

Matplot

Seaborn

对于该模型的预测阶段,除了Matplot和Seaborn之外,需要使用相同的库。

1.数据集的准备

需要下载数据集,然后将其解压缩到特定的目录中。

  1. %tensorflow_version 2.x
  2. %matplotlib inline
  3. !pip show tensorflow
  4. !wget -cq https://ti.arc.nasa.gov/c/5 -O naza.zip
  5. !unzip -qqo naza.zip -d battery_data

在此部分中,所有处理数据集所需的库都很重要。

  1. import datetime
  2. import numpy as np
  3. import pandas as pd
  4. from scipy.io import loadmat
  5. from sklearn.preprocessing import MinMaxScaler
  6. from sklearn.metrics import mean_squared_error
  7. from sklearn import metrics
  8. import matplotlib.pyplot as plt
  9. import seaborn as sns

2.将数据集加载到内存

数据存储在多个“.mat”文件中。每个文件对应于特定的电池,每个文件的数据结构如下:

在Python中创建了一个函数,负责从"mat"文件中读取这些数据,并将它们存储在内存中以供以后访问,加载数据集后,使用panda函数对数据进行描述,以验证数据加载是否正确。

  1. def load_data(battery):
  2. mat = loadmat('battery_data/' + battery + '.mat')
  3. print('Total data in dataset: ', len(mat[battery][0, 0]['cycle'][0]))
  4. counter = 0
  5. dataset = []
  6. capacity_data = []
  7. for i in range(len(mat[battery][0, 0]['cycle'][0])):
  8. row = mat[battery][0, 0]['cycle'][0, i]
  9. if row['type'][0] == 'discharge':
  10. ambient_temperature = row['ambient_temperature'][0][0]
  11. date_time = datetime.datetime(int(row['time'][0][0]),
  12. int(row['time'][0][1]),
  13. int(row['time'][0][2]),
  14. int(row['time'][0][3]),
  15. int(row['time'][0][4])) + datetime.timedelta(seconds=int(row['time'][0][5]))
  16. data = row['data']
  17. capacity = data[0][0]['Capacity'][0][0]
  18. for j in range(len(data[0][0]['Voltage_measured'][0])):
  19. voltage_measured = data[0][0]['Voltage_measured'][0][j]
  20. current_measured = data[0][0]['Current_measured'][0][j]
  21. temperature_measured = data[0][0]['Temperature_measured'][0][j]
  22. current_load = data[0][0]['Current_load'][0][j]
  23. voltage_load = data[0][0]['Voltage_load'][0][j]
  24. time = data[0][0]['Time'][0][j]
  25. dataset.append([counter + 1, ambient_temperature, date_time, capacity,
  26. voltage_measured, current_measured,
  27. temperature_measured, current_load,
  28. voltage_load, time])
  29. capacity_data.append([counter + 1, ambient_temperature, date_time, capacity])
  30. counter = counter + 1
  31. print(dataset[0])
  32. return [pd.DataFrame(data=dataset,
  33. columns=['cycle', 'ambient_temperature', 'datetime',
  34. 'capacity', 'voltage_measured',
  35. 'current_measured', 'temperature_measured',
  36. 'current_load', 'voltage_load', 'time']),
  37. pd.DataFrame(data=capacity_data,
  38. columns=['cycle', 'ambient_temperature', 'datetime',
  39. 'capacity'])]
  40. dataset, capacity = load_data('B0005')
  41. pd.set_option('display.max_columns', 10)
  42. print(dataset.head())
  43. dataset.describe()

下图显示了随着充电周期的推进,电池的老化过程。水平线表示与电池生命周期结束相关的阈值。

  1. plot_df = capacity.loc[(capacity['cycle']>=1),['cycle','capacity']]
  2. sns.set_style("darkgrid")
  3. plt.figure(figsize=(12, 8))
  4. plt.plot(plot_df['cycle'], plot_df['capacity'])
  5. #Draw threshold
  6. plt.plot([0.,len(capacity)], [1.4, 1.4])
  7. plt.ylabel('Capacity')
  8. # make x-axis ticks legible
  9. adf = plt.gca().get_xaxis().get_major_formatter()
  10. plt.xlabel('cycle')
  11. plt.title('Discharge B0005')

 还需计算电池的SOH值:

  1. attrib=['cycle', 'datetime', 'capacity']
  2. dis_ele = capacity[attrib]
  3. C = dis_ele['capacity'][0]
  4. for i in range(len(dis_ele)):
  5. dis_ele['SoH']=(dis_ele['capacity'])/C
  6. print(dis_ele.head(5))

和以前所作的一样,每个周期都绘制一个SOH图表,水平线代表70%的阈值,即电池已经达到其使用寿命,因此建议进行更换。

  1. plot_df = dis_ele.loc[(dis_ele['cycle']>=1),['cycle','SoH']]
  2. sns.set_style("white")
  3. plt.figure(figsize=(8, 5))
  4. plt.plot(plot_df['cycle'], plot_df['SoH'])
  5. #Draw threshold
  6. plt.plot([0.,len(capacity)], [0.70, 0.70])
  7. plt.ylabel('SOH')
  8. # make x-axis ticks legible
  9. adf = plt.gca().get_xaxis().get_major_formatter()
  10. plt.xlabel('cycle')
  11. plt.title('Discharge B0005')

3.SOH计算的训练阶段

准备了数据集,以便Tensorflow可以在训练阶段使用,为此创建两个结构,对应于预期的输入和输出。数据集的相关特征是:

电池容量、电压、电流、温度、负载电压、负载电流、时间。

对于输出数据,计算电池的SOH,以及在两种情况下的输入和输出,这些值被归一化到[0-1]之间的值。

  1. C = dataset['capacity'][0]
  2. soh = []
  3. for i in range(len(dataset)):
  4. soh.append([dataset['capacity'][i] / C])
  5. soh = pd.DataFrame(data=soh, columns=['SoH'])
  6. attribs=['capacity', 'voltage_measured', 'current_measured',
  7. 'temperature_measured', 'current_load', 'voltage_load', 'time']
  8. train_dataset = dataset[attribs]
  9. sc = MinMaxScaler(feature_range=(0,1))
  10. train_dataset = sc.fit_transform(train_dataset)
  11. print(train_dataset.shape)
  12. print(soh.shape)
  1. import tensorflow as tf
  2. from tensorflow.keras.models import Sequential
  3. from tensorflow.keras.layers import Dense
  4. from tensorflow.keras.layers import Dropout
  5. from tensorflow.keras.layers import Flatten
  6. from tensorflow.keras.layers import LSTM
  7. from tensorflow.keras.optimizers import Adam

总训练参数:27;

可训练参数:27。

 对该模型进行训练,epoch=50;

model.fit(x=train_dataset, y=soh.to_numpy(), batch_size=25, epochs=50)

第二节传送门:

深度学习模型的准备和使用教程,LSTM用于锂电池SOH预测(第二节)(附Python的jypter源代码)_新能源姥大的博客-CSDN博客

标签:
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

在线投稿:投稿 站长QQ:1888636

后台-插件-广告管理-内容页尾部广告(手机)
关注我们

扫一扫关注我们,了解最新精彩内容

搜索