Bohrium
robot
新建

空间站广场

论文
Notebooks
比赛
课程
Apps
镜像市场
实验室
Uni-Lab
我的主页
我的Notebooks
我的知识库
我的足迹

我的工作空间

任务
节点
镜像
文件
数据集
项目
数据库
公开
Transformer副本副本
AI4S
AI4S
微信用户fCSA
更新于 2024-12-24
推荐镜像 :DeePMD-kit:3.0.0-cuda12.1
推荐机型 :c2_m4_cpu
双击即可修改
代码
文本
[1]
!pip install torch
!pip install pandas
!pip install numpy
!pip install matplotlib
!pip install scikit-learn
!pip install tensorflow
!pip install scikeras
Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple
Requirement already satisfied: torch in /opt/deepmd-kit-3.0.0/lib/python3.12/site-packages (2.4.1.post302)
Requirement already satisfied: filelock in /opt/deepmd-kit-3.0.0/lib/python3.12/site-packages (from torch) (3.16.1)
Requirement already satisfied: typing-extensions>=4.8.0 in /opt/deepmd-kit-3.0.0/lib/python3.12/site-packages (from torch) (4.12.2)
Requirement already satisfied: sympy in /opt/deepmd-kit-3.0.0/lib/python3.12/site-packages (from torch) (1.13.3)
Requirement already satisfied: networkx in /opt/deepmd-kit-3.0.0/lib/python3.12/site-packages (from torch) (3.4.2)
Requirement already satisfied: jinja2 in /opt/deepmd-kit-3.0.0/lib/python3.12/site-packages (from torch) (3.1.4)
Requirement already satisfied: fsspec in /opt/deepmd-kit-3.0.0/lib/python3.12/site-packages (from torch) (2024.10.0)
Requirement already satisfied: setuptools in /opt/deepmd-kit-3.0.0/lib/python3.12/site-packages (from torch) (75.6.0)
Requirement already satisfied: MarkupSafe>=2.0 in /opt/deepmd-kit-3.0.0/lib/python3.12/site-packages (from jinja2->torch) (3.0.2)
Requirement already satisfied: mpmath<1.4,>=1.1.0 in /opt/deepmd-kit-3.0.0/lib/python3.12/site-packages (from sympy->torch) (1.3.0)
WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager, possibly rendering your system unusable.It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv. Use the --root-user-action option if you know what you are doing and want to suppress this warning.
Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple
Requirement already satisfied: pandas in /opt/deepmd-kit-3.0.0/lib/python3.12/site-packages (2.2.3)
Requirement already satisfied: numpy>=1.26.0 in /opt/deepmd-kit-3.0.0/lib/python3.12/site-packages (from pandas) (1.26.4)
Requirement already satisfied: python-dateutil>=2.8.2 in /opt/deepmd-kit-3.0.0/lib/python3.12/site-packages (from pandas) (2.9.0.post0)
Requirement already satisfied: pytz>=2020.1 in /opt/deepmd-kit-3.0.0/lib/python3.12/site-packages (from pandas) (2024.1)
Requirement already satisfied: tzdata>=2022.7 in /opt/deepmd-kit-3.0.0/lib/python3.12/site-packages (from pandas) (2024.2)
Requirement already satisfied: six>=1.5 in /opt/deepmd-kit-3.0.0/lib/python3.12/site-packages (from python-dateutil>=2.8.2->pandas) (1.16.0)
WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager, possibly rendering your system unusable.It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv. Use the --root-user-action option if you know what you are doing and want to suppress this warning.
Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple
Requirement already satisfied: numpy in /opt/deepmd-kit-3.0.0/lib/python3.12/site-packages (1.26.4)
WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager, possibly rendering your system unusable.It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv. Use the --root-user-action option if you know what you are doing and want to suppress this warning.
Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple
Requirement already satisfied: matplotlib in /opt/deepmd-kit-3.0.0/lib/python3.12/site-packages (3.9.2)
Requirement already satisfied: contourpy>=1.0.1 in /opt/deepmd-kit-3.0.0/lib/python3.12/site-packages (from matplotlib) (1.3.1)
Requirement already satisfied: cycler>=0.10 in /opt/deepmd-kit-3.0.0/lib/python3.12/site-packages (from matplotlib) (0.12.1)
Requirement already satisfied: fonttools>=4.22.0 in /opt/deepmd-kit-3.0.0/lib/python3.12/site-packages (from matplotlib) (4.55.0)
Requirement already satisfied: kiwisolver>=1.3.1 in /opt/deepmd-kit-3.0.0/lib/python3.12/site-packages (from matplotlib) (1.4.7)
Requirement already satisfied: numpy>=1.23 in /opt/deepmd-kit-3.0.0/lib/python3.12/site-packages (from matplotlib) (1.26.4)
Requirement already satisfied: packaging>=20.0 in /opt/deepmd-kit-3.0.0/lib/python3.12/site-packages (from matplotlib) (24.2)
Requirement already satisfied: pillow>=8 in /opt/deepmd-kit-3.0.0/lib/python3.12/site-packages (from matplotlib) (11.0.0)
Requirement already satisfied: pyparsing>=2.3.1 in /opt/deepmd-kit-3.0.0/lib/python3.12/site-packages (from matplotlib) (3.2.0)
Requirement already satisfied: python-dateutil>=2.7 in /opt/deepmd-kit-3.0.0/lib/python3.12/site-packages (from matplotlib) (2.9.0.post0)
Requirement already satisfied: six>=1.5 in /opt/deepmd-kit-3.0.0/lib/python3.12/site-packages (from python-dateutil>=2.7->matplotlib) (1.16.0)
WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager, possibly rendering your system unusable.It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv. Use the --root-user-action option if you know what you are doing and want to suppress this warning.
Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple
Collecting scikit-learn
  Downloading https://pypi.tuna.tsinghua.edu.cn/packages/17/0e/e6bb84074f1081245a165c0ee775ecef24beae9d2f2e24bcac0c9f155f13/scikit_learn-1.6.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (13.1 MB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 13.1/13.1 MB 24.7 MB/s eta 0:00:00a 0:00:01
Requirement already satisfied: numpy>=1.19.5 in /opt/deepmd-kit-3.0.0/lib/python3.12/site-packages (from scikit-learn) (1.26.4)
Requirement already satisfied: scipy>=1.6.0 in /opt/deepmd-kit-3.0.0/lib/python3.12/site-packages (from scikit-learn) (1.14.1)
Collecting joblib>=1.2.0 (from scikit-learn)
  Downloading https://pypi.tuna.tsinghua.edu.cn/packages/91/29/df4b9b42f2be0b623cbd5e2140cafcaa2bef0759a00b7b70104dcfe2fb51/joblib-1.4.2-py3-none-any.whl (301 kB)
Collecting threadpoolctl>=3.1.0 (from scikit-learn)
  Downloading https://pypi.tuna.tsinghua.edu.cn/packages/4b/2c/ffbf7a134b9ab11a67b0cf0726453cedd9c5043a4fe7a35d1cefa9a1bcfb/threadpoolctl-3.5.0-py3-none-any.whl (18 kB)
Installing collected packages: threadpoolctl, joblib, scikit-learn
Successfully installed joblib-1.4.2 scikit-learn-1.6.0 threadpoolctl-3.5.0
WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager, possibly rendering your system unusable.It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv. Use the --root-user-action option if you know what you are doing and want to suppress this warning.
Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple
Requirement already satisfied: tensorflow in /opt/deepmd-kit-3.0.0/lib/python3.12/site-packages (2.17.0)
Requirement already satisfied: absl-py>=1.0.0 in /opt/deepmd-kit-3.0.0/lib/python3.12/site-packages (from tensorflow) (2.1.0)
Requirement already satisfied: astunparse>=1.6.0 in /opt/deepmd-kit-3.0.0/lib/python3.12/site-packages (from tensorflow) (1.6.3)
Requirement already satisfied: flatbuffers>=24.3.25 in /opt/deepmd-kit-3.0.0/lib/python3.12/site-packages (from tensorflow) (24.3.25)
Requirement already satisfied: gast!=0.5.0,!=0.5.1,!=0.5.2,>=0.2.1 in /opt/deepmd-kit-3.0.0/lib/python3.12/site-packages (from tensorflow) (0.5.5)
Requirement already satisfied: google-pasta>=0.1.1 in /opt/deepmd-kit-3.0.0/lib/python3.12/site-packages (from tensorflow) (0.2.0)
Requirement already satisfied: h5py>=3.10.0 in /opt/deepmd-kit-3.0.0/lib/python3.12/site-packages (from tensorflow) (3.12.1)
Requirement already satisfied: ml-dtypes<0.5.0,>=0.3.1 in /opt/deepmd-kit-3.0.0/lib/python3.12/site-packages (from tensorflow) (0.4.0)
Requirement already satisfied: opt-einsum>=2.3.2 in /opt/deepmd-kit-3.0.0/lib/python3.12/site-packages (from tensorflow) (3.4.0)
Requirement already satisfied: packaging in /opt/deepmd-kit-3.0.0/lib/python3.12/site-packages (from tensorflow) (24.2)
Requirement already satisfied: protobuf!=4.21.0,!=4.21.1,!=4.21.2,!=4.21.3,!=4.21.4,!=4.21.5,<6.0.0dev,>=3.20.3 in /opt/deepmd-kit-3.0.0/lib/python3.12/site-packages (from tensorflow) (5.27.5)
Requirement already satisfied: requests<3,>=2.21.0 in /opt/deepmd-kit-3.0.0/lib/python3.12/site-packages (from tensorflow) (2.32.3)
Requirement already satisfied: setuptools in /opt/deepmd-kit-3.0.0/lib/python3.12/site-packages (from tensorflow) (75.6.0)
Requirement already satisfied: six>=1.12.0 in /opt/deepmd-kit-3.0.0/lib/python3.12/site-packages (from tensorflow) (1.16.0)
Requirement already satisfied: termcolor>=1.1.0 in /opt/deepmd-kit-3.0.0/lib/python3.12/site-packages (from tensorflow) (2.5.0)
Requirement already satisfied: typing-extensions>=3.6.6 in /opt/deepmd-kit-3.0.0/lib/python3.12/site-packages (from tensorflow) (4.12.2)
Requirement already satisfied: wrapt>=1.11.0 in /opt/deepmd-kit-3.0.0/lib/python3.12/site-packages (from tensorflow) (1.16.0)
Requirement already satisfied: grpcio<2.0,>=1.24.3 in /opt/deepmd-kit-3.0.0/lib/python3.12/site-packages (from tensorflow) (1.65.5)
Requirement already satisfied: tensorboard<2.18,>=2.17 in /opt/deepmd-kit-3.0.0/lib/python3.12/site-packages (from tensorflow) (2.17.1)
Requirement already satisfied: keras>=3.2.0 in /opt/deepmd-kit-3.0.0/lib/python3.12/site-packages (from tensorflow) (3.6.0)
Requirement already satisfied: numpy>=1.19.3 in /opt/deepmd-kit-3.0.0/lib/python3.12/site-packages (from h5py>=3.10.0->tensorflow) (1.26.4)
Requirement already satisfied: rich in /opt/deepmd-kit-3.0.0/lib/python3.12/site-packages (from keras>=3.2.0->tensorflow) (13.9.4)
Requirement already satisfied: namex in /opt/deepmd-kit-3.0.0/lib/python3.12/site-packages (from keras>=3.2.0->tensorflow) (0.0.8)
Requirement already satisfied: optree in /opt/deepmd-kit-3.0.0/lib/python3.12/site-packages (from keras>=3.2.0->tensorflow) (0.13.1)
Requirement already satisfied: charset-normalizer<4,>=2 in /opt/deepmd-kit-3.0.0/lib/python3.12/site-packages (from requests<3,>=2.21.0->tensorflow) (3.4.0)
Requirement already satisfied: idna<4,>=2.5 in /opt/deepmd-kit-3.0.0/lib/python3.12/site-packages (from requests<3,>=2.21.0->tensorflow) (3.10)
Requirement already satisfied: urllib3<3,>=1.21.1 in /opt/deepmd-kit-3.0.0/lib/python3.12/site-packages (from requests<3,>=2.21.0->tensorflow) (2.2.3)
Requirement already satisfied: certifi>=2017.4.17 in /opt/deepmd-kit-3.0.0/lib/python3.12/site-packages (from requests<3,>=2.21.0->tensorflow) (2024.8.30)
Requirement already satisfied: markdown>=2.6.8 in /opt/deepmd-kit-3.0.0/lib/python3.12/site-packages (from tensorboard<2.18,>=2.17->tensorflow) (3.6)
Requirement already satisfied: tensorboard-data-server<0.8.0,>=0.7.0 in /opt/deepmd-kit-3.0.0/lib/python3.12/site-packages (from tensorboard<2.18,>=2.17->tensorflow) (0.7.0)
Requirement already satisfied: werkzeug>=1.0.1 in /opt/deepmd-kit-3.0.0/lib/python3.12/site-packages (from tensorboard<2.18,>=2.17->tensorflow) (3.1.3)
Requirement already satisfied: MarkupSafe>=2.1.1 in /opt/deepmd-kit-3.0.0/lib/python3.12/site-packages (from werkzeug>=1.0.1->tensorboard<2.18,>=2.17->tensorflow) (3.0.2)
Requirement already satisfied: markdown-it-py>=2.2.0 in /opt/deepmd-kit-3.0.0/lib/python3.12/site-packages (from rich->keras>=3.2.0->tensorflow) (3.0.0)
Requirement already satisfied: pygments<3.0.0,>=2.13.0 in /opt/deepmd-kit-3.0.0/lib/python3.12/site-packages (from rich->keras>=3.2.0->tensorflow) (2.18.0)
Requirement already satisfied: mdurl~=0.1 in /opt/deepmd-kit-3.0.0/lib/python3.12/site-packages (from markdown-it-py>=2.2.0->rich->keras>=3.2.0->tensorflow) (0.1.2)
WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager, possibly rendering your system unusable.It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv. Use the --root-user-action option if you know what you are doing and want to suppress this warning.
Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple
Collecting scikeras
  Downloading https://pypi.tuna.tsinghua.edu.cn/packages/ea/09/1c02aa24daf7a003c06f629fbb69dc9ae1bda1b247d7b8981e550d752ac9/scikeras-0.13.0-py3-none-any.whl (26 kB)
Requirement already satisfied: keras>=3.2.0 in /opt/deepmd-kit-3.0.0/lib/python3.12/site-packages (from scikeras) (3.6.0)
Requirement already satisfied: scikit-learn>=1.4.2 in /opt/deepmd-kit-3.0.0/lib/python3.12/site-packages (from scikeras) (1.6.0)
Requirement already satisfied: absl-py in /opt/deepmd-kit-3.0.0/lib/python3.12/site-packages (from keras>=3.2.0->scikeras) (2.1.0)
Requirement already satisfied: numpy in /opt/deepmd-kit-3.0.0/lib/python3.12/site-packages (from keras>=3.2.0->scikeras) (1.26.4)
Requirement already satisfied: rich in /opt/deepmd-kit-3.0.0/lib/python3.12/site-packages (from keras>=3.2.0->scikeras) (13.9.4)
Requirement already satisfied: namex in /opt/deepmd-kit-3.0.0/lib/python3.12/site-packages (from keras>=3.2.0->scikeras) (0.0.8)
Requirement already satisfied: h5py in /opt/deepmd-kit-3.0.0/lib/python3.12/site-packages (from keras>=3.2.0->scikeras) (3.12.1)
Requirement already satisfied: optree in /opt/deepmd-kit-3.0.0/lib/python3.12/site-packages (from keras>=3.2.0->scikeras) (0.13.1)
Requirement already satisfied: ml-dtypes in /opt/deepmd-kit-3.0.0/lib/python3.12/site-packages (from keras>=3.2.0->scikeras) (0.4.0)
Requirement already satisfied: packaging in /opt/deepmd-kit-3.0.0/lib/python3.12/site-packages (from keras>=3.2.0->scikeras) (24.2)
Requirement already satisfied: scipy>=1.6.0 in /opt/deepmd-kit-3.0.0/lib/python3.12/site-packages (from scikit-learn>=1.4.2->scikeras) (1.14.1)
Requirement already satisfied: joblib>=1.2.0 in /opt/deepmd-kit-3.0.0/lib/python3.12/site-packages (from scikit-learn>=1.4.2->scikeras) (1.4.2)
Requirement already satisfied: threadpoolctl>=3.1.0 in /opt/deepmd-kit-3.0.0/lib/python3.12/site-packages (from scikit-learn>=1.4.2->scikeras) (3.5.0)
Requirement already satisfied: typing-extensions>=4.5.0 in /opt/deepmd-kit-3.0.0/lib/python3.12/site-packages (from optree->keras>=3.2.0->scikeras) (4.12.2)
Requirement already satisfied: markdown-it-py>=2.2.0 in /opt/deepmd-kit-3.0.0/lib/python3.12/site-packages (from rich->keras>=3.2.0->scikeras) (3.0.0)
Requirement already satisfied: pygments<3.0.0,>=2.13.0 in /opt/deepmd-kit-3.0.0/lib/python3.12/site-packages (from rich->keras>=3.2.0->scikeras) (2.18.0)
Requirement already satisfied: mdurl~=0.1 in /opt/deepmd-kit-3.0.0/lib/python3.12/site-packages (from markdown-it-py>=2.2.0->rich->keras>=3.2.0->scikeras) (0.1.2)
Installing collected packages: scikeras
Successfully installed scikeras-0.13.0
WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager, possibly rendering your system unusable.It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv. Use the --root-user-action option if you know what you are doing and want to suppress this warning.
代码
文本
[1]
import torch
import torch.nn as nn
import torch.optim as optim
from torch.nn.utils.rnn import pad_sequence
import torch.nn.functional as F
import math
import random
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.preprocessing import MinMaxScaler
/opt/conda/lib/python3.8/site-packages/scipy/__init__.py:146: UserWarning: A NumPy version >=1.16.5 and <1.23.0 is required for this version of SciPy (detected version 1.23.5
  warnings.warn(f"A NumPy version >={np_minversion} and <{np_maxversion}"
代码
文本
[2]
device = 'cuda' if torch.cuda.is_available() else 'cpu' # 如果电脑有 GPU ,则在 GPU 上运算,否则在 CPU 上运算
代码
文本
[ ]

代码
文本
[3]
#如果是非0元素且不是最后一个元素且与下一元素不同的添加到结果列表 result 中
def split_list_by_value(lst):
result = []
temp = []
for i in range(len(lst)):
if lst[i] != 0:
temp.append(lst[i])
if i == len(lst)-1 or lst[i] != lst[i+1]:
result.append(temp)
temp = []
return result
#将长度为 length 的子列表添加到结果列表 result 中
def split_list_by_lengths(lst, lengths):
result = []
start = 0
for length in lengths:
result.append(lst[start:start+length])
start += length
return result
代码
文本
[4]
total_num = 222#数据总数
train_size = 194
test_size = 28
CC_input = []
cyc_len = []
baty_lst = [2,3,4,6,7,8]
for i in baty_lst:
CC_data = pd.read_csv(f"/personal/Capacity data/Data_Capacity_25C0{i}.csv")#用于导入不同电池批次的数据
cycle_num = CC_data.iloc[:, 1:2]["cycle number"].tolist()# .iloc 是用来基于行和列的位置进行索引选择的方法,导入第二行循环次数 cycle number 的数据,并把 Dataframe 数据转换为列表
vol_all = CC_data.iloc[:, 3:4]['Ewe/V'].tolist()# .iloc 是用来基于行和列的位置进行索引选择的方法,导入第四行电压 Ewe/V 的数据, Dataframe 数据转换为列表
cyc = split_list_by_value(cycle_num)#分割循环次数,每个电池的循环都变成 cycle_num 列表中的一个子列表
if i == 7:
cyc = cyc[:-7]#由于部分EIS的数据点异常,去除电池批号为7的最后7个元素
cyc_len.append(len(cyc))
lengths = [len(sublist) for sublist in cyc]#计算 cyc 中每个子列表的长度
vol_list = split_list_by_lengths(vol_all, lengths)#按照 cyc 中每个子列表的长度去分割电压数据
tensor_vol = [torch.tensor(sublist) for sublist in vol_list]
padded_vol = pad_sequence(tensor_vol, batch_first=True, padding_value=0)#将 tensor_vol 中的张量填充到相同的长度, batch_first=True 表示批次大小为第一个维度, padding_value=0 表示用0填充
#print(padded_vol.shape)
new_vol = [t[:1654].view(1654,1) for t in padded_vol]#将 padded_vol 中的每个张量截取前1654个元素,并调整形状为(1, 1654, 1)
CC_input += new_vol#将 new_vol 列表中的元素添加到 CC_input 列表中
print(len(CC_input), cyc_len)
222 [40, 39, 34, 40, 33, 36]
代码
文本
[5]
indices = list(range(len(CC_input)))
random.shuffle(indices)# shuffle 是 random 模块中的一个函数,用于将传入的 indices 就地打乱顺序
代码
文本
[6]
scaler = MinMaxScaler(feature_range=(0, 1))
# CC_input_scaled = []
# for data in CC_input:
# data = np.array(data).squeeze() # 转换为数组并去除多余的维度
# scaled_data = scaler.fit_transform(data.reshape(-1, 1))# 将数据重新形状为(-1, 1)使其适应 MinMaxScaler 的输入格式
# CC_input_scaled.append(torch.tensor(scaled_data).view(1, -1, 1))# 将标准化后的数据转换为 Tensor 并添加到列表中
代码
文本
[7]
train_indices = indices[:train_size]#打乱训练集索引
test_indices = indices[train_size:]#打乱测试集索引
encoder_input_train=[CC_input[i] for i in train_indices]
encoder_input_test=[CC_input[i] for i in test_indices]
代码
文本
[8]
decoder_input = []
decoder_target = []
cyc_tot = 0
#创建一个三维列表,用于存储电化学阻抗谱( EIS )数据.其 shape 为(222, 240, 2).第一维包含222个元素,代表四个电池的总循环次数,每个元素是一个包含两个子列表(实部和虚部)的列表,每个子列表有240个元素(每个电池每个循环的 EIS 有60个点,每个电池每个循环有四个 state ,一共240个)
EIS_list = [[[0 for i in range(240)] for j in range(2)] for r in range(222)]
lst = [1, 4, 5, 9]
for k in baty_lst:
EIS_tot = []
for i in lst:
EIS = pd.read_csv(f"/personal/EIS data/EIS_state_{i}_25C0{k}.csv")#导入不同批次电池不同电池soc状态的EIS数据
cyc_n = cyc_len[baty_lst.index(k)]
#print(cyc_n)
EIS_tot.append(EIS.iloc[:, 3:7][" Re(Z)/Ohm"].tolist()[0:60 * cyc_n])#选择第四列 Re(Z)/Ohm 实部数据
EIS_tot.append(EIS.iloc[:, 4:7][" -Im(Z)/Ohm"].tolist()[0:60 * cyc_n])#选择第五列 -Im(Z)/Ohm 虚部数据
cyc_tot += cyc_n
EIS_totm = [[e2 for e2 in e1] for e1 in EIS_tot]#扁平化嵌套列表
print(np.array(EIS_totm).shape, cyc_tot)
lengths = [60 for i in range(cyc_n)]
# print(lengths)
for i in range(4):
EIS_R = split_list_by_lengths(EIS_totm[2 * i], lengths)#将 EIS 数据的实部按照每个电池的循环次数分割成多个子列表
EIS_I = split_list_by_lengths(EIS_totm[2 * i + 1], lengths)#将 EIS 数据的虚部按照每个电池的循环次数分割成多个子列表
for j in range(cyc_tot - cyc_n, cyc_tot, 1):#这个循环遍历当前电池的 EIS 数据
EIS_list[j][0][60 * i:60 * (i + 1)] = EIS_R[j - cyc_tot + cyc_n]#将实部数据 EIS_R 中的第 j - cyc_tot + cyc_n 个元素(即当前电池的实部数据)赋值给 EIS_list 的相应位置. 60 * i:60 * (i + 1) 确定了在 EIS_list 中的起始和结束索引
EIS_list[j][1][60 * i:60 * (i + 1)] = EIS_I[j - cyc_tot + cyc_n]
EIS_list = [np.array(t).squeeze().T for t in EIS_list]#每个电池的EIS数据都被整理成一个二维数组,其中行代表不同的 SOC 状态,列代表不同的数据点
print(np.array(EIS_list)[0].shape)
(8, 2400) 40
(8, 2340) 79
(8, 2040) 113
(8, 2400) 153
(8, 1980) 186
(8, 2160) 222
(240, 2)
代码
文本
[9]
EIS_scaled = []
for i in range(len(EIS_list)):
EIS_data = EIS_list[i] # 获取 EIS 数据
# 使用 MinMaxScaler 对每个 EIS 数据进行标准化
scaled_EIS = scaler.fit_transform(EIS_data) # 将数据标准化到[0, 1]
EIS_scaled.append(torch.tensor(scaled_EIS).float()) # 转换为 Tensor 并添加到列表中
print("Standardized EIS data:", np.array(EIS_scaled).shape)
Standardized EIS data: (222,)
/tmp/ipykernel_114/8486435.py:7: FutureWarning: The input object of type 'Tensor' is an array-like implementing one of the corresponding protocols (`__array__`, `__array_interface__` or `__array_struct__`); but not a sequence (or 0-D). In the future, this object will be coerced as if it was first converted using `np.array(obj)`. To retain the old behaviour, you have to either modify the type 'Tensor', or assign to an empty array created with `np.empty(correct_shape, dtype=object)`.
  print("Standardized EIS data:", np.array(EIS_scaled).shape)
/tmp/ipykernel_114/8486435.py:7: VisibleDeprecationWarning: Creating an ndarray from ragged nested sequences (which is a list-or-tuple of lists-or-tuples-or ndarrays with different lengths or shapes) is deprecated. If you meant to do this, you must specify 'dtype=object' when creating the ndarray.
  print("Standardized EIS data:", np.array(EIS_scaled).shape)
代码
文本
[10]
decoder_target = [torch.tensor(t).float().view(240,2) for t in EIS_scaled] # 去掉最后一个维度
decoder_input = [torch.ones(240,1) for t in EIS_scaled] # 去掉最后一个维度

decoder_input_train = [decoder_input[i] for i in train_indices]
decoder_target_train = [decoder_target[i] for i in train_indices]
decoder_input_test = [decoder_input[i] for i in test_indices]
decoder_target_test = [decoder_target[i] for i in test_indices]
print(encoder_input_train[0].shape)
print(decoder_input_train[0].shape)
torch.Size([1654, 1])
torch.Size([240, 1])
/tmp/ipykernel_114/2944544641.py:1: UserWarning: To copy construct from a tensor, it is recommended to use sourceTensor.clone().detach() or sourceTensor.clone().detach().requires_grad_(True), rather than torch.tensor(sourceTensor).
  decoder_target = [torch.tensor(t).float().view(240,2) for t in EIS_scaled]  # 去掉最后一个维度
代码
文本
[11]
class TransformerModel(nn.Module):
def __init__(self, feature_dim, hidden_dim, num_heads, num_layers, output_dim):
super(TransformerModel, self).__init__()
# Encoder 和 Decoder 的层
self.encoder = nn.TransformerEncoder(
nn.TransformerEncoderLayer(d_model=hidden_dim, nhead=num_heads),
num_layers=num_layers
)
self.decoder = nn.TransformerDecoder(
nn.TransformerDecoderLayer(d_model=hidden_dim, nhead=num_heads),
num_layers=num_layers
)
# 输出层将隐藏状态映射到目标空间
self.fc_out = nn.Linear(hidden_dim, output_dim)

self.embedding = nn.Linear(feature_dim, hidden_dim) # 线性变换,用于特征嵌入

def forward(self, encoder_input, decoder_input, use_teacher_forcing=True):
# Encoder
encoder_input = self.embedding(encoder_input).permute(1, 0, 2) # [seq_len, batch_size, hidden_dim]
memory = self.encoder(encoder_input) # [seq_len, batch_size, hidden_dim]

if use_teacher_forcing:
# 训练阶段:直接使用 decoder_input
decoder_input = self.embedding(decoder_input).permute(1, 0, 2) # [seq_len, batch_size, hidden_dim]
output = self.decoder(decoder_input, memory) # [seq_len, batch_size, hidden_dim]
else:
# 测试阶段:自回归解码(逐步生成)
seq_len, batch_size, _ = encoder_input.shape
outputs = []

# 初始化 decoder_input,通常是某种形式的初始化
decoder_input = torch.zeros(batch_size, 1, device=encoder_input.device) # [batch_size, 1, hidden_dim]

for t in range(seq_len):
decoder_input = self.embedding(decoder_input).permute(1, 0, 2) # [1, batch_size, hidden_dim]
output = self.decoder(decoder_input, memory) # [1, batch_size, hidden_dim]

# 获取输出的最后一个时间步,并添加到输出列表
outputs.append(output.squeeze(0)) # [batch_size, hidden_dim]
# 更新 decoder_input,使用当前输出作为下一步的输入
decoder_input = output.squeeze(0).unsqueeze(1) # [batch_size, 1, hidden_dim]
# 将所有输出按时间步堆叠起来,最终形状为 [seq_len, batch_size, hidden_dim]
outputs = torch.stack(outputs, dim=0) # [seq_len, batch_size, hidden_dim]

# 将 Transformer 的输出通过全连接层映射到目标空间
outputs = self.fc_out(outputs) # [seq_len, batch_size, output_dim]

return outputs


# 设置模型参数
feature_dim = 1 # 输入数据的特征维度,电压数据
hidden_dim = 256 # 隐藏层维度
num_heads = 1 # 多头注意力的头数
num_layers = 4 # Encoder 和 Decoder 的层数
output_dim = 2 # 输出维度(阻抗数据:实部和虚部)

# 实例化模型并转移到设备
model = TransformerModel(feature_dim, hidden_dim, num_heads, num_layers, output_dim).to(device)

代码
文本
[13]
criterion = nn.MSELoss().to(device)
optimizer = optim.Adam(model.parameters(), lr=0.001)

# 训练过程
num_epochs = 20
batch_size = 10

train_losses = [] # 记录每个epoch的训练损失

for epoch in range(num_epochs):
epoch_loss = 0.0
teacher_forcing_ratio = max(0.5 * (1 - epoch / num_epochs), 0.0)
for batch_idx in range(0, len(encoder_input_train), batch_size):
batch_encoder_input = torch.stack(encoder_input_train[batch_idx:batch_idx + batch_size], dim=0).to(device)
batch_decoder_input = torch.stack(decoder_input_train[batch_idx:batch_idx + batch_size], dim=0).to(device)
batch_decoder_target = torch.stack(decoder_target_train[batch_idx:batch_idx + batch_size], dim=0).to(device)

# 转换为 [seq_len, batch_size, feature_dim] 形状
batch_encoder_input = batch_encoder_input.permute(1, 0, 2) # [seq_len, batch_size, feature_dim]
batch_decoder_input = batch_decoder_input.permute(1, 0, 2) # [seq_len, batch_size, feature_dim]

optimizer.zero_grad()
# 使用教师强迫(teacher forcing)来训练模型
use_teacher_forcing = torch.rand(1).item() < teacher_forcing_ratio
outputs = model(batch_encoder_input, batch_decoder_input, use_teacher_forcing=use_teacher_forcing)
# 计算损失(模型输出的形状是 [seq_len, batch_size, output_dim],目标是 [seq_len, batch_size, output_dim])
loss = criterion(outputs, batch_decoder_target.permute(1, 0, 2)) # 确保目标也是 [seq_len, batch_size, output_dim]

loss.backward()
optimizer.step()

epoch_loss += loss.item()

avg_epoch_loss = epoch_loss / (len(encoder_input_train) // batch_size)
train_losses.append(avg_epoch_loss)
print(f"Epoch [{epoch+1}/{num_epochs}], Loss: {avg_epoch_loss:.4f}")
代码
文本
[14]
model.eval().to (device)
test_losses = []
for batch_idx in range(0, test_size, batch_size):
batch_encoder_input = torch.cat(encoder_input_test[batch_idx:batch_idx+batch_size], dim=0).to (device)
batch_decoder_input = torch.cat(decoder_input_test[batch_idx:batch_idx+batch_size], dim=0).to (device)
batch_decoder_target = torch.cat(decoder_target_test[batch_idx:batch_idx+batch_size], dim=0).to (device)

with torch.no_grad():
outputs = model(batch_encoder_input, batch_decoder_input, use_teacher_forcing).to (device)
loss = criterion(outputs, batch_decoder_target).to (device)
test_losses.append(loss.item())
mean_mse = np.mean(test_losses)
test_rmse = mean_mse ** 0.5
print(f"Test Loss: {mean_mse:.4f} Test RMSE: {test_rmse:.4f}")
---------------------------------------------------------------------------
RuntimeError                              Traceback (most recent call last)
Cell In[14], line 9
      6 batch_decoder_target = torch.cat(decoder_target_test[batch_idx:batch_idx+batch_size], dim=0).to (device)
      8 with torch.no_grad():
----> 9     outputs = model(batch_encoder_input, batch_decoder_input, use_teacher_forcing).to (device)
     10     loss = criterion(outputs, batch_decoder_target).to (device)
     11     test_losses.append(loss.item())

File /opt/deepmd-kit-3.0.0/lib/python3.12/site-packages/torch/nn/modules/module.py:1553, in Module._wrapped_call_impl(self, *args, **kwargs)
   1551     return self._compiled_call_impl(*args, **kwargs)  # type: ignore[misc]
   1552 else:
-> 1553     return self._call_impl(*args, **kwargs)

File /opt/deepmd-kit-3.0.0/lib/python3.12/site-packages/torch/nn/modules/module.py:1562, in Module._call_impl(self, *args, **kwargs)
   1557 # If we don't have any hooks, we want to skip the rest of the logic in
   1558 # this function, and just call forward.
   1559 if not (self._backward_hooks or self._backward_pre_hooks or self._forward_hooks or self._forward_pre_hooks
   1560         or _global_backward_pre_hooks or _global_backward_hooks
   1561         or _global_forward_hooks or _global_forward_pre_hooks):
-> 1562     return forward_call(*args, **kwargs)
   1564 try:
   1565     result = None

Cell In[12], line 23, in TransformerModel.forward(self, encoder_input, decoder_input, use_teacher_forcing)
     21 def forward(self, encoder_input, decoder_input, use_teacher_forcing=True):
     22 # Encoder
---> 23     encoder_input = self.embedding(encoder_input).permute(1, 0, 2)  # [seq_len, batch_size, hidden_dim]
     24     memory = self.encoder(encoder_input)  # [seq_len, batch_size, hidden_dim]
     26     if use_teacher_forcing:
     27     # 训练阶段:直接使用 decoder_input

RuntimeError: permute(sparse_coo): number of dimensions in the tensor input does not match the length of the desired ordering of dimensions i.e. input.dim() = 2 is not equal to len(dims) = 3
代码
文本
[ ]
predict_outputs = outputs[0].view(1, 240, 2).tolist()
predict_data = np.array(predict_outputs).squeeze().T
decoder_target = batch_decoder_target[0].view(1, 240, 2).tolist()
target_data = np.array(decoder_target).squeeze().T
代码
文本
[ ]
for i in range(4):
if i == 1:
label_p = 'Predict EIS'
label_t = 'Target EIS'
else:
label_p = None
label_t = None

plt.plot(predict_data[0][60 * i:60 * (i + 1)], predict_data[1][60 * i:60 * (i + 1)], 'ro-', label=label_p)
plt.plot(target_data[0][60 * i:60 * (i + 1)], target_data[1][60 * i:60 * (i + 1)], 'bo-', label=label_t)

plt.xlabel('Z_re')
plt.ylabel('Z_im')
plt.legend()
plt.show()

代码
文本
[ ]
plt.figure(figsize=(11, 25))
title_name = [1, 4, 5, 9]
for i in range(4):
label_p = 'Predict EIS'
label_t = 'Target EIS'

plt.subplot(5, 2, i + 1)
plt.plot(predict_data[0][60 * i:60 * (i + 1)], predict_data[1][60 * i:60 * (i + 1)], 'ro-', label=label_p)
plt.plot(target_data[0][60 * i:60 * (i + 1)], target_data[1][60 * i:60 * (i + 1)], 'bo-', label=label_t)
titname = title_name[i]
plt.title(f"state {titname}")
plt.xlabel('Z_re')
plt.ylabel('Z_im')
plt.legend()

plt.show()
代码
文本
[ ]
def r2_score(y_true, y_pred):
ss_total = np.sum((y_true - np.mean(y_true)) ** 2)
ss_res = np.sum((y_true - y_pred) ** 2)
r2 = 1 - (ss_res / ss_total)
return r2


r2_r = 0
r2_i = 0
for i in range(4):
r2_r += r2_score(target_data[0][60 * i:60 * (i + 1)], predict_data[0][60 * i:60 * (i + 1)]) / 4
r2_i += r2_score(target_data[1][60 * i:60 * (i + 1)], predict_data[1][60 * i:60 * (i + 1)]) / 4

print(f"R2 real score:{r2_r.item():.4f}", f"R2 imaginary score:{r2_i.item():.4f}")

for i in range(4):
if i == 0:
plt.plot(target_data[0][60 * i:60 * (i + 1)], target_data[0][60 * i:60 * (i + 1)], 'c-', linewidth=2,
label='ground truth')
label_p = f'R2_real score:{r2_r:.4f}'
else:
label_p = None
plt.plot(target_data[0][60 * i:60 * (i + 1)], predict_data[0][60 * i:60 * (i + 1)], 'mo', markerfacecolor='none',
label=label_p)
plt.xlabel('real_true')
plt.ylabel('real_pred')
plt.title('Z real R2')
plt.legend()
plt.show()

for i in range(4):
if i == 0:
plt.plot(target_data[1][60 * i:60 * (i + 1)], target_data[1][60 * i:60 * (i + 1)], 'c-', linewidth=2,
label='ground truth')
label_p = f'R2_image score:{r2_i:.4f}'
else:
label_p = None
plt.plot(target_data[1][60 * i:60 * (i + 1)], predict_data[1][60 * i:60 * (i + 1)], 'mo', markerfacecolor='none',
label=label_p)
plt.xlabel('real_true')
plt.ylabel('real_pred')
plt.title('Z image R2')
plt.legend()
plt.show()
代码
文本
AI4S
AI4S
点个赞吧
{/**/}