作业1:理解赛题
🤔:本题任务是什么?这个任务是典型的什么问题?输入与输出是什么?
聚焦于 3D分子构象条件生成, 旨在通过生成式AI技术解决材料科学领域的核心挑战。
相关领域难点
-
实验方法面临 高昂成本 与 复杂操作流程, 尤其在新材料、催化剂设计中分子结构数据严重匮乏。
-
理论计算依赖 海量算力资源 (如量子力学计算),生成效率低,难以快速满足科研需求。
竞赛分为初赛(生成合理分子结构)和复赛(根据能量值定制分子),要求选手以人工智能方法生成符合 价键理论 且具有潜在应用价值的新分子。
赛题解读
初赛任务:生成合理的的 3D 分子结构 。选手通过训练集训练 AI 生成式模型,再用该模型生成 1 万个分子的 3D 结构(由原子元素种类和原子坐标表示,无顺序约束),后台会评测生成分子的合理性以及是否新颖。
输入数据: 分子构象数据,文件格式为 .pkl ,是用来训练模型的分子样本
由一个包含若干训练样本的 list 构成,每个样本包含一个 dict,字段说明如下:
| 字段 |
中文名 |
数据类型 |
说明 |
|
|
原子数量 |
int |
表示当前样本总共的原子数量 |
|
|
原子元素种类 |
List[str] |
描述当前样本的组成原子种类,第 i 个元素表示第 i 个原子的元素种类 |
|
|
原子坐标 |
List[List[float]] |
描述当前样本每个原子的 3D 位置,顺序与 |
| 样本数量 |
元素种类 |
单分子最大构象数量 |
| 4-5 万 |
C,H,O,N,F,P,S,Cl,Br |
1 |
输出数据 :分子构象数据,文件格式为 .pkl ,生成的10000个分子结构
应通过基于输入数据训练出来的模型生成。 生成时,分子大小的分布,各元素出现频率的分布须与给定数据集一致;生成最大的分子的原子数不允许超过60,否则会影响最终提交结果及分数。 。文件中,所有分子数据存在一个列表中,每个分子表示为一个dict类,具有三个key:'natoms', 'elements', 'coordinates'。他们的value需要服从以下数据格式要求:
-
'natoms': int. # example: 46 -
'elements': list[str] # example:['C', 'H', 'O'] -
'coordinates': list[list[float, float, float], list[float, float, float], ...] # example:[[1.2, 0.5, -0.2], [0.54, -0.41, 1.45]]
文件中生成的分子数目需严格等于10000。其它数目的提交文件被判作废。
评价指标
首先根据真实的键长键角,判断生成分子中存在的化学键,根据化学键将 3D 分子映射为 2D 的图结构。
-
有效性 :根据价键理论判断原子和分子稳定性;利用 RDKiT 库函数及一些自定义规则判断分子是否合理,统计合理分子占总生成分子数的比例。
-
唯一性 :筛选具有有效性的去除所有重复分子,计算剩下不重复分子占总生成分子数的比例。
-
创新性 :在去重的分子中,统计训练集中未出现的分子占总生成分子数的比例。
-
数据集分布相似性(反作弊评分) :赛事方后台会计算选手提交文件和训练集分布的差异,严重脱离训练集分布的结果会被标记为异常结果,并会影响分数,赛事方会进行相应核查。
最终分数由 1,2,3 分数加权组合得到,对于满足原则的生成结果, 数据集分布相似性不会影响分数 。
🤔:我们需要用到的数据有哪些?长什么样子
import pickle
import sys
import pprint
def print_pkl_content(file_path):
"""打印pkl文件的内容"""
try:
with open(file_path, 'rb') as f:
data = pickle.load(f)
print(f"数据类型: {type(data)}")
if isinstance(data, dict):
print("\n字典键:")
for key in data.keys():
print(f" - {key} (类型: {type(data[key])})")
print("\n详细内容:")
pp = pprint.PrettyPrinter(indent=2)
pp.pprint(data)
elif isinstance(data, list):
print(f"\n列表长度: {len(data)}")
if len(data) > 0:
print(f"第一个元素类型: {type(data[0])}")
print("\n前几个元素:")
pp = pprint.PrettyPrinter(indent=2)
pp.pprint(data)
else:
print("\n内容:")
pp = pprint.PrettyPrinter(indent=2)
pp.pprint(data)
except Exception as e:
print(f"打开文件时出错: {e}")
if __name__ == "__main__":
file_path = "/root/competition/data_all.pkl"
print_pkl_content(file_path)
一开始我们可能会觉得 赛事提供的 data_all.pkl 和提供的 baseline 的中包含的数据不一致,
但事实上是一致的 但是赛事方帮我们把原本的数据进行拆解为三个子集,并且按照训练的输入输出进行了转化,可以从下面的代码去观察整个 baseline 训练数据的分布和数据的输入格式,注意修改 directory_path
import pickle
import numpy as np
import os
import pprint
from pathlib import Path
def print_pickle_content(file_path):
"""打印pickle文件的内

最低0.47元/天 解锁文章
760

被折叠的 条评论
为什么被折叠?



