himasai9712/smiles2odor-pom-gnn
110
smiles2odor — POM GNN baseline (Release 1)
Predict olfactory descriptors from SMILES strings. A GINE-based graph neural network trained on the Leffingwell PMP dataset, reproducing the Principal Odor Map (POM) approach.
Model details
- Architecture: 4×
GINEConvlayers (256 hidden) → sum pool → 2-layer MLP head - Inputs: SMILES string → RDKit molecular graph
- Outputs: Multi-label probabilities over the Leffingwell descriptor vocabulary
- Training data: Leffingwell PMP via Pyrfume
- Loss: Binary cross-entropy per descriptor
- Splits: Bemis–Murcko scaffold split (80 / 10 / 10)
Intended uses
- Researchers studying structure–odor relationships
- Cheminformatics pipelines that need a quick olfactory prior over a candidate set
- Educational material illustrating graph neural networks on real-world chemistry
Limitations
- Coverage is limited to the descriptor vocabulary present in Leffingwell PMP.
- Trained on roughly 3.5k molecules; novel chemistry may lie far out-of-distribution.
- Multi-label probabilities are not calibrated — use them as relative rankings rather than absolute likelihoods.
- Descriptors reflect English perfumery vocabulary and inherit the cultural assumptions baked into the source data.
Evaluation
Metrics on the held-out scaffold-split test set:
How to use
from smiles2odor.inference import OdorPredictor
predictor = OdorPredictor("pytorch_model.pt", device="cpu")
[result] = predictor.predict(["O=Cc1ccc(O)c(OC)c1"]) # vanillin
print(result.top_k)Training reproduction
git clone https://github.com/TODO/smiles2odor
cd smiles2odor
uv sync
uv run python releases/01_pom_gnn/train.py --config releases/01_pom_gnn/config.yamlCitation
If you use this model, please cite the project repository (formal citation TBD with the first stable release).
License
Apache-2.0
