Skip to content

Commit 5071abd

Browse files
committed
merge code of upstream
1 parent 1d7f223 commit 5071abd

File tree

7 files changed

+608
-0
lines changed

7 files changed

+608
-0
lines changed
Lines changed: 173 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,173 @@
1+
# psc_NN(Machine Learning for Perovskite Solar Cells: An Open-Source Pipeline)
2+
3+
!!! note "注意事项"
4+
5+
1. 开始训练前,请确保数据集已正确放置在 `data/cleaned/` 目录下。
6+
2. 训练和评估需要安装额外的依赖包,请使用 `pip install -r requirements.txt` 安装。
7+
3. 为获得最佳性能,建议使用 GPU 进行训练。
8+
9+
=== "模型训练命令"
10+
11+
``` sh
12+
python psc_nn.py mode=train
13+
```
14+
15+
=== "模型评估命令"
16+
17+
``` sh
18+
# 使用本地预训练模型
19+
python psc_nn.py mode=eval eval.pretrained_model_path="Your pdparams path"
20+
```
21+
22+
``` sh
23+
# 或使用远程预训练模型
24+
python psc_nn.py mode=eval eval.pretrained_model_path="https://paddle-org.bj.bcebos.com/paddlescience/models/PerovskiteSolarCells/solar_cell_pretrained.pdparams"
25+
```
26+
27+
| 预训练模型 | 指标 |
28+
|:--| :--|
29+
| [solar_cell_pretrained.pdparams](https://paddle-org.bj.bcebos.com/paddlescience/models/PerovskiteSolarCells/solar_cell_pretrained.pdparams) | RMSE: 3.91798 |
30+
31+
## 1. 背景简介
32+
33+
太阳能电池是一种通过光电效应将光能直接转换为电能的关键能源器件,其性能预测是优化和设计太阳能电池的重要环节。然而,传统的性能预测方法往往依赖于复杂的物理模拟和大量的实验测试,不仅成本高昂,且耗时较长,制约了研究与开发的效率。
34+
35+
近年来,深度学习和机器学习技术的快速发展,为太阳能电池性能预测提供了创新的方法。通过机器学习技术,可以显著加快开发速度,同时实现与实验结果相当的预测精度。特别是在钙钛矿太阳能电池研究中,材料的化学组成和结构多样性为模型训练带来了新的挑战。为了解决这一问题,研究者们通常将材料的特性转换为固定长度的特征向量,以适配机器学习模型。尽管如此,不同性能指标的特征表示设计仍需不断优化,同时对模型预测结果的可解释性要求也更为严格。
36+
37+
本研究中,通过利用包含钙钛矿太阳能电池特性信息的全面数据库(PDP),我们构建并评估了包括 XGBoost、psc_nn 在内的多种机器学习模型,专注于预测短路电流密度(Jsc)。研究结果表明,结合深度学习与超参数优化工具(如 Optuna)能够显著提升太阳能电池设计的效率,为新型太阳能电池研发提供了更精确且高效的解决方案。
38+
39+
## 2. 模型原理
40+
41+
本章节仅对太阳能电池性能预测模型的原理进行简单地介绍,详细的理论推导请阅读 [Machine Learning for Perovskite Solar Cells: An Open-Source Pipeline](https://onlinelibrary.wiley.com/doi/10.1002/apxr.202400060)
42+
43+
该方法的主要思想是通过人工神经网络建立光谱响应数据与短路电流密度(Jsc)之间的非线性映射关系。人工神经网络模型的总体结构如下图所示:
44+
45+
![psc_nn_overview](images/ML/psc_nn_overview.png)
46+
47+
本案例采用多层感知机(MLP)作为基础模型架构,主要包括以下几个部分:
48+
49+
1. 输入层:接收 2808 维的光谱响应数据
50+
2. 隐藏层:4-6 层全连接层,每层的神经元数量通过 Optuna 优化
51+
3. 激活函数:使用 ReLU 激活函数引入非线性特性
52+
4. 输出层:输出预测的 Jsc 值
53+
54+
通过这种方式,我们可以自动找到最适合当前任务的模型配置,提高模型的预测性能。
55+
56+
## 3. 模型实现
57+
58+
本章节我们讲解如何基于 PaddleScience 代码实现钙钛矿太阳能电池性能预测模型。本案例结合 Optuna 框架进行超参数优化,并使用 PaddleScience 内置的各种功能模块。为了快速理解 PaddleScience,接下来仅对模型构建、约束构建、评估器构建等关键步骤进行阐述,而其余细节请参考 [API文档](../api/arch.md)
59+
60+
### 3.1 数据集介绍
61+
62+
本案例使用的数据集包含 Perovskite Database Project(PDP) 数据。数据集分为以下几个部分:
63+
64+
1. 训练集:
65+
- 特征数据:`data/cleaned/training.csv`
66+
- 标签数据:`data/cleaned/training_labels.csv`
67+
2. 验证集:
68+
- 特征数据:`data/cleaned/validation.csv`
69+
- 标签数据:`data/cleaned/validation_labels.csv`
70+
71+
为了方便数据处理,我们实现了一个辅助函数 `create_tensor_dict` 来创建输入和标签的 tensor 字典:
72+
73+
``` py linenums="36" title="examples/perovskite_solar_cells/psc_nn.py"
74+
--8<--
75+
examples/perovskite_solar_cells/psc_nn.py:36:42
76+
--8<--
77+
```
78+
79+
数据集的读取和预处理代码如下:
80+
81+
``` py linenums="123" title="examples/perovskite_solar_cells/psc_nn.py"
82+
--8<--
83+
examples/perovskite_solar_cells/psc_nn.py:123:143
84+
--8<--
85+
```
86+
87+
为了进行超参数优化,我们将训练集进一步划分为训练集和验证集:
88+
89+
``` py linenums="135" title="examples/perovskite_solar_cells/psc_nn.py"
90+
--8<--
91+
examples/perovskite_solar_cells/psc_nn.py:135:140
92+
--8<--
93+
```
94+
95+
### 3.2 模型构建
96+
97+
本案例使用 PaddleScience 内置的 `ppsci.arch.MLP` 构建多层感知机模型。模型的超参数通过 Optuna 框架进行优化,主要包括:
98+
99+
1. 网络层数:4-6层
100+
2. 每层神经元数量:10-input_dim/2
101+
3. 激活函数:ReLU
102+
4. 输入维度:2808(光谱响应数据维度)
103+
5. 输出维度:1(Jsc 预测值)
104+
105+
模型定义代码如下:
106+
107+
``` py linenums="104" title="examples/perovskite_solar_cells/psc_nn.py"
108+
--8<--
109+
examples/perovskite_solar_cells/psc_nn.py:104:121
110+
--8<--
111+
```
112+
113+
### 3.3 损失函数设计
114+
115+
考虑到数据集中不同样本的重要性可能不同,我们设计了一个加权均方误差损失函数。该函数对较大的 Jsc 值赋予更高的权重,以提高模型在高性能太阳能电池上的预测准确性:
116+
117+
``` py linenums="24" title="examples/perovskite_solar_cells/psc_nn.py"
118+
--8<--
119+
examples/perovskite_solar_cells/psc_nn.py:24:34
120+
--8<--
121+
```
122+
123+
### 3.4 约束构建
124+
125+
本案例基于数据驱动的方法求解问题,因此使用 PaddleScience 内置的 `SupervisedConstraint` 构建监督约束。为了减少代码重复,我们实现了 `create_constraint` 函数来创建监督约束:
126+
127+
``` py linenums="44" title="examples/perovskite_solar_cells/psc_nn.py"
128+
--8<--
129+
examples/perovskite_solar_cells/psc_nn.py:44:64
130+
--8<--
131+
```
132+
133+
### 3.5 评估器构建
134+
135+
为了实时监测模型的训练情况,我们实现了 `create_validator` 函数来创建评估器:
136+
137+
``` py linenums="66" title="examples/perovskite_solar_cells/psc_nn.py"
138+
--8<--
139+
examples/perovskite_solar_cells/psc_nn.py:66:82
140+
--8<--
141+
```
142+
143+
### 3.6 优化器构建
144+
145+
为了统一管理优化器和学习率调度器的创建,我们实现了 `create_optimizer` 函数:
146+
147+
``` py linenums="84" title="examples/perovskite_solar_cells/psc_nn.py"
148+
--8<--
149+
examples/perovskite_solar_cells/psc_nn.py:84:102
150+
--8<--
151+
```
152+
153+
### 3.7 模型训练与评估
154+
155+
在训练过程中,我们使用上述封装的函数来创建数据字典、约束、评估器和优化器:
156+
157+
``` py linenums="202" title="examples/perovskite_solar_cells/psc_nn.py"
158+
--8<--
159+
examples/perovskite_solar_cells/psc_nn.py:202:215
160+
--8<--
161+
```
162+
163+
## 4. 完整代码
164+
165+
``` py linenums="1" title="examples/perovskite_solar_cells/psc_nn.py"
166+
--8<--
167+
examples/perovskite_solar_cells/psc_nn.py
168+
--8<--
169+
```
170+
171+
## 5. 参考文献
172+
173+
- [Machine Learning for Perovskite Solar Cells: An Open-Source Pipeline](https://onlinelibrary.wiley.com/doi/10.1002/apxr.202400060)
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
defaults:
2+
- ppsci_default
3+
- TRAIN: train_default
4+
- TRAIN/ema: ema_default
5+
- TRAIN/swa: swa_default
6+
- EVAL: eval_default
7+
- INFER: infer_default
8+
- hydra/job/config/override_dirname/exclude_keys: exclude_keys_default
9+
- _self_
10+
11+
hydra:
12+
run:
13+
dir: outputs_allen_cahn_piratenet/${now:%Y-%m-%d}/${now:%H-%M-%S}/${hydra.job.override_dirname}
14+
job:
15+
name: ${mode}
16+
chdir: false
17+
callbacks:
18+
init_callback:
19+
_target_: ppsci.utils.callbacks.InitCallback
20+
sweep:
21+
dir: ${hydra.run.dir}
22+
subdir: ./
23+
24+
mode: "train"
25+
seed: 42
26+
output_dir: ${hydra:run.dir}
27+
28+
data:
29+
train_features_path: "./data/cleaned/training.csv"
30+
train_labels_path: "./data/cleaned/training_labels.csv"
31+
val_features_path: "./data/cleaned/validation.csv"
32+
val_labels_path: "./data/cleaned/validation_labels.csv"
33+
34+
model:
35+
num_layers: 4
36+
hidden_size: [128, 96, 64, 32]
37+
activation: "relu"
38+
input_dim: 2808
39+
output_dim: 1
40+
41+
TRAIN:
42+
epochs: 10
43+
search_epochs: 3
44+
batch_size: 64
45+
learning_rate: 0.001
46+
eval_during_train: true
47+
eval_freq: 5
48+
save_freq: 10
49+
log_freq: 50
50+
lr_scheduler:
51+
gamma: 0.95
52+
decay_steps: 5
53+
warmup_epoch: 2
54+
warmup_start_lr: 1.0e-6
55+
56+
eval:
57+
batch_size: 64
58+
eval_with_no_grad: true
59+
pretrained_model_path: null
60+
log_freq: 50

0 commit comments

Comments
 (0)