作者 | Hannes Knobloch
来源 | codeingschool
编辑 | 代码医生团队
可以在GitHub上找到这个项目的源代码:
https://github.com/dsr-18/long-live-the-battery?source=post_page-----c5e1faeecc8f----------------------
锂离子电池几乎为生活中的每一种电子设备供电,包括手机和笔记本电脑。它们是可再生能源和电动汽车的核心。多年来,公司一直试图预测电池在死前会持续多少次充电。更好的预测可以实现更准确的质量评估并改善长期规划。
但这很难,因为每个电池的老化程度不同,具体取决于制造过程中的使用情况和条件。Kristen A. Severson等人最近发表的一篇名为数据驱动预测电池循环寿命的论文由Kristen A. Severson等人发表,声称通过“综合实验数据与人工智能相结合”找到了解决这一问题的关键。尽管他们的结果领先于传统方法,但团队更多地关注他们在电气工程领域的知识,而不是机器学习部分。
https://www.nature.com/articles/s41560-019-0356-8
好消息:研究人员已经公开提供了同类产品中最大的数据集!虽然数据集仅限于在实验室环境中使用新电池进行测量,但它仍然是同类产品中最全面的。使用更复杂的机器学习方法来构建更通用和准确的模型,以预测电池寿命(在这些情况下)。在这里可以看到它的实际效果:
https://data.matr.io/1/
www.ion-age.org/example
本文从头到尾介绍了研究过程。此外还介绍了工作流程和工具,为初学数据科学家提供了自己项目的灵感。
想要预测什么?
该论文的作者专注于全新电池并预测其寿命。这是令人印象深刻的,但如果想诊断一个已经在使用的电池,那就不走运了。相反希望预测任何电池的使用寿命和新电池的剩余循环寿命。
另一个警告是预测所需的数据量。研究人员使用第一次和第一百次充电周期的数据进行预测。目标是通过仅连续20个充电周期的测量结果获得准确的结果,使该模型更适用于现实世界。最重要的是,了解电池的当前年龄会很有用。
这引出了以下问题定义:
在有限数量的充电循环期间进行测量,电池单元经历了多少次循环以及它在断开之前会持续多少个循环?
逐步完成构建模型的步骤并预测它!
理解数据
原始论文的作者组装了124个锂离子电池以测量来自的数据。根据许多预定策略之一对每个电池进行充电和放电,直到电池达到其原始容量的80%(意味着电池对于正常使用而言变得太不可靠并且被认为是“损坏”)。到达此状态之前的循环次数(完全充电,然后完全放电)称为电池循环寿命,这是目标之一。在数据集中,这个数字差异很大,从150到2,300不等。
循环数据集中电池单元的寿命。大多数细胞在被认为破碎之前持续约500个充电周期。
每个单元格的数据以嵌套结构呈现,其中一些特征仅在每个周期测量一次,而其他特征多次测量。在整个周期内,对容量,温度,电压和电流进行了一千多次测量,但对于其他指标(如电池内阻或总循环时间)只有一次标量测量。
数据由124个电池组成,每个电池单元经历了可变数量的充电循环,并且对于每个循环,随时间进行测量并进行标量测量。
由于在实验控制的充电策略期间(在不同的电池之间变化)进行了大量的测量,将数据裁剪到放电周期(在所有电池中是可比较的)。这将带到下一步......
处理数据
原始测量数据可能非常嘈杂。测量之间的距离并不总是相等,应该单调减少的数据会意外地增加,有时硬件会关闭并在随机时间点继续测量。因此,在将数据提供给模型之前,特别注意数据是否干净且格式正确。
删除了具有时间间隔,小异常值或其他不一致性的循环。发现的用于平滑噪声的一个特别有用的东西是savitzky golay滤波器。这有助于恢复一些在实验过程中存在测量问题的数据样本。
https://docs.scipy.org/doc/scipy-0.16.1/reference/generated/scipy.signal.savgol_filter.html
数据中的另一个问题是时间问题。不同的充电政策意味着某些周期比其他周期更快完成,并且无法比较充电和温度的时间测量结果。相反以与原始论文类似的方式重新采样数据:
完成!对于每个细胞和周期,所有测量现在具有相同的长度,但是仍然具有1000步的一些特征而其他仅作为标量。在将阵列特征和标量特征同时输入到模型中时,如何避免形状不匹配?一种解决方案是在不同的入口点将数据提供给模型,并在以后将所有内容组合在一起。当详细讨论模型时,这个技巧将变得更加清晰。还需要做一件事。
为了能够检测趋势,将多个连续的充电周期作为输入。称之为窗口的这些循环组。整个窗口应始终只有一个目标,但每个循环都有一个“当前循环”和“剩余循环”值。这就是为什么将最后一个循环中的值定义为整个窗口的目标。
建立框架
在深入研究数据并创建酷模型之前,需要考虑一下设置。希望从头到尾使用TensorFlow 2.0,以便从tensorboard,数据集API和超参数调整等集成功能中获益。
选择框架后,决定在哪个平台上运行训练工作。使用Google Cloud的AI平台,而不是让自己的笔记本电脑过热。AI平台允许同时运行多个训练工作,轻松标记并监控流程。
这需要一些设置。这可能需要相当长的时间才能在第一时间正确完成,因此不会详细介绍本文中的所有细节。这是一个总结:
现在可以从命令行启动一个训练工作,并可以选择几乎动态修改所有内容。可以通过在命令之后添加标志来调整诸如时期数,批量大小,改组,检查点保存以及甚至在模型架构之间轻松切换之类的事情。这能够快速迭代,测试不同的理论,并通过大量(免费)学分。
开发模型
使用功能API使用tf.Keras构建了模型。在单独的入口点将数组和标量特征提供给模型,因此可以在将它们重新组合之前对它们执行不同的操作。
每个窗口中的数组特征沿着它们的短边连接,使它们成为具有形状(窗口大小,长度,特征数量)的3D矩阵。然后可以通过MaxPooling将这个矩阵传递到三个Conv2D层,从中提取相关信息,同时保持窗口的顺序性。Conv2D作用于“特征数量”维度,就好像这些是图像中的颜色通道数量。这是因为阵列特征共享相同的电压范围,因此高度相关(就像图像中的RGB通道一样)。在卷积之后,将数据展平为1D阵列。
进入模型的数据分为数组特征和标量特征。两者在连接之前单独处理,并通过完全连接的密集网络发送以产生两个输出。
在窗口方向上以类似的方式连接标量特征,以生成具有形状(窗口大小,特征数量)的数组,然后通过两个Conv1D层与一个MaxPooling一起传递并最终展平它。
现在有两个带有特征映射的平面阵列,可以轻松地将它们组合在一起并将其馈送到完全连接的密集网络中以产生结果。
训练和调整模型
在建立模型之后,是时候进行训练了。编写了一个脚本来在一个简单的命令行界面中调用GCP API,因此当在项目的主目录中时,在云中启动训练作业变得非常简单:
./train.sh
例如,如果想要修改训练时期的数量和每个窗口的样本数量,脚本将允许使用简单的标志来执行此操作:
./train.sh -e 70 -w 10
在训练期间,跟踪了列车(橙色)和验证(蓝色)集合中的三个指标:当前周期的损失和平均绝对误差(MAE)以及剩余周期。几分钟后,可以在TensorBoard中查看结果。看看损失是什么样的:
在68个时期的第一次训练中以均方误差测量的损失。橙色是训练损失,蓝色是验证损失。
它正朝着正确的方向前进,但对列车与验证损失之间的差距感到不满。为了减少这种差距,辍学是一种流行的工具,因此将其添加到模型中。还需要调整超参数,这就是在不同设置上使用gridsearch的原因。为了跟踪这些设置,使用了TensorFlow 2.0中的hparams模块,可以在tensorboard.plugins中找到它。现在能够比较不同的运行并选择最有效的参数。
由于“当前”和“剩余周期”的正确预测应始终大于零,尝试将ReLU作为输出层的激活函数,以减少训练过程中模型的搜索空间。此外模型严重依赖于CNN,因此也尝试了不同的内核大小。最后测试了两种不同的学习速率,测量了当前周期的MAE和设置的剩余周期。
gridsearch的结果显示在TensorBoard中。每条彩色线代表一个参数设置。
通过从超参数调整获得的最佳模型设置,并通过将训练时期的数量设置为1000,最终获得了一个模型,当前为90 MAE,其余周期为115 MAE:
对于最终训练超过1000个时期的平均平方误差测量的损失,平滑因子约为0.6。
平均绝对误差,最终训练的当前周期超过1000个时期,显示平滑因子约为0.6。
平均绝对误差,最终训练超过1000个时期的剩余周期,平滑因子约为0.6。
它仍然不完美,但对想到的应用程序的结果非常满意(终于得到了一些值得庆祝的食物!)。
作出预测
当查看最佳设置的训练曲线时,可以看到最低损失不是在训练结束时,而是通过训练大约四分之三。如何使用该模型进行预测?必须实施检查点,以便在训练期间的某些时间恢复已保存的模型。
一旦有了模型,就可以使用TensorFlow服务或诸如Flask之类的Web框架来提供模型。当时Google Cloud Platform不支持TF2 Serving,因此决定在Flask中完全构建应用程序并将其托管在AWS EC2实例上。
可以在此处再次查看结果:
www.ion-age.org/example
加载随机样本文件后,可以预览要预测的数据,将找到两个线性和三个标量特征。点击预测按钮会生成一个图表,显示两个目标:当前和剩余周期。
屏幕截图来自www.ion-age.org
根据适当的测量数据,这就是可以准确预测任何锂离子电池的使用年限和预期寿命的算法。