Skip to content

【Hackathon 10th Spring No.7】wD-MPNN模型复现#275

Merged
leeleolay merged 19 commits into
PaddlePaddle:wD-MPNNfrom
megemini:wD-MPNN
Jun 3, 2026
Merged

【Hackathon 10th Spring No.7】wD-MPNN模型复现#275
leeleolay merged 19 commits into
PaddlePaddle:wD-MPNNfrom
megemini:wD-MPNN

Conversation

@megemini

Copy link
Copy Markdown

@paddle-bot

paddle-bot Bot commented Apr 20, 2026

Copy link
Copy Markdown

Thanks for your contribution!

@paddle-bot paddle-bot Bot added the contributor External developers label Apr 20, 2026
@megemini megemini changed the title 【Hackathon 10th Spring No.7】wD-MPNN模型复现模型复现 【Hackathon 10th Spring No.7】wD-MPNN模型复现 Apr 20, 2026

@leeleolay leeleolay left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

添加readme说明,参考issue里的合入说明

Comment thread ppmat/models/polymer_chemprop/rdkit.py Outdated

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这个文件的作用是什么,rdkit的相关功能套件已有实现,是否可以复用

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这个文件是原项目 polymer-chemprop/chemprop/rdkit.py 的映射,以及一些其他工具方法,我再看一下是否可以使用现有套件中的工具代替 ~

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

mpn和model的差别是什么

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

原始项目中 polymer-chemprop/chemprop/models/model.py polymer-chemprop/chemprop/models/mpn.py 就是两个文件,mpn.py 中放的是 encoder,model 里面放的是模型。

我看到您在 #252 里面的留言,意思是说,把这两个文件合并到一个 model.py 文件中?

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

是的,可以合并到一起,尽量保持单模型文件的设计风格

@megemini

megemini commented May 3, 2026

Copy link
Copy Markdown
Author

Update 20260503

  1. 增加了 README
  2. 将 rdkit 相关函数放到了 ppmat/utils/ext_rdkit.py 中
  3. 测试了 PaddleMaterials 与 polymer-chemprop 的精度,结论:模型层面参考 【Hackathon 10th Spring No.7】wD-MPNN模型复现 RFC community#1349 中的 test_alignment ,误差基本在 1e-07 以内。通过 cli 测试两者训练的 loss,有波动,趋势一致。
  4. 这里测试了 wD-MPNN 使用 polymer-chemprop repo 中的数据集 bace.csv(分类任务)和 delaney.csv (回归任务)
  5. 增加了一个 AucMetric ,包装 paddle.metric.Auc 以供 PaddleMaterials 使用
  6. delaney.csv 的 Loss 需要标准化转换后才能与 polymer-chemprop 中的 Loss 进行横向比对,日志中已经写明了转换的公式。注意:这里没有在 PaddleMaterials 中添加转换的方法,尝试过,需要修改很多地方,感觉有点把项目的结构改变太多了,所以就没有具体实现,而是在日志中写明转换公式,以及转换后的结果。

训练数据以及日志:

通过网盘分享的文件:wd_mpnn_log_and_data.zip
链接: https://pan.baidu.com/s/1Uv6eAY-JnuP3xtQ6TRFecg 提取码: fh8v 复制这段内容后打开百度网盘手机App,操作更方便哦

这里贴一下 cli 训练的结果比对:

bace.csv 的训练日志,第一部分是 polymer-chemprop 训练的日志,第二部分是将其中 train 的 loss 和 auc 单独摘出来方便观察,第三部分是 PaddleMaterials 的日志抽取出来的结果。注意,不需要看 eval 的数据,为了方便测试,这里 train_data=eval_data 。

Command line
python train.py --data_path data/bace.csv --dataset_type classification --save_dir chemprop_results/bace_align --seed 42 --epochs 30 --batch_size 50 --hidden_size 300 --depth 3 --dropout 0.0 --ffn_hidden_size 300 --ffn_num_layers 2 --activation ReLU --aggregation mean --aggregation_norm 100 --number_of_molecules 1 --split_type random --split_sizes 0.8 0.1 0.1 --metric auc --num_folds 1 --init_lr 0.001 --max_lr 0.001 --final_lr 0.0001 --warmup_epochs 0.0
Args
{'activation': 'ReLU',
 'adding_h': False,
 'aggregation': 'mean',
 'aggregation_norm': 100,
 'alternative_loss_function': None,
 'atom_descriptor_scaling': True,
 'atom_descriptors': None,
 'atom_descriptors_path': None,
 'atom_descriptors_size': 0,
 'atom_features_size': 0,
 'atom_messages': False,
 'batch_size': 50,
 'bias': False,
 'bond_feature_scaling': True,
 'bond_features_path': None,
 'bond_features_size': 0,
 'cache_cutoff': 10000,
 'checkpoint_dir': None,
 'checkpoint_frzn': None,
 'checkpoint_path': None,
 'checkpoint_paths': None,
 'class_balance': False,
 'config_path': None,
 'crossval_index_dir': None,
 'crossval_index_file': None,
 'crossval_index_sets': None,
 'cuda': True,
 'data_path': 'data/bace.csv',
 'data_weights_path': None,
 'dataset_type': 'classification',
 'depth': 3,
 'device': device(type='cuda'),
 'dropout': 0.0,
 'empty_cache': False,
 'ensemble_size': 1,
 'epochs': 30,
 'explicit_h': False,
 'extra_metrics': [],
 'features_generator': None,
 'features_only': False,
 'features_path': None,
 'features_scaling': True,
 'features_size': None,
 'ffn_hidden_size': 300,
 'ffn_num_layers': 2,
 'final_lr': 0.0001,
 'folds_file': None,
 'freeze_first_only': False,
 'frzn_ffn_layers': 0,
 'gpu': None,
 'grad_clip': None,
 'hidden_size': 300,
 'ignore_columns': None,
 'init_lr': 0.001,
 'log_frequency': 10,
 'max_data_size': None,
 'max_lr': 0.001,
 'metric': 'auc',
 'metrics': ['auc'],
 'minimize_score': False,
 'mpn_shared': False,
 'multiclass_num_classes': 3,
 'no_atom_descriptor_scaling': False,
 'no_bond_features_scaling': False,
 'no_cache_mol': False,
 'no_cuda': False,
 'no_features_scaling': False,
 'num_folds': 1,
 'num_lrs': 1,
 'num_tasks': 1,
 'num_workers': 8,
 'number_of_molecules': 1,
 'overwrite_default_atom_features': False,
 'overwrite_default_bond_features': False,
 'phase_features_path': None,
 'polymer': False,
 'pytorch_seed': 0,
 'quiet': False,
 'reaction': False,
 'reaction_mode': 'reac_diff',
 'resume_experiment': False,
 'save_dir': 'chemprop_results/bace_align',
 'save_preds': False,
 'save_smiles_splits': False,
 'seed': 42,
 'separate_test_atom_descriptors_path': None,
 'separate_test_bond_features_path': None,
 'separate_test_features_path': None,
 'separate_test_path': None,
 'separate_test_phase_features_path': None,
 'separate_val_atom_descriptors_path': None,
 'separate_val_bond_features_path': None,
 'separate_val_features_path': None,
 'separate_val_path': None,
 'separate_val_phase_features_path': None,
 'show_individual_scores': False,
 'smiles_columns': ['mol'],
 'spectra_activation': 'exp',
 'spectra_phase_mask_path': None,
 'spectra_target_floor': 1e-08,
 'split_sizes': (0.8, 0.1, 0.1),
 'split_type': 'random',
 'target_columns': None,
 'target_weights': None,
 'task_names': ['Class'],
 'test': False,
 'test_fold_index': None,
 'train_data_size': None,
 'undirected': False,
 'use_input_features': False,
 'val_fold_index': None,
 'warmup_epochs': 0.0}
Setting molecule featurization parameters to default.
Loading data
Number of tasks = 1
Fold 0
Splitting data with seed 42
Class sizes
Class 0: 54.33%, 1: 45.67%
Total size = 1,513 | train size = 1,513 | val size = 1,513 | test size = 1,513
Building model 0
MoleculeModel(
  (sigmoid): Sigmoid()
  (encoder): MPN(
    (encoder): ModuleList(
      (0): MPNEncoder(
        (dropout_layer): Dropout(p=0.0, inplace=False)
        (act_func): ReLU()
        (W_i): Linear(in_features=147, out_features=300, bias=False)
        (W_h): Linear(in_features=300, out_features=300, bias=False)
        (W_o): Linear(in_features=433, out_features=300, bias=True)
      )
    )
  )
  (ffn): Sequential(
    (0): Dropout(p=0.0, inplace=False)
    (1): Linear(in_features=300, out_features=300, bias=True)
    (2): ReLU()
    (3): Dropout(p=0.0, inplace=False)
    (4): Linear(in_features=300, out_features=1, bias=True)
  )
)
Number of parameters = 355,201
Moving model to cuda
Epoch 0
Loss = 7.1694e-01, PNorm = 34.0426, GNorm = 0.1303, lr_0 = 9.7225e-04
Loss = 6.8330e-01, PNorm = 34.0847, GNorm = 0.1674, lr_0 = 9.4769e-04
Loss = 6.8489e-01, PNorm = 34.1237, GNorm = 0.5510, lr_0 = 9.2375e-04
Loss = 7.4200e-01, PNorm = 34.1273, GNorm = 0.8118, lr_0 = 9.2139e-04
Validation auc = 0.650712
Epoch 1
Loss = 6.7343e-01, PNorm = 34.1739, GNorm = 0.4655, lr_0 = 8.9812e-04
Loss = 6.8376e-01, PNorm = 34.2281, GNorm = 0.3018, lr_0 = 8.7543e-04
Loss = 6.6618e-01, PNorm = 34.2726, GNorm = 0.3642, lr_0 = 8.5332e-04
Loss = 6.8399e-01, PNorm = 34.2784, GNorm = 0.6739, lr_0 = 8.5114e-04
Validation auc = 0.689568
Epoch 2
Loss = 6.5823e-01, PNorm = 34.3411, GNorm = 0.3787, lr_0 = 8.2964e-04
Loss = 6.3034e-01, PNorm = 34.4166, GNorm = 0.4427, lr_0 = 8.0868e-04
Loss = 6.6289e-01, PNorm = 34.4848, GNorm = 0.7313, lr_0 = 7.8825e-04
Loss = 7.0251e-01, PNorm = 34.4918, GNorm = 0.3346, lr_0 = 7.8624e-04
Validation auc = 0.747300
Epoch 3
Loss = 6.3405e-01, PNorm = 34.5548, GNorm = 0.2443, lr_0 = 7.6638e-04
Loss = 5.9870e-01, PNorm = 34.6517, GNorm = 0.3556, lr_0 = 7.4702e-04
Loss = 6.0493e-01, PNorm = 34.7494, GNorm = 0.7034, lr_0 = 7.2815e-04
Validation auc = 0.780290
Epoch 4
Loss = 6.2752e-01, PNorm = 34.8314, GNorm = 0.6751, lr_0 = 7.0976e-04
Loss = 5.8201e-01, PNorm = 34.9259, GNorm = 1.2046, lr_0 = 6.9183e-04
Loss = 5.6704e-01, PNorm = 35.0201, GNorm = 0.4485, lr_0 = 6.7436e-04
Validation auc = 0.805999
Epoch 5
Loss = 5.5662e-01, PNorm = 35.1123, GNorm = 0.9993, lr_0 = 6.5564e-04
Loss = 5.2969e-01, PNorm = 35.1954, GNorm = 1.8820, lr_0 = 6.3908e-04
Loss = 5.7474e-01, PNorm = 35.2711, GNorm = 2.1399, lr_0 = 6.2294e-04
Validation auc = 0.834423
Epoch 6
Loss = 5.2210e-01, PNorm = 35.3612, GNorm = 1.3529, lr_0 = 6.0565e-04
Loss = 5.2158e-01, PNorm = 35.4347, GNorm = 1.3973, lr_0 = 5.9035e-04
Loss = 5.0837e-01, PNorm = 35.5068, GNorm = 0.6713, lr_0 = 5.7544e-04
Validation auc = 0.851393
Epoch 7
Loss = 4.8064e-01, PNorm = 35.5693, GNorm = 0.9447, lr_0 = 5.5947e-04
Loss = 5.1506e-01, PNorm = 35.6307, GNorm = 0.4665, lr_0 = 5.4534e-04
Loss = 4.8052e-01, PNorm = 35.6785, GNorm = 1.4112, lr_0 = 5.3156e-04
Validation auc = 0.862622
Epoch 8
Loss = 5.3134e-01, PNorm = 35.7358, GNorm = 1.6525, lr_0 = 5.1814e-04
Loss = 4.9393e-01, PNorm = 35.7953, GNorm = 0.9337, lr_0 = 5.0505e-04
Loss = 4.6706e-01, PNorm = 35.8486, GNorm = 0.5429, lr_0 = 4.9229e-04
Validation auc = 0.871178
Epoch 9
Loss = 4.7932e-01, PNorm = 35.9028, GNorm = 1.1757, lr_0 = 4.7863e-04
Loss = 4.4451e-01, PNorm = 35.9494, GNorm = 2.1687, lr_0 = 4.6654e-04
Loss = 4.5366e-01, PNorm = 35.9923, GNorm = 1.0248, lr_0 = 4.5476e-04
Validation auc = 0.883400
Epoch 10
Loss = 4.5670e-01, PNorm = 36.0436, GNorm = 0.4034, lr_0 = 4.4214e-04
Loss = 4.3505e-01, PNorm = 36.0876, GNorm = 0.7591, lr_0 = 4.3097e-04
Loss = 4.5282e-01, PNorm = 36.1271, GNorm = 0.3976, lr_0 = 4.2008e-04
Validation auc = 0.888886
Epoch 11
Loss = 4.8176e-01, PNorm = 36.1689, GNorm = 1.6496, lr_0 = 4.0842e-04
Loss = 4.3407e-01, PNorm = 36.2047, GNorm = 3.9565, lr_0 = 3.9811e-04
Loss = 4.2359e-01, PNorm = 36.2451, GNorm = 1.1259, lr_0 = 3.8805e-04
Validation auc = 0.893800
Epoch 12
Loss = 4.1602e-01, PNorm = 36.2874, GNorm = 1.1030, lr_0 = 3.7825e-04
Loss = 4.1638e-01, PNorm = 36.3234, GNorm = 1.5120, lr_0 = 3.6869e-04
Loss = 4.0943e-01, PNorm = 36.3554, GNorm = 0.7807, lr_0 = 3.5938e-04
Validation auc = 0.902021
Epoch 13
Loss = 3.6984e-01, PNorm = 36.3910, GNorm = 1.5933, lr_0 = 3.4941e-04
Loss = 4.0510e-01, PNorm = 36.4239, GNorm = 1.0861, lr_0 = 3.4058e-04
Loss = 4.5390e-01, PNorm = 36.4488, GNorm = 1.4329, lr_0 = 3.3198e-04
Validation auc = 0.907315
Epoch 14
Loss = 4.0049e-01, PNorm = 36.4816, GNorm = 1.9594, lr_0 = 3.2277e-04
Loss = 4.3046e-01, PNorm = 36.5079, GNorm = 2.3362, lr_0 = 3.1461e-04
Loss = 4.0111e-01, PNorm = 36.5336, GNorm = 1.1891, lr_0 = 3.0667e-04
Validation auc = 0.907381
Epoch 15
Loss = 4.3081e-01, PNorm = 36.5695, GNorm = 1.0514, lr_0 = 2.9816e-04
Loss = 3.4838e-01, PNorm = 36.6018, GNorm = 0.4828, lr_0 = 2.9063e-04
Loss = 4.0384e-01, PNorm = 36.6316, GNorm = 2.0358, lr_0 = 2.8328e-04
Validation auc = 0.911662
Epoch 16
Loss = 3.8833e-01, PNorm = 36.6535, GNorm = 2.0817, lr_0 = 2.7613e-04
Loss = 4.1247e-01, PNorm = 36.6771, GNorm = 2.4363, lr_0 = 2.6915e-04
Loss = 3.8854e-01, PNorm = 36.6981, GNorm = 2.6209, lr_0 = 2.6235e-04
Validation auc = 0.914349
Epoch 17
Loss = 4.1982e-01, PNorm = 36.7229, GNorm = 0.7795, lr_0 = 2.5507e-04
Loss = 4.0670e-01, PNorm = 36.7425, GNorm = 1.8736, lr_0 = 2.4863e-04
Loss = 3.4907e-01, PNorm = 36.7639, GNorm = 0.5675, lr_0 = 2.4235e-04
Validation auc = 0.916194
Epoch 18
Loss = 3.6653e-01, PNorm = 36.7901, GNorm = 0.8186, lr_0 = 2.3563e-04
Loss = 3.8466e-01, PNorm = 36.8099, GNorm = 1.2668, lr_0 = 2.2967e-04
Loss = 3.4345e-01, PNorm = 36.8301, GNorm = 0.6466, lr_0 = 2.2387e-04
Validation auc = 0.917500
Epoch 19
Loss = 4.0993e-01, PNorm = 36.8468, GNorm = 1.7805, lr_0 = 2.1766e-04
Loss = 3.7247e-01, PNorm = 36.8643, GNorm = 0.5130, lr_0 = 2.1216e-04
Loss = 3.7832e-01, PNorm = 36.8813, GNorm = 1.5559, lr_0 = 2.0680e-04
Validation auc = 0.918986
Epoch 20
Loss = 3.7422e-01, PNorm = 36.8970, GNorm = 2.8638, lr_0 = 2.0158e-04
Loss = 3.8915e-01, PNorm = 36.9142, GNorm = 2.0566, lr_0 = 1.9649e-04
Loss = 3.7111e-01, PNorm = 36.9289, GNorm = 1.1220, lr_0 = 1.9152e-04
Validation auc = 0.919821
Epoch 21
Loss = 3.1771e-01, PNorm = 36.9477, GNorm = 0.7046, lr_0 = 1.8621e-04
Loss = 3.7123e-01, PNorm = 36.9626, GNorm = 1.4507, lr_0 = 1.8151e-04
Loss = 3.5990e-01, PNorm = 36.9783, GNorm = 1.3322, lr_0 = 1.7692e-04
Validation auc = 0.921034
Epoch 22
Loss = 3.6839e-01, PNorm = 36.9920, GNorm = 0.8549, lr_0 = 1.7201e-04
Loss = 3.5575e-01, PNorm = 37.0043, GNorm = 2.3026, lr_0 = 1.6767e-04
Loss = 3.7676e-01, PNorm = 37.0156, GNorm = 0.8223, lr_0 = 1.6343e-04
Validation auc = 0.922244
Epoch 23
Loss = 3.0831e-01, PNorm = 37.0306, GNorm = 1.2056, lr_0 = 1.5890e-04
Loss = 3.5028e-01, PNorm = 37.0438, GNorm = 1.3812, lr_0 = 1.5488e-04
Loss = 3.8958e-01, PNorm = 37.0561, GNorm = 2.3379, lr_0 = 1.5097e-04
Validation auc = 0.925050
Epoch 24
Loss = 3.6612e-01, PNorm = 37.0670, GNorm = 0.7478, lr_0 = 1.4716e-04
Loss = 3.4425e-01, PNorm = 37.0802, GNorm = 0.6797, lr_0 = 1.4344e-04
Loss = 3.8009e-01, PNorm = 37.0912, GNorm = 3.7021, lr_0 = 1.3982e-04
Validation auc = 0.925618
Epoch 25
Loss = 3.7729e-01, PNorm = 37.1023, GNorm = 0.6239, lr_0 = 1.3594e-04
Loss = 3.3623e-01, PNorm = 37.1122, GNorm = 1.2788, lr_0 = 1.3250e-04
Loss = 3.2899e-01, PNorm = 37.1233, GNorm = 0.7134, lr_0 = 1.2915e-04
Validation auc = 0.927421
Epoch 26
Loss = 3.1180e-01, PNorm = 37.1340, GNorm = 1.6863, lr_0 = 1.2557e-04
Loss = 3.3524e-01, PNorm = 37.1440, GNorm = 0.7125, lr_0 = 1.2240e-04
Loss = 3.5017e-01, PNorm = 37.1543, GNorm = 1.0533, lr_0 = 1.1931e-04
Validation auc = 0.927409
Epoch 27
Loss = 3.0256e-01, PNorm = 37.1622, GNorm = 0.5008, lr_0 = 1.1629e-04
Loss = 3.2307e-01, PNorm = 37.1706, GNorm = 2.9246, lr_0 = 1.1336e-04
Loss = 3.5729e-01, PNorm = 37.1786, GNorm = 1.7441, lr_0 = 1.1049e-04
Validation auc = 0.929201
Epoch 28
Loss = 3.3342e-01, PNorm = 37.1876, GNorm = 1.1804, lr_0 = 1.0743e-04
Loss = 3.3192e-01, PNorm = 37.1956, GNorm = 0.7030, lr_0 = 1.0471e-04
Loss = 2.9781e-01, PNorm = 37.2035, GNorm = 0.6346, lr_0 = 1.0207e-04
Validation auc = 0.929373
Epoch 29
Loss = 3.6092e-01, PNorm = 37.2118, GNorm = 2.9622, lr_0 = 1.0000e-04
Loss = 3.3915e-01, PNorm = 37.2198, GNorm = 1.7355, lr_0 = 1.0000e-04
Loss = 3.2660e-01, PNorm = 37.2272, GNorm = 1.2068, lr_0 = 1.0000e-04
Validation auc = 0.930717
Model 0 best validation auc = 0.930717 on epoch 29
Loading pretrained parameter "encoder.encoder.0.cached_zero_vector".
Loading pretrained parameter "encoder.encoder.0.W_i.weight".
Loading pretrained parameter "encoder.encoder.0.W_h.weight".
Loading pretrained parameter "encoder.encoder.0.W_o.weight".
Loading pretrained parameter "encoder.encoder.0.W_o.bias".
Loading pretrained parameter "ffn.1.weight".
Loading pretrained parameter "ffn.1.bias".
Loading pretrained parameter "ffn.4.weight".
Loading pretrained parameter "ffn.4.bias".
Moving model to cuda
Model 0 test auc = 0.930717
Ensemble test auc = 0.930717
1-fold cross validation
	Seed 42 ==> test auc = 0.930717
Overall test auc = 0.930717 +/- 0.000000
Elapsed time = 0:01:13

===========================

polymer-chemprop

Epoch 0: Loss 0.7169 | AUC 0.6507

Epoch 1: Loss 0.6734 | AUC 0.6896

Epoch 2: Loss 0.6582 | AUC 0.7473

Epoch 3: Loss 0.6341 | AUC 0.7803

Epoch 4: Loss 0.6275 | AUC 0.8060

Epoch 5: Loss 0.5566 | AUC 0.8344

Epoch 6: Loss 0.5221 | AUC 0.8514

Epoch 7: Loss 0.4806 | AUC 0.8626

Epoch 8: Loss 0.5313 | AUC 0.8712

Epoch 9: Loss 0.4793 | AUC 0.8834

Epoch 10: Loss 0.4567 | AUC 0.8889

Epoch 11: Loss 0.4818 | AUC 0.8938

Epoch 12: Loss 0.4160 | AUC 0.9020

Epoch 13: Loss 0.3698 | AUC 0.9073

Epoch 14: Loss 0.4005 | AUC 0.9074

Epoch 15: Loss 0.4308 | AUC 0.9117

Epoch 16: Loss 0.3883 | AUC 0.9143

Epoch 17: Loss 0.4198 | AUC 0.9162

Epoch 18: Loss 0.3665 | AUC 0.9175

Epoch 19: Loss 0.4099 | AUC 0.9190

Epoch 20: Loss 0.3742 | AUC 0.9198

Epoch 21: Loss 0.3177 | AUC 0.9210

Epoch 22: Loss 0.3684 | AUC 0.9222

Epoch 23: Loss 0.3083 | AUC 0.9251

Epoch 24: Loss 0.3661 | AUC 0.9256

Epoch 25: Loss 0.3773 | AUC 0.9274

Epoch 26: Loss 0.3118 | AUC 0.9274

Epoch 27: Loss 0.3026 | AUC 0.9292

Epoch 28: Loss 0.3334 | AUC 0.9294

Epoch 29: Loss 0.3609 | AUC 0.9307


===========================

PaddleMaterials

Epoch 1: Loss 0.691573 | Metric 0.614753

Epoch 2: Loss 0.676835 | Metric 0.699484

Epoch 3: Loss 0.651673 | Metric 0.709877

Epoch 4: Loss 0.600097 | Metric 0.760389

Epoch 5: Loss 0.549375 | Metric 0.816792

Epoch 6: Loss 0.520174 | Metric 0.835996

Epoch 7: Loss 0.487123 | Metric 0.860478

Epoch 8: Loss 0.482608 | Metric 0.859910

Epoch 9: Loss 0.461341 | Metric 0.874068

Epoch 10: Loss 0.459691 | Metric 0.878875

Epoch 11: Loss 0.434951 | Metric 0.891523

Epoch 12: Loss 0.412344 | Metric 0.899305

Epoch 13: Loss 0.410628 | Metric 0.908161

Epoch 14: Loss 0.385960 | Metric 0.905724

Epoch 15: Loss 0.379664 | Metric 0.912991

Epoch 16: Loss 0.381073 | Metric 0.914804

Epoch 17: Loss 0.362983 | Metric 0.920382

Epoch 18: Loss 0.361875 | Metric 0.925038

Epoch 19: Loss 0.342447 | Metric 0.927902

Epoch 20: Loss 0.347816 | Metric 0.932588

Epoch 21: Loss 0.337456 | Metric 0.933186

Epoch 22: Loss 0.331630 | Metric 0.936502

Epoch 23: Loss 0.315998 | Metric 0.937356

Epoch 24: Loss 0.313683 | Metric 0.939063

Epoch 25: Loss 0.309417 | Metric 0.943902

Epoch 26: Loss 0.304712 | Metric 0.942363

Epoch 27: Loss 0.296326 | Metric 0.945365

Epoch 28: Loss 0.292477 | Metric 0.947152

Epoch 29: Loss 0.291665 | Metric 0.945152

Epoch 30: Loss 0.292339 | Metric 0.947962

delaney.csv 的训练日志,第一部分是 polymer-chemprop 训练的日志,第二部分是将其中 train 的 loss 单独摘出来方便观察,第三部分是 PaddleMaterials 的日志抽取出来的结果,其中有 Loss 转换的公式。注意,不需要看 eval 的数据,为了方便测试,这里 train_data=eval_data 。

Command line
python train.py --data_path data/delaney.csv --dataset_type regression --save_dir chemprop_results/delaney_align --seed 42 --epochs 30 --batch_size 50 --hidden_size 300 --depth 3 --dropout 0.0 --ffn_hidden_size 300 --ffn_num_layers 2 --activation ReLU --aggregation mean --aggregation_norm 100 --number_of_molecules 1 --split_type random --split_sizes 0.8 0.1 0.1 --metric rmse --num_folds 1 --init_lr 0.001 --max_lr 0.001 --final_lr 0.0001 --warmup_epochs 0.0
Args
{'activation': 'ReLU',
 'adding_h': False,
 'aggregation': 'mean',
 'aggregation_norm': 100,
 'alternative_loss_function': None,
 'atom_descriptor_scaling': True,
 'atom_descriptors': None,
 'atom_descriptors_path': None,
 'atom_descriptors_size': 0,
 'atom_features_size': 0,
 'atom_messages': False,
 'batch_size': 50,
 'bias': False,
 'bond_feature_scaling': True,
 'bond_features_path': None,
 'bond_features_size': 0,
 'cache_cutoff': 10000,
 'checkpoint_dir': None,
 'checkpoint_frzn': None,
 'checkpoint_path': None,
 'checkpoint_paths': None,
 'class_balance': False,
 'config_path': None,
 'crossval_index_dir': None,
 'crossval_index_file': None,
 'crossval_index_sets': None,
 'cuda': True,
 'data_path': 'data/delaney.csv',
 'data_weights_path': None,
 'dataset_type': 'regression',
 'depth': 3,
 'device': device(type='cuda'),
 'dropout': 0.0,
 'empty_cache': False,
 'ensemble_size': 1,
 'epochs': 30,
 'explicit_h': False,
 'extra_metrics': [],
 'features_generator': None,
 'features_only': False,
 'features_path': None,
 'features_scaling': True,
 'features_size': None,
 'ffn_hidden_size': 300,
 'ffn_num_layers': 2,
 'final_lr': 0.0001,
 'folds_file': None,
 'freeze_first_only': False,
 'frzn_ffn_layers': 0,
 'gpu': None,
 'grad_clip': None,
 'hidden_size': 300,
 'ignore_columns': None,
 'init_lr': 0.001,
 'log_frequency': 10,
 'max_data_size': None,
 'max_lr': 0.001,
 'metric': 'rmse',
 'metrics': ['rmse'],
 'minimize_score': True,
 'mpn_shared': False,
 'multiclass_num_classes': 3,
 'no_atom_descriptor_scaling': False,
 'no_bond_features_scaling': False,
 'no_cache_mol': False,
 'no_cuda': False,
 'no_features_scaling': False,
 'num_folds': 1,
 'num_lrs': 1,
 'num_tasks': 1,
 'num_workers': 8,
 'number_of_molecules': 1,
 'overwrite_default_atom_features': False,
 'overwrite_default_bond_features': False,
 'phase_features_path': None,
 'polymer': False,
 'pytorch_seed': 0,
 'quiet': False,
 'reaction': False,
 'reaction_mode': 'reac_diff',
 'resume_experiment': False,
 'save_dir': 'chemprop_results/delaney_align',
 'save_preds': False,
 'save_smiles_splits': False,
 'seed': 42,
 'separate_test_atom_descriptors_path': None,
 'separate_test_bond_features_path': None,
 'separate_test_features_path': None,
 'separate_test_path': None,
 'separate_test_phase_features_path': None,
 'separate_val_atom_descriptors_path': None,
 'separate_val_bond_features_path': None,
 'separate_val_features_path': None,
 'separate_val_path': None,
 'separate_val_phase_features_path': None,
 'show_individual_scores': False,
 'smiles_columns': ['smiles'],
 'spectra_activation': 'exp',
 'spectra_phase_mask_path': None,
 'spectra_target_floor': 1e-08,
 'split_sizes': (0.8, 0.1, 0.1),
 'split_type': 'random',
 'target_columns': None,
 'target_weights': None,
 'task_names': ['logSolubility'],
 'test': False,
 'test_fold_index': None,
 'train_data_size': None,
 'undirected': False,
 'use_input_features': False,
 'val_fold_index': None,
 'warmup_epochs': 0.0}
Setting molecule featurization parameters to default.
Loading data
Number of tasks = 1
Fold 0
Splitting data with seed 42
Total size = 1,128 | train size = 1,128 | val size = 112 | test size = 112
Fitting scaler
Building model 0
MoleculeModel(
  (encoder): MPN(
    (encoder): ModuleList(
      (0): MPNEncoder(
        (dropout_layer): Dropout(p=0.0, inplace=False)
        (act_func): ReLU()
        (W_i): Linear(in_features=147, out_features=300, bias=False)
        (W_h): Linear(in_features=300, out_features=300, bias=False)
        (W_o): Linear(in_features=433, out_features=300, bias=True)
      )
    )
  )
  (ffn): Sequential(
    (0): Dropout(p=0.0, inplace=False)
    (1): Linear(in_features=300, out_features=300, bias=True)
    (2): ReLU()
    (3): Dropout(p=0.0, inplace=False)
    (4): Linear(in_features=300, out_features=1, bias=True)
  )
)
Number of parameters = 355,201
Moving model to cuda
Epoch 0
Loss = 1.1561e+00, PNorm = 34.0498, GNorm = 4.7499, lr_0 = 9.6235e-04
Loss = 6.5826e-01, PNorm = 34.1098, GNorm = 1.2552, lr_0 = 9.2936e-04
Validation rmse = 2.762242
Epoch 1
Loss = 4.7955e-01, PNorm = 34.1679, GNorm = 0.8802, lr_0 = 8.9437e-04
Loss = 3.4828e-01, PNorm = 34.2131, GNorm = 2.0860, lr_0 = 8.6370e-04
Validation rmse = 3.373525
Epoch 2
Loss = 2.5165e-01, PNorm = 34.2547, GNorm = 4.1677, lr_0 = 8.3409e-04
Loss = 2.9792e-01, PNorm = 34.2903, GNorm = 2.0585, lr_0 = 8.0549e-04
Validation rmse = 2.903674
Epoch 3
Loss = 1.9310e-01, PNorm = 34.3259, GNorm = 1.8140, lr_0 = 7.7516e-04
Loss = 2.4612e-01, PNorm = 34.3549, GNorm = 6.0248, lr_0 = 7.4859e-04
Loss = 2.0913e-01, PNorm = 34.3841, GNorm = 1.3568, lr_0 = 7.2292e-04
Validation rmse = 3.613213
Epoch 4
Loss = 1.8988e-01, PNorm = 34.4137, GNorm = 1.0527, lr_0 = 6.9813e-04
Loss = 1.6519e-01, PNorm = 34.4398, GNorm = 1.7423, lr_0 = 6.7420e-04
Validation rmse = 2.965093
Epoch 5
Loss = 1.3852e-01, PNorm = 34.4659, GNorm = 2.1573, lr_0 = 6.4882e-04
Loss = 1.5213e-01, PNorm = 34.4896, GNorm = 1.7999, lr_0 = 6.2657e-04
Validation rmse = 3.383484
Epoch 6
Loss = 1.2646e-01, PNorm = 34.5135, GNorm = 2.2797, lr_0 = 6.0509e-04
Loss = 1.2529e-01, PNorm = 34.5317, GNorm = 1.7557, lr_0 = 5.8434e-04
Validation rmse = 2.977067
Epoch 7
Loss = 1.7619e-01, PNorm = 34.5497, GNorm = 6.7268, lr_0 = 5.6234e-04
Loss = 1.3304e-01, PNorm = 34.5667, GNorm = 3.8503, lr_0 = 5.4306e-04
Loss = 1.2266e-01, PNorm = 34.5822, GNorm = 5.8932, lr_0 = 5.2444e-04
Validation rmse = 3.323040
Epoch 8
Loss = 1.2400e-01, PNorm = 34.6017, GNorm = 1.0047, lr_0 = 5.0646e-04
Loss = 9.8837e-02, PNorm = 34.6181, GNorm = 1.6031, lr_0 = 4.8910e-04
Validation rmse = 3.121909
Epoch 9
Loss = 9.7691e-02, PNorm = 34.6332, GNorm = 2.5686, lr_0 = 4.7233e-04
Loss = 1.1624e-01, PNorm = 34.6476, GNorm = 1.8632, lr_0 = 4.5613e-04
Validation rmse = 3.228222
Epoch 10
Loss = 9.6805e-02, PNorm = 34.6629, GNorm = 1.7573, lr_0 = 4.3896e-04
Loss = 9.5769e-02, PNorm = 34.6756, GNorm = 1.5716, lr_0 = 4.2391e-04
Validation rmse = 3.393454
Epoch 11
Loss = 1.1587e-01, PNorm = 34.6888, GNorm = 1.9059, lr_0 = 4.0937e-04
Loss = 9.9506e-02, PNorm = 34.7047, GNorm = 1.6551, lr_0 = 3.9534e-04
Loss = 9.9850e-02, PNorm = 34.7146, GNorm = 2.4129, lr_0 = 3.8178e-04
Loss = 1.2223e-01, PNorm = 34.7158, GNorm = 1.4669, lr_0 = 3.8045e-04
Validation rmse = 3.283597
Epoch 12
Loss = 8.5028e-02, PNorm = 34.7283, GNorm = 1.7936, lr_0 = 3.6741e-04
Loss = 8.9352e-02, PNorm = 34.7391, GNorm = 1.8952, lr_0 = 3.5481e-04
Validation rmse = 3.440218
Epoch 13
Loss = 8.7801e-02, PNorm = 34.7496, GNorm = 1.3899, lr_0 = 3.4265e-04
Loss = 1.1197e-01, PNorm = 34.7608, GNorm = 4.5869, lr_0 = 3.3090e-04
Validation rmse = 3.529491
Epoch 14
Loss = 7.8313e-02, PNorm = 34.7741, GNorm = 2.8953, lr_0 = 3.1844e-04
Loss = 9.7317e-02, PNorm = 34.7835, GNorm = 3.6319, lr_0 = 3.0752e-04
Validation rmse = 3.299647
Epoch 15
Loss = 6.0610e-02, PNorm = 34.7933, GNorm = 2.2506, lr_0 = 2.9698e-04
Loss = 8.5523e-02, PNorm = 34.8042, GNorm = 1.8455, lr_0 = 2.8680e-04
Loss = 8.6325e-02, PNorm = 34.8120, GNorm = 1.5958, lr_0 = 2.7696e-04
Loss = 7.5401e-02, PNorm = 34.8125, GNorm = 1.9709, lr_0 = 2.7600e-04
Validation rmse = 3.029058
Epoch 16
Loss = 6.4754e-02, PNorm = 34.8194, GNorm = 0.6503, lr_0 = 2.6654e-04
Loss = 7.4069e-02, PNorm = 34.8280, GNorm = 1.0417, lr_0 = 2.5740e-04
Validation rmse = 3.339527
Epoch 17
Loss = 7.1909e-02, PNorm = 34.8364, GNorm = 3.3915, lr_0 = 2.4857e-04
Loss = 6.6445e-02, PNorm = 34.8435, GNorm = 3.5902, lr_0 = 2.4005e-04
Validation rmse = 3.154838
Epoch 18
Loss = 6.7971e-02, PNorm = 34.8521, GNorm = 1.4327, lr_0 = 2.3182e-04
Loss = 7.4975e-02, PNorm = 34.8610, GNorm = 1.3349, lr_0 = 2.2387e-04
Validation rmse = 3.059191
Epoch 19
Loss = 8.0756e-02, PNorm = 34.8681, GNorm = 2.6539, lr_0 = 2.1544e-04
Loss = 6.7806e-02, PNorm = 34.8737, GNorm = 1.9145, lr_0 = 2.0806e-04
Loss = 7.0472e-02, PNorm = 34.8809, GNorm = 1.5439, lr_0 = 2.0092e-04
Validation rmse = 3.111760
Epoch 20
Loss = 6.7529e-02, PNorm = 34.8885, GNorm = 1.4311, lr_0 = 1.9403e-04
Loss = 6.9109e-02, PNorm = 34.8947, GNorm = 1.0170, lr_0 = 1.8738e-04
Validation rmse = 3.100004
Epoch 21
Loss = 6.9956e-02, PNorm = 34.9024, GNorm = 1.9398, lr_0 = 1.8033e-04
Loss = 7.0288e-02, PNorm = 34.9084, GNorm = 2.9839, lr_0 = 1.7414e-04
Validation rmse = 3.055794
Epoch 22
Loss = 7.2179e-02, PNorm = 34.9138, GNorm = 2.1642, lr_0 = 1.6817e-04
Loss = 7.6563e-02, PNorm = 34.9201, GNorm = 1.2171, lr_0 = 1.6241e-04
Validation rmse = 3.269806
Epoch 23
Loss = 6.0932e-02, PNorm = 34.9268, GNorm = 1.7999, lr_0 = 1.5629e-04
Loss = 5.1442e-02, PNorm = 34.9316, GNorm = 1.4569, lr_0 = 1.5093e-04
Loss = 7.5330e-02, PNorm = 34.9370, GNorm = 2.1691, lr_0 = 1.4576e-04
Validation rmse = 3.254176
Epoch 24
Loss = 5.9776e-02, PNorm = 34.9424, GNorm = 0.7218, lr_0 = 1.4076e-04
Loss = 6.1077e-02, PNorm = 34.9468, GNorm = 2.6144, lr_0 = 1.3594e-04
Validation rmse = 3.274197
Epoch 25
Loss = 5.6492e-02, PNorm = 34.9512, GNorm = 1.7385, lr_0 = 1.3127e-04
Loss = 5.5123e-02, PNorm = 34.9561, GNorm = 1.4146, lr_0 = 1.2677e-04
Validation rmse = 3.118951
Epoch 26
Loss = 7.2110e-02, PNorm = 34.9612, GNorm = 1.5987, lr_0 = 1.2200e-04
Loss = 5.8077e-02, PNorm = 34.9655, GNorm = 0.6481, lr_0 = 1.1782e-04
Validation rmse = 3.208031
Epoch 27
Loss = 6.3176e-02, PNorm = 34.9698, GNorm = 1.1602, lr_0 = 1.1378e-04
Loss = 6.6452e-02, PNorm = 34.9737, GNorm = 0.9166, lr_0 = 1.0988e-04
Loss = 5.1657e-02, PNorm = 34.9768, GNorm = 1.2139, lr_0 = 1.0611e-04
Validation rmse = 3.045038
Epoch 28
Loss = 4.7688e-02, PNorm = 34.9808, GNorm = 0.9037, lr_0 = 1.0212e-04
Loss = 6.9429e-02, PNorm = 34.9846, GNorm = 0.7306, lr_0 = 1.0000e-04
Validation rmse = 3.325494
Epoch 29
Loss = 6.3740e-02, PNorm = 34.9887, GNorm = 0.7377, lr_0 = 1.0000e-04
Loss = 5.7330e-02, PNorm = 34.9919, GNorm = 2.7209, lr_0 = 1.0000e-04
Validation rmse = 3.072944
Model 0 best validation rmse = 2.762242 on epoch 0
Loading pretrained parameter "encoder.encoder.0.cached_zero_vector".
Loading pretrained parameter "encoder.encoder.0.W_i.weight".
Loading pretrained parameter "encoder.encoder.0.W_h.weight".
Loading pretrained parameter "encoder.encoder.0.W_o.weight".
Loading pretrained parameter "encoder.encoder.0.W_o.bias".
Loading pretrained parameter "ffn.1.weight".
Loading pretrained parameter "ffn.1.bias".
Loading pretrained parameter "ffn.4.weight".
Loading pretrained parameter "ffn.4.bias".
Moving model to cuda
Model 0 test rmse = 2.709178
Ensemble test rmse = 2.709178
1-fold cross validation
	Seed 42 ==> test rmse = 2.709178
Overall test rmse = 2.709178 +/- 0.000000
Elapsed time = 0:00:13

===============================

wd_mpnn

Epoch 0: Loss 1.1561 

Epoch 1: Loss 0.4796 

Epoch 2: Loss 0.2517 

Epoch 3: Loss 0.1931 

Epoch 4: Loss 0.1899 

Epoch 5: Loss 0.1385 

Epoch 6: Loss 0.1265 

Epoch 7: Loss 0.1762 

Epoch 8: Loss 0.1240 

Epoch 9: Loss 0.0977 

Epoch 10: Loss 0.0968 

Epoch 11: Loss 0.1159 

Epoch 12: Loss 0.0850 

Epoch 13: Loss 0.0878 

Epoch 14: Loss 0.0783 

Epoch 15: Loss 0.0606 

Epoch 16: Loss 0.0648 

Epoch 17: Loss 0.0719 

Epoch 18: Loss 0.0680 

Epoch 19: Loss 0.0808 

Epoch 20: Loss 0.0675 

Epoch 21: Loss 0.0700 

Epoch 22: Loss 0.0722 

Epoch 23: Loss 0.0609 

Epoch 24: Loss 0.0598 

Epoch 25: Loss 0.0565 

Epoch 26: Loss 0.0721 

Epoch 27: Loss 0.0632 

Epoch 28: Loss 0.0477 

Epoch 29: Loss 0.0637 



===============================

PaddleMaterials

(venv310)  shun@shun-B660M-Pro-RS  ~/workspace/Projects/megemini/PaddleMaterials   wD-MPNN ±  python tools/align_loss_with_chemprop.py \
    --data_path /home/shun/workspace/Projects/github/PaddleMaterial_workspace/polymer-chemprop/data/delaney.csv \
    --target_column logSolubility \
    --paddle_mses 3.751293 2.155071 1.716175 1.281470 1.026214 0.831931 0.701326 0.630429 0.683562 0.601555 0.520574 0.549679 0.471823 0.447110 0.403938 0.402560 0.394722 0.358792 0.351399 0.326162 0.319015 0.307101 0.282898 0.291803 0.282027 0.275135 0.280079 0.269600 0.267944 0.261825

================================================================================
Target Statistics for 'logSolubility':
================================================================================
  Number of samples: 1128
  Mean: -3.050102
  Std:  2.095512
================================================================================

Conversion Formulas:
  MSE_chemprop = MSE_PaddleMaterials / std^2
  MSE_chemprop = MSE_PaddleMaterials / 4.391169
  MSE_PaddleMaterials = MSE_chemprop * std^2
  MSE_PaddleMaterials = MSE_chemprop * 4.391169

  RMSE_chemprop = RMSE_PaddleMaterials / std
  RMSE_chemprop = RMSE_PaddleMaterials / 2.095512
  RMSE_PaddleMaterials = RMSE_chemprop * std
  RMSE_PaddleMaterials = RMSE_chemprop * 2.095512
================================================================================


============================================================
                  Batch Conversion Results                  
============================================================
      PaddleMaterials MSE         chemprop MSE
------------------------------------------------------------
                 3.751293             0.854281
                 2.155071             0.490774
                 1.716175             0.390824
                 1.281470             0.291829
                 1.026214             0.233699
                 0.831931             0.189455
                 0.701326             0.159713
                 0.630429             0.143567
                 0.683562             0.155667
                 0.601555             0.136992
                 0.520574             0.118550
                 0.549679             0.125178
                 0.471823             0.107448
                 0.447110             0.101820
                 0.403938             0.091989
                 0.402560             0.091675
                 0.394722             0.089890
                 0.358792             0.081708
                 0.351399             0.080024
                 0.326162             0.074277
                 0.319015             0.072649
                 0.307101             0.069936
                 0.282898             0.064424
                 0.291803             0.066452
                 0.282027             0.064226
                 0.275135             0.062656
                 0.280079             0.063782
                 0.269600             0.061396
                 0.267944             0.061019
                 0.261825             0.059625
============================================================

@leeleolay 请评审 ~ 等您那边把数据传到服务器之后,我这边修改对应的 WDMPNNDataset 。感谢 ~

@leeleolay

Copy link
Copy Markdown
Collaborator
image 一开始的误差比较大,是初始化的策略不一致吗

@leeleolay leeleolay left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@leeleolay

Copy link
Copy Markdown
Collaborator

@megemini

megemini commented May 8, 2026

Copy link
Copy Markdown
Author

Update 20260508

  • 已添加 dataset 的 url
  • 已添加 readme 的 checkpoint 和 log 的链接

@leeleolay

@leeleolay
leeleolay changed the base branch from develop to wD-MPNN June 3, 2026 11:03
@leeleolay
leeleolay merged commit 21ac90c into PaddlePaddle:wD-MPNN Jun 3, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants