0. 模型梗概
本改进代码,基于文献Journal of Power Sources和已有公开模型Data-driven EIS Prediction,做出全流程优化,改进代码相比原文献代码,更加模块化、鲁棒性更强,同时在模型设计和评估指标的丰富性上都有显著提升。 分为以下五个模块:
模块 1:特征提取
逻辑独立,专注于根据频率点提取特征。 频率点查找采用 argmin,适合于离散频率点的近似匹配。
模块 2:数据标准化
逻辑独立,支持归一化操作,适应多种数据范围。 提供 min_val 和 max_val 参数,允许对数据进行一致性归一化(例如跨批次处理时)。
模块 3:数据加载与处理
将特征提取和标准化整合,调用 extract_features 和 normalize_data。 确保 normalize=True 时,数据已被标准化。
模块 4:训练与验证
分别定义训练过程和验证过程,支持批量训练与评估。
模块 5:主函数
使用调整后的数据加载模块,简化了主函数逻辑。 提供更清晰的流水线,包括加载、分割、训练和可视化。
模块 1:特征提取
功能说明:提取指定频率点的特征,包括阻抗的实部 (Re) 和虚部 (Im)。 从原始数据中精确定位接近目标频率点的数据,返回一个统一格式的特征张量
逻辑拆解:
张量化: 将频率和阻抗数据从 Pandas 转换为 PyTorch 张量,方便后续的高效操作。
频率点近似匹配: 使用 torch.abs(freq - f).argmin() 找到离目标频率最近的索引。
堆叠特征: 将 Re 和 Im 的特征值堆叠为 [2, len(freqs)] 格式,支持后续输入到模型。
模块 2:数据标准化
功能说明 对输入数据进行归一化,将其压缩到 [0, 1] 范围。 支持用户指定的最小值和最大值,也可自动计算。
逻辑拆解:
自动计算最小值和最大值: 如果未提供 min_val 和 max_val,从数据中计算。
计算范围: 避免除以零的情况,通过设置一个很小的数值 1e-8。
归一化: 将数据调整为 [0, 1],公式为 (data - min_val) / range_val。
模块 3:数据加载与处理
功能说明 从目录中加载原始数据。 调用 extract_features 提取指定频率点的特征。 根据需求调用 normalize_data 对特征进行标准化处理。
逻辑拆解:
遍历文件: 检查目录下所有 .csv 文件并加载。
按周期提取特征: 对每个 cycle 分别调用 extract_features。
可选标准化: 如果 normalize=True,调用 normalize_data 进行归一化。
模块 4:训练与验证
功能说明 分别定义训练过程和验证过程,支持批量训练与评估。
逻辑拆解:
训练过程: 前向传播、计算损失、反向传播、参数更新。
验证过程: 仅执行前向传播和损失计算,记录预测值和真实值。
模块 5:主函数
功能说明 组织数据加载、特征处理、训练与验证的整体流程。
整体分析与改进优势
1. 数据加载和处理的优化
改动内容:
- 重构了
load_data
函数:- 从指定频率点(
CHAR_F
)提取Re(Z)
和-Im(Z)
特征。 - 使用
torch.stack
高效地将特征组合成具有明确维度的张量。
- 从指定频率点(
- 增加cycle number 作为模型输入特征,能够显著提升模型的表现与结果解释能力。
优点:
- 模块化改进:
- 数据加载、预处理和特征提取的逻辑分离,更清晰、更易维护。
- 动态特征提取:
- 支持从指定频率点灵活提取特征,便于适配不同任务需求。 -cycle number(循环次数)作为特征
- 能显著提高模型的预测能力、泛化能力及物理解释性。 -它能够帮助模型捕捉实验的时间序列关系,减少误差,并提供更丰富的分析维度,使结果更贴近实验实际情况 -对于动态变化明显的实验数据,cycle number** 是一个关键且不可忽略的输入特征。
2. 模型架构的增强
改动内容:
- 引入了残差块(
ResidualBlock
类)。 - 使用自适应池化层和卷积层代替简单的全连接层(
EISConvNet
类)。
优点:
- 残差学习:
- 解决深层网络中的梯度消失问题,提高模型在深层架构下的性能。
- 更好地处理序列数据:
- 自适应池化允许模型处理不同长度的输入序列,同时保持输出的一致性。
- 可扩展性:
- 模型设计更加灵活,可以轻松增加深度和宽度。
3. 训练和验证的改进
改动内容:
- 增加了独立的训练函数
train_epoch
和验证函数validate_epoch
。 - 在训练过程中动态计算并记录R²和RMSE。
优点:
- 代码可读性:
- 将训练和验证逻辑独立出来,提高代码的逻辑清晰度。
- 更全面的评估:
- 同时记录R²和RMSE,为模型的预测能力提供更全面的评估指标。
4. 可视化的增强
改动内容:
- 增加了以下绘图函数:
- 损失曲线(
plot_loss
):标题中显示平均R²和RMSE。 - 真实值与预测值的散点图(
plot_predictions_scatter
)。 - 残差分析(
plot_residual_analysis
),包括残差分布图和QQ图。
- 损失曲线(
优点:
- 更好的分析能力:
- 通过多种可视化图表,更清晰地了解模型的行为和性能。
- 视觉效果改进:
- 使用透明度(alpha)和网格线(grid)提升了图表的美观性和可读性。
5. 错误处理与调试
改动内容:
- 增加了对空数据集的检查(
if len(EIS_data) == 0
)。 - 使用
pad_or_truncate
函数动态地对输入数据进行填充或截断。
优点:
- 更高的鲁棒性:
- 确保当数据集为空或格式错误时,及时抛出异常。
- 更好的适配性:
- 对于不同长度的输入序列,自动填充或截断以保证维度一致性。
6. 平均R²和RMSE的计算与展示
改动内容:
- 在所有epoch结束后,计算并展示平均R²和RMSE。
- 将这些平均值直接标注在损失曲线图上。
优点:
- 总结性指标:
- 提供训练过程的整体表现,为模型选择提供依据。
7. 训练轮次的调整
改动内容:
- 将训练循环扩展为300轮,并每10轮输出一次结果。
优点:
- 更充分的优化:
- 增加训练轮次,确保模型能够充分收敛。
- 定期输出:
- 每10轮输出一次结果,避免日志过于冗长,同时保持训练过程的可跟踪性。
改进总结
- 模块化设计:
- 数据加载、训练、验证、绘图等功能独立封装,便于扩展与维护。
- 模型架构优化:
- 残差块和自适应池化提升了深层网络的学习能力。
- 多样化的可视化:
- 通过预测值与真实值散点图、残差分析等图表,直观地展示模型性能。
- 全面的指标评估:
- 同时记录并展示R²和RMSE,为模型性能提供多维度衡量。
- 训练流程更加完善:
- 增加epoch轮次并定期输出,进一步提升模型训练的收敛性和可视化能力。
附录1:整合版代码(含解析)
附录2:输出结果与分析
1.epoch=200
Total samples: 1350 Epoch 10, Train Loss: 0.000041, Valid Loss: 0.000019, R²: 0.9996, RMSE: 0.0044 Epoch 20, Train Loss: 0.000034, Valid Loss: 0.000023, R²: 0.9995, RMSE: 0.0048 Epoch 30, Train Loss: 0.000051, Valid Loss: 0.000033, R²: 0.9993, RMSE: 0.0058 Epoch 40, Train Loss: 0.000021, Valid Loss: 0.000008, R²: 0.9998, RMSE: 0.0028 Epoch 50, Train Loss: 0.000048, Valid Loss: 0.000015, R²: 0.9997, RMSE: 0.0039 Epoch 60, Train Loss: 0.000048, Valid Loss: 0.000013, R²: 0.9997, RMSE: 0.0036 Epoch 70, Train Loss: 0.000017, Valid Loss: 0.000049, R²: 0.9989, RMSE: 0.0070 Epoch 80, Train Loss: 0.000038, Valid Loss: 0.000044, R²: 0.9990, RMSE: 0.0066 Epoch 90, Train Loss: 0.000018, Valid Loss: 0.000007, R²: 0.9998, RMSE: 0.0027 Epoch 100, Train Loss: 0.000031, Valid Loss: 0.000028, R²: 0.9994, RMSE: 0.0053 Epoch 110, Train Loss: 0.000022, Valid Loss: 0.000045, R²: 0.9990, RMSE: 0.0067 Epoch 120, Train Loss: 0.000026, Valid Loss: 0.000025, R²: 0.9994, RMSE: 0.0050 Epoch 130, Train Loss: 0.000024, Valid Loss: 0.000011, R²: 0.9998, RMSE: 0.0033 Epoch 140, Train Loss: 0.000025, Valid Loss: 0.000060, R²: 0.9987, RMSE: 0.0077 Epoch 150, Train Loss: 0.000013, Valid Loss: 0.000008, R²: 0.9998, RMSE: 0.0028 Epoch 160, Train Loss: 0.000018, Valid Loss: 0.000011, R²: 0.9998, RMSE: 0.0033 Epoch 170, Train Loss: 0.000021, Valid Loss: 0.000044, R²: 0.9990, RMSE: 0.0066 Epoch 180, Train Loss: 0.000014, Valid Loss: 0.000003, R²: 0.9999, RMSE: 0.0018 Epoch 190, Train Loss: 0.000017, Valid Loss: 0.000008, R²: 0.9998, RMSE: 0.0027 Epoch 200, Train Loss: 0.000028, Valid Loss: 0.000038, R²: 0.9992, RMSE: 0.0061
2.epoch=300
Total samples: 1350 Epoch 10, Train Loss: 0.000104, Valid Loss: 0.000111, R²: 0.9975, RMSE: 0.0105
Epoch 20, Train Loss: 0.000078, Valid Loss: 0.000138, R²: 0.9969, RMSE: 0.0117
Epoch 30, Train Loss: 0.000055, Valid Loss: 0.000031, R²: 0.9993, RMSE: 0.0055
Epoch 40, Train Loss: 0.000038, Valid Loss: 0.000024, R²: 0.9995, RMSE: 0.0049
Epoch 50, Train Loss: 0.000055, Valid Loss: 0.000010, R²: 0.9998, RMSE: 0.0032
Epoch 60, Train Loss: 0.000059, Valid Loss: 0.000039, R²: 0.9991, RMSE: 0.0063
Epoch 70, Train Loss: 0.000049, Valid Loss: 0.000030, R²: 0.9993, RMSE: 0.0055
Epoch 80, Train Loss: 0.000026, Valid Loss: 0.000031, R²: 0.9993, RMSE: 0.0055
Epoch 90, Train Loss: 0.000035, Valid Loss: 0.000023, R²: 0.9995, RMSE: 0.0048
Epoch 100, Train Loss: 0.000035, Valid Loss: 0.000062, R²: 0.9986, RMSE: 0.0079
Epoch 110, Train Loss: 0.000025, Valid Loss: 0.000054, R²: 0.9988, RMSE: 0.0074
Epoch 120, Train Loss: 0.000022, Valid Loss: 0.000029, R²: 0.9993, RMSE: 0.0054
Epoch 130, Train Loss: 0.000021, Valid Loss: 0.000017, R²: 0.9996, RMSE: 0.0042
Epoch 140, Train Loss: 0.000025, Valid Loss: 0.000017, R²: 0.9996, RMSE: 0.0041
Epoch 150, Train Loss: 0.000022, Valid Loss: 0.000013, R²: 0.9997, RMSE: 0.0036
Epoch 160, Train Loss: 0.000022, Valid Loss: 0.000045, R²: 0.9990, RMSE: 0.0067
Epoch 170, Train Loss: 0.000042, Valid Loss: 0.000069, R²: 0.9985, RMSE: 0.0083
Epoch 180, Train Loss: 0.000027, Valid Loss: 0.000026, R²: 0.9994, RMSE: 0.0051
Epoch 190, Train Loss: 0.000023, Valid Loss: 0.000014, R²: 0.9997, RMSE: 0.0037
Epoch 200, Train Loss: 0.000045, Valid Loss: 0.000028, R²: 0.9994, RMSE: 0.0053
Epoch 210, Train Loss: 0.000021, Valid Loss: 0.000037, R²: 0.9992, RMSE: 0.0061
Epoch 220, Train Loss: 0.000036, Valid Loss: 0.000041, R²: 0.9991, RMSE: 0.0064
Epoch 230, Train Loss: 0.000017, Valid Loss: 0.000019, R²: 0.9996, RMSE: 0.0044
Epoch 240, Train Loss: 0.000024, Valid Loss: 0.000006, R²: 0.9999, RMSE: 0.0024
Epoch 250, Train Loss: 0.000028, Valid Loss: 0.000010, R²: 0.9998, RMSE: 0.0032
Epoch 260, Train Loss: 0.000018, Valid Loss: 0.000006, R²: 0.9999, RMSE: 0.0025
Epoch 270, Train Loss: 0.000014, Valid Loss: 0.000003, R²: 0.9999, RMSE: 0.0018
Epoch 280, Train Loss: 0.000012, Valid Loss: 0.000009, R²: 0.9998, RMSE: 0.0030
Epoch 290, Train Loss: 0.000013, Valid Loss: 0.000012, R²: 0.9997, RMSE: 0.0035
Epoch 300, Train Loss: 0.000013, Valid Loss: 0.000011, R²: 0.9998, RMSE: 0.0033
3.epoch=500
Total samples: 1350 Epoch 10, Train Loss: 0.000052, Valid Loss: 0.000023 Epoch 20, Train Loss: 0.000067, Valid Loss: 0.000056 Epoch 30, Train Loss: 0.000072, Valid Loss: 0.000066 Epoch 40, Train Loss: 0.000026, Valid Loss: 0.000027 Epoch 50, Train Loss: 0.000033, Valid Loss: 0.000201 Epoch 60, Train Loss: 0.000021, Valid Loss: 0.000013 Epoch 70, Train Loss: 0.000037, Valid Loss: 0.000032 Epoch 80, Train Loss: 0.000064, Valid Loss: 0.000079 Epoch 90, Train Loss: 0.000024, Valid Loss: 0.000039 Epoch 100, Train Loss: 0.000045, Valid Loss: 0.000072 Epoch 110, Train Loss: 0.000025, Valid Loss: 0.000034 Epoch 120, Train Loss: 0.000025, Valid Loss: 0.000016 Epoch 130, Train Loss: 0.000022, Valid Loss: 0.000010 Epoch 140, Train Loss: 0.000019, Valid Loss: 0.000021 Epoch 150, Train Loss: 0.000021, Valid Loss: 0.000008 Epoch 160, Train Loss: 0.000023, Valid Loss: 0.000020 Epoch 170, Train Loss: 0.000027, Valid Loss: 0.000018 Epoch 180, Train Loss: 0.000035, Valid Loss: 0.000015 Epoch 190, Train Loss: 0.000020, Valid Loss: 0.000013 Epoch 200, Train Loss: 0.000021, Valid Loss: 0.000024 Epoch 210, Train Loss: 0.000024, Valid Loss: 0.000019 Epoch 220, Train Loss: 0.000014, Valid Loss: 0.000013 Epoch 230, Train Loss: 0.000036, Valid Loss: 0.000023 Epoch 240, Train Loss: 0.000022, Valid Loss: 0.000002 Epoch 250, Train Loss: 0.000023, Valid Loss: 0.000008 Epoch 260, Train Loss: 0.000010, Valid Loss: 0.000003 Epoch 270, Train Loss: 0.000012, Valid Loss: 0.000003 Epoch 280, Train Loss: 0.000012, Valid Loss: 0.000006 Epoch 290, Train Loss: 0.000016, Valid Loss: 0.000012 Epoch 300, Train Loss: 0.000012, Valid Loss: 0.000005 Epoch 310, Train Loss: 0.000022, Valid Loss: 0.000011 Epoch 320, Train Loss: 0.000017, Valid Loss: 0.000013 Epoch 330, Train Loss: 0.000014, Valid Loss: 0.000009 Epoch 340, Train Loss: 0.000012, Valid Loss: 0.000031 Epoch 350, Train Loss: 0.000014, Valid Loss: 0.000011 Epoch 360, Train Loss: 0.000012, Valid Loss: 0.000015 Epoch 370, Train Loss: 0.000024, Valid Loss: 0.000005 Epoch 380, Train Loss: 0.000016, Valid Loss: 0.000024 Epoch 390, Train Loss: 0.000011, Valid Loss: 0.000011 Epoch 400, Train Loss: 0.000006, Valid Loss: 0.000004 Epoch 410, Train Loss: 0.000017, Valid Loss: 0.000026 Epoch 420, Train Loss: 0.000021, Valid Loss: 0.000032 Epoch 430, Train Loss: 0.000014, Valid Loss: 0.000005 Epoch 440, Train Loss: 0.000013, Valid Loss: 0.000004 Epoch 450, Train Loss: 0.000009, Valid Loss: 0.000002 Epoch 460, Train Loss: 0.000009, Valid Loss: 0.000004 Epoch 470, Train Loss: 0.000006, Valid Loss: 0.000004 Epoch 480, Train Loss: 0.000008, Valid Loss: 0.000002 Epoch 490, Train Loss: 0.000015, Valid Loss: 0.000015 Epoch 500, Train Loss: 0.000021, Valid Loss: 0.000024
附录3:参考文献
1.使用四个特征频率下的阻抗预测全频段:https://bohrium.dp.tech/notebooks/86866189178
2.关于基于 ResNet 的思想的参考文献:https://arxiv.org/abs/1512.03385
3.用于时间序列或信号处理的 CNN:https://ieeexplore.ieee.org/document/7966039
4.将 CNN 应用于时间序列数据(如频率和阻抗)的特定优势: https://ieeexplore.ieee.org/document/7966039