DGL | 基于深度学习框架DGL的分子图初探
程序员文章站
2022-05-19 20:57:12
...
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的分子图初探
环境准备
导入库
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)
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
推荐阅读
-
一图看懂小米NFC发展史:1399元就能拥有
-
php多用户读写文件冲突的解决办法
-
php foreach循环中使用引用的问题
-
天下代码一大抄,整个案例的搬是什么鬼!疑似冒充蚂蚁金服高级Java开发工程师?你大爷
-
Java连载68-数组的拷贝、二维数组
-
关于Vue生命周期的实例讲解
-
基于C#WPF框架——动画
-
web在html中引用JavaScript代码的实现(小程序在xwml中实现)
-
vue-router的简单使用
-
Appium新版本遇到的问题,不能通过 name 去定位元素抛 Message: Locator Strategy 'name' is not supported for this session