资源经验分享DGL | 基于深度学习框架DGL的分子图初探

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

2019-11-21 | |  84 |   0

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

原文来自:CSDN      原文链接:https://blog.csdn.net/u012325865/article/details/103136168


DGL简介

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

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

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

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

  3. 在保证以上两点的基础之上,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的分子图初探

环境准备

  • PyTorch:深度学习框架

  • DGL:基于PyTorch的库,支持深度学习以处理图形

  • RDKit:用于构建分子图并从字符串表示形式绘制结构式

导入库

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()

20191118180009718.png

 输出领接矩阵的每个节点

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

newsimg1108_05.png


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





免责声明:本文来自互联网新闻客户端自媒体,不代表本网的观点和立场。

合作及投稿邮箱:E-mail:editor@tusaishared.com

上一篇:stm32开发:一种四自由度机械臂的简单算法

下一篇:基于Paddle框架的预测鲍鱼年龄的调优方式

用户评价
全部评价

热门资源

  • Python 爬虫(二)...

    所谓爬虫就是模拟客户端发送网络请求,获取网络响...

  • TensorFlow从1到2...

    原文第四篇中,我们介绍了官方的入门案例MNIST,功...

  • TensorFlow从1到2...

    “回归”这个词,既是Regression算法的名称,也代表...

  • 机器学习中的熵、...

    熵 (entropy) 这一词最初来源于热力学。1948年,克...

  • TensorFlow2.0(10...

    前面的博客中我们说过,在加载数据和预处理数据时...