欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

DGL | 基于深度学习框架DGL的分子图初探

程序员文章站 2022-05-19 20:57:30
...

DGL简介

纽约大学、纽约大学上海分校、AWS上海研究院以及AWS MXNet Science Team共同开源了一个面向图神经网络及图机器学习的全新框架,命名为Deep Graph Library(DGL)。

在设计上,DGL秉承三项原则:

  • DGL必须和目前的主流的深度学习框架(Pytorch, MXNet, Tensorflow等)无缝衔接。从而实现从传统的tensor运算到图运算的*转换。

  • DGL应该提供最少的API以降低用户的学习门槛。

  • 在保证以上两点的基础之上,DGL能高效并透明地并行图上的计算,以及能很方便地扩展到巨图上。

DGL与化学

个人关注的是药物模型,用于分子性质预测,生成和优化的各种模型,DGL 致力于将GNN(图形神经网络)应用于化学领域,并且作为分子生成模型,DGMG(图形的深度生成模型)和JT-VAE(连接树变分自动编码器),并且发行说明中有一个使用DGMG的非常简单的示例。

性质预测

为了评估候选药物分子,我们需要了解其性质和活性。实际上,这主要是通过湿实验室实验来实现的。我们可以将该问题转换为回归或分类问题。实际上,由于标记数据的缺乏,这可能非常困难。

特征化与表征学习

指纹已经成为化学信息学中广泛使用的概念。化学家开发了一种规则,将分子转换为二进制字符串,其中每个位都表明存在或不存在特定的子结构。指纹的发展使分子的比较容易得多。以前的机器学习方法主要基于分子指纹来开发。

图神经网络使数据驱动的原子、键和分子图拓扑结构之外的分子表示成为可能,这可以看作是学习指纹。

模型

图的深度生成模型(DGMG,Deep Generative Models of Graphs):通过逐步添加原子和键来进行图分布学习的非常通用的框架。

分子图生成(JTNN,Junction Tree Variational Autoencoder for Molecular Graph Generation)的连接树变分自动编码器 :JTNN能够逐步扩展分子,同时保持每一步的化学价。它们可用于分子生成和优化。

DGL | 基于深度学习框架DGL的分子图初探

基于深度学习框架DGL的分子图初探

导入库

import os
import numpy as np
import pandas as pd
from rdkit import Chem
from rdkit.Chem import RDConfig
import torch
import torch.nn as nn
import torch.optim as optim
import torch.nn.functional as F
from torch.utils.data import DataLoader
from torch.utils.data import Dataset
import dgl
import dgl.function as fn
from dgl import DGLGraph

定义元素列表

ELEM_LIST = ['C', 'N', 'O', 'S', 'F', 'Si', 'P', 'Cl', 'Br', 'Mg', 'Na', 'Ca', 'Fe', 'Al', 'I', 'B', 'K', 'Se',
             'Zn', 'H', 'Cu', 'Mn', 'unknown']
ATOM_FDIM = len(ELEM_LIST) + 6 + 5 + 4 + 1  # 23 + degree, charge, is_aromatic = 39

代码来自dgl的 junction tree,生成分子结构图

def get_mol(smiles):
    mol = Chem.MolFromSmiles(smiles)
    if mol is None: 
        return None
    Chem.Kekulize(mol)
    return mol
def onek_encoding_unk(x, allowable_set):
    if x not in allowable_set:
        x = allowable_set[-1]
    return [x == s for s in allowable_set]
def atom_features(atom):
    return (torch.Tensor(onek_encoding_unk(atom.GetSymbol(), ELEM_LIST) 
            + onek_encoding_unk(atom.GetDegree(), [0,1,2,3,4,5]) 
            + onek_encoding_unk(atom.GetFormalCharge(), [-1,-2,1,2,0])
            + onek_encoding_unk(int(atom.GetChiralTag()), [0,1,2,3])
            + [atom.GetIsAromatic()]))
def mol2dgl_single(mols):
    """
    inputs
      mols: a list of molecules
    outputs
      cand_graphs: a list of dgl graphs
    """
    cand_graphs = []
    for mol in mols:
        n_atoms = mol.GetNumAtoms()
        g = DGLGraph()        
        node_feats = []
        for i, atom in enumerate(mol.GetAtoms()):
            assert i == atom.GetIdx()
            node_feats.append(atom_features(atom))
        g.add_nodes(n_atoms)
        bond_src = []
        bond_dst = []
        for i, bond in enumerate(mol.GetBonds()):
            a1 = bond.GetBeginAtom()
            a2 = bond.GetEndAtom()
            begin_idx = a1.GetIdx()
            end_idx = a2.GetIdx()
            bond_src.append(begin_idx)
            bond_dst.append(end_idx)
            bond_src.append(end_idx)
            bond_dst.append(begin_idx)
        g.add_edges(bond_src, bond_dst)
        g.ndata['h'] = torch.Tensor([a.tolist() for a in node_feats])
        cand_graphs.append(g)
    return cand_graphs

载入数据,转换smiles到分子图

smiles = ['OCCS(=O)(=O)c1no[n+]([O-])c1c2ccccc2', 'Cl.CCCC1(C)CC(=O)N(CCCCN2CCN(CC2)c3nsc4ccccc34)C(=O)C1']
mols = []
for sm in smiles:
    mol = get_mol(sm)
    mols.append(mol)
graphs = mol2dgl_single(mols)

查看第一个分子的邻接矩阵

graphs[0].adjacency_matrix().to_dense()

DGL | 基于深度学习框架DGL的分子图初探

输出领接矩阵的每个节点

for a in graphs[1].adjacency_matrix().to_dense():
    print(a)

DGL | 基于深度学习框架DGL的分子图初探

DGL 现已开源

  • 主页地址:http://dgl.ai

  • 项目地址:https://github.com/dmlc/dgl

  • 初学者教程:https://docs.dgl.ai/tutorials/basics/index.html

  • 所有示例模型的详细从零教程:https://docs.dgl.ai/tutorials/models/index.html

DrugAI

( 扫描下方二维码订阅获取最新消息!)

DGL | 基于深度学习框架DGL的分子图初探

本文为DrugAI原创,如需转载,请在公众号后台留言。