DGL | 基于深度学习框架DGL的分子图初探
原标题:DGL | 基于深度学习框架DGL的分子图初探
原文来自:CSDN 原文链接:https://blog.csdn.net/u012325865/article/details/103136168
纽约大学、纽约大学上海分校、AWS上海研究院以及AWS MXNet Science Team共同开源了一个面向图神经网络及图机器学习的全新框架,命名为Deep Graph Library(DGL)。
在设计上,DGL秉承三项原则:
DGL必须和目前的主流的深度学习框架(Pytorch, MXNet, Tensorflow等)无缝衔接。从而实现从传统的tensor运算到图运算的自由转换。
DGL应该提供最少的API以降低用户的学习门槛。
在保证以上两点的基础之上,DGL能高效并透明地并行图上的计算,以及能很方便地扩展到巨图上。
个人关注的是药物模型,用于分子性质预测,生成和优化的各种模型,DGL 致力于将GNN(图形神经网络)应用于化学领域,并且作为分子生成模型,DGMG(图形的深度生成模型)和JT-VAE(连接树变分自动编码器),并且发行说明中有一个使用DGMG的非常简单的示例。
为了评估候选药物分子,我们需要了解其性质和活性。实际上,这主要是通过湿实验室实验来实现的。我们可以将该问题转换为回归或分类问题。实际上,由于标记数据的缺乏,这可能非常困难。
指纹已经成为化学信息学中广泛使用的概念。化学家开发了一种规则,将分子转换为二进制字符串,其中每个位都表明存在或不存在特定的子结构。指纹的发展使分子的比较容易得多。以前的机器学习方法主要基于分子指纹来开发。
图神经网络使数据驱动的原子、键和分子图拓扑结构之外的分子表示成为可能,这可以看作是学习指纹。
图的深度生成模型(DGMG,Deep Generative Models of Graphs):通过逐步添加原子和键来进行图分布学习的非常通用的框架。
分子图生成(JTNN,Junction Tree Variational Autoencoder for Molecular Graph Generation)的连接树变分自动编码器 :JTNN能够逐步扩展分子,同时保持每一步的化学价。它们可用于分子生成和优化。
导入库
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()
输出领接矩阵的每个节点
for a in graphs[1].adjacency_matrix().to_dense():print(a)
主页地址: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
热门资源
Python 爬虫(二)...
所谓爬虫就是模拟客户端发送网络请求,获取网络响...
TensorFlow从1到2...
原文第四篇中,我们介绍了官方的入门案例MNIST,功...
TensorFlow从1到2...
“回归”这个词,既是Regression算法的名称,也代表...
机器学习中的熵、...
熵 (entropy) 这一词最初来源于热力学。1948年,克...
TensorFlow2.0(10...
前面的博客中我们说过,在加载数据和预处理数据时...
智能在线
400-630-6780
聆听.建议反馈
E-mail: support@tusaishared.com