DGL具有许多用于化学信息学、药物与生物信息学任务的函数。

DGL开发人员提供了用于可视化训练模型原子权重的代码。使用Attentive FP构建模型后,可以可视化给定分子的原子权重,意味着每个原子对目标值的贡献量。


基于Attentive FP可视化训练模型原子权重

环境准备

  • PyTorch:深度学习框架
  • DGL:基于PyTorch的库,支持深度学习以处理图形
  • RDKit:用于构建分子图并从字符串表示形式绘制结构式
  • MDTraj:用于分子动力学轨迹分析的开源库

导入库

%matplotlib inline
import matplotlib.pyplot as plt
import os
from rdkit import Chem
from rdkit import RDPathsimport dgl
import numpy as np
import random
import torch
import torch.nn as nn
import torch.nn.functional as F
from torch.utils.data import DataLoader
from torch.utils.data import Dataset
from dgl import model_zoofrom dgl.data.chem.utils import mol_to_complete_graph, mol_to_bigraphfrom dgl.data.chem.utils import atom_type_one_hot
from dgl.data.chem.utils import atom_degree_one_hot
from dgl.data.chem.utils import atom_formal_charge
from dgl.data.chem.utils import atom_num_radical_electrons
from dgl.data.chem.utils import atom_hybridization_one_hot
from dgl.data.chem.utils import atom_total_num_H_one_hot
from dgl.data.chem.utils import one_hot_encoding
from dgl.data.chem import CanonicalAtomFeaturizer
from dgl.data.chem import CanonicalBondFeaturizer
from dgl.data.chem import ConcatFeaturizer
from dgl.data.chem import BaseAtomFeaturizer
from dgl.data.chem import BaseBondFeaturizerfrom dgl.data.chem import one_hot_encoding
from dgl.data.utils import split_datasetfrom functools import partial
from sklearn.metrics import roc_auc_score

代码来源于dgl/example

DGL开发人员提供了用于可视化训练模型原子权重的代码。

使用Attentive FP构建模型后,可以可视化给定分子的原子权重,意味着每个原子对目标值的贡献量。

def chirality(atom):try:return one_hot_encoding(atom.GetProp('_CIPCode'), ['R', 'S']) + \[atom.HasProp('_ChiralityPossible')]except:return [False, False] + [atom.HasProp('_ChiralityPossible')]def collate_molgraphs(data):"""Batching a list of datapoints for dataloader.Parameters----------data : list of 3-tuples or 4-tuples.Each tuple is for a single datapoint, consisting ofa SMILES, a DGLGraph, all-task labels and optionallya binary mask indicating the existence of labels.Returns-------smiles : listList of smilesbg : BatchedDGLGraphBatched DGLGraphslabels : Tensor of dtype float32 and shape (B, T)Batched datapoint labels. B is len(data) andT is the number of total tasks.masks : Tensor of dtype float32 and shape (B, T)Batched datapoint binary mask, indicating theexistence of labels. If binary masks are notprovided, return a tensor with ones."""assert len(data[0]) in [3, 4], \'Expect the tuple to be of length 3 or 4, got {:d}'.format(len(data[0]))if len(data[0]) == 3:smiles, graphs, labels = map(list, zip(*data))masks = Noneelse:smiles, graphs, labels, masks = map(list, zip(*data))bg = dgl.batch(graphs)bg.set_n_initializer(dgl.init.zero_initializer)bg.set_e_initializer(dgl.init.zero_initializer)labels = torch.stack(labels, dim=0)if masks is None:masks = torch.ones(labels.shape)else:masks = torch.stack(masks, dim=0)return smiles, bg, labels, masksatom_featurizer = BaseAtomFeaturizer({'hv': ConcatFeaturizer([partial(atom_type_one_hot, allowable_set=['B', 'C', 'N', 'O', 'F', 'Si', 'P', 'S', 'Cl', 'As', 'Se', 'Br', 'Te', 'I', 'At'],encode_unknown=True),partial(atom_degree_one_hot, allowable_set=list(range(6))),atom_formal_charge, atom_num_radical_electrons,partial(atom_hybridization_one_hot, encode_unknown=True),lambda atom: [0], # A placeholder for aromatic information,atom_total_num_H_one_hot, chirality],)})
bond_featurizer = BaseBondFeaturizer({'he': lambda bond: [0 for _ in range(10)]})train_mols = Chem.SDMolSupplier('solubility.train.sdf')
train_smi =[Chem.MolToSmiles(m) for m in train_mols]
train_sol = torch.tensor([float(mol.GetProp('SOL')) for mol in train_mols]).reshape(-1,1)test_mols =  Chem.SDMolSupplier('solubility.test.sdf')
test_smi = [Chem.MolToSmiles(m) for m in test_mols]
test_sol = torch.tensor([float(mol.GetProp('SOL')) for mol in test_mols]).reshape(-1,1)train_graph =[mol_to_bigraph(mol,node_featurizer=atom_featurizer, edge_featurizer=bond_featurizer) for mol in train_mols]test_graph =[mol_to_bigraph(mol,node_featurizer=atom_featurizer, edge_featurizer=bond_featurizer) for mol in test_mols]def run_a_train_epoch(n_epochs, epoch, model, data_loader,loss_criterion, optimizer):model.train()total_loss = 0losses = []for batch_id, batch_data in enumerate(data_loader):batch_datasmiles, bg, labels, masks = batch_dataif torch.cuda.is_available():bg.to(torch.device('cuda:0'))labels = labels.to('cuda:0')masks = masks.to('cuda:0')prediction = model(bg, bg.ndata['hv'], bg.edata['he'])loss = (loss_criterion(prediction, labels)*(masks != 0).float()).mean()#loss = loss_criterion(prediction, labels)#print(loss.shape)optimizer.zero_grad()loss.backward()optimizer.step()losses.append(loss.data.item())#total_score = np.mean(train_meter.compute_metric('rmse'))total_score = np.mean(losses)print('epoch {:d}/{:d}, training {:.4f}'.format( epoch + 1, n_epochs,  total_score))return total_scoremodel = model_zoo.chem.AttentiveFP(node_feat_size=39,edge_feat_size=10,num_layers=2,num_timesteps=2,graph_feat_size=200,output_size=1,dropout=0.2)train_loader = DataLoader(dataset=list(zip(train_smi, train_graph, train_sol)), batch_size=128, collate_fn=collate_molgraphs)
test_loader = DataLoader(dataset=list(zip(test_smi, test_graph, test_sol)), batch_size=128, collate_fn=collate_molgraphs)loss_fn = nn.MSELoss(reduction='none')
optimizer = torch.optim.Adam(model.parameters(), lr=10 ** (-2.5), weight_decay=10 ** (-5.0),)
n_epochs = 100
epochs = []
scores = []
for e in range(n_epochs):score = run_a_train_epoch(n_epochs, e, model, train_loader, loss_fn, optimizer)epochs.append(e)scores.append(score)
model.eval()

导入用于分子可视化依赖库

import copy
from rdkit.Chem import rdDepictor
from rdkit.Chem.Draw import rdMolDraw2D
from IPython.display import SVG
from IPython.display import display
import matplotlib
import matplotlib.cm as cm

定义可视化函数

  • 代码来源于DGL库。
  • DGL模型具有get_node_weight选项,该选项返回图形的node_weight。该模型具有两层GRU,因此以下代码我将0用作时间步长,因此时间步长必须为0或1。
def drawmol(idx, dataset, timestep):smiles, graph, _ = dataset[idx]print(smiles)bg = dgl.batch([graph])atom_feats, bond_feats = bg.ndata['hv'], bg.edata['he']if torch.cuda.is_available():print('use cuda')bg.to(torch.device('cuda:0'))atom_feats = atom_feats.to('cuda:0')bond_feats = bond_feats.to('cuda:0')_, atom_weights = model(bg, atom_feats, bond_feats, get_node_weight=True)assert timestep < len(atom_weights), 'Unexpected id for the readout round'atom_weights = atom_weights[timestep]min_value = torch.min(atom_weights)max_value = torch.max(atom_weights)atom_weights = (atom_weights - min_value) / (max_value - min_value)norm = matplotlib.colors.Normalize(vmin=0, vmax=1.28)cmap = cm.get_cmap('bwr')plt_colors = cm.ScalarMappable(norm=norm, cmap=cmap)atom_colors = {i: plt_colors.to_rgba(atom_weights[i].data.item()) for i in range(bg.number_of_nodes())}mol = Chem.MolFromSmiles(smiles)rdDepictor.Compute2DCoords(mol)drawer = rdMolDraw2D.MolDraw2DSVG(280, 280)drawer.SetFontSize(1)op = drawer.drawOptions()mol = rdMolDraw2D.PrepareMolForDrawing(mol)drawer.DrawMolecule(mol, highlightAtoms=range(bg.number_of_nodes()),highlightBonds=[],highlightAtomColors=atom_colors)drawer.FinishDrawing()svg = drawer.GetDrawingText()svg = svg.replace('svg:', '')if torch.cuda.is_available():atom_weights = atom_weights.to('cpu')return (Chem.MolFromSmiles(smiles), atom_weights.data.numpy(), svg)

绘制测试数据集分子

该模型预测溶解度,颜色表示红色是溶解度的积极影响,蓝色是负面影响。

target = test_loader.dataset
for i in range(len(target)):mol, aw, svg = drawmol(i, target, 0)display(SVG(svg))

。。。。。


参考资料

1. https://github.com/dmlc/dgl/tree/master/apps/life_sci

2. https://github.com/dmlc/dgl/blob/master/python/dgl/model_zoo/chem/attentive_fp.py

3. https://pubs.acs.org/doi/full/10.1021/acs.jcim.9b00387

DGL RDKit | 基于Attentive FP可视化训练模型原子权重相关推荐

  1. DGL RDKit | 基于Attentive FP的分子性质线性模型

    基于分子图的深度学习在化学和药物领域非常热门. 2019年8月13日JMC(Journal of Medicinal Chemistry)刊登了一篇文章"Pushing the Bounda ...

  2. RDKit | 基于相似图可视化原子贡献

    尝试使用相似度图的方法来可视化每个原子对特定描述符的贡献. 虽然使用了相似图(SimilarityMaps),但它们仅基于每个原子的贡献而可视化,与分子的相似性无关. 导入库 from rdkit i ...

  3. DGL RDKit | 基于GCN的多任务分类模型

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

  4. RDKit | 基于分子指纹可视化化学空间

    根据化学结构可视化化合物空间 方法 计算分子指纹 为每种化合物生成一个指纹并减小其尺寸,以便可以将其绘制在平面上.根据相似性原理,"相似的化合物具有相似的性质",具有相似结构和性质 ...

  5. DGL RDKit|基于GCN与基于3D描述符的分子溶解度预测模型对比

    GCN GCN : 图卷积神经网络(Graph Convolutional Networks) 图卷积的原理 处理图形或网络的数据形式存在许多重要的实际问题,如社交网络.知识图形.蛋白质相互作用网络和 ...

  6. SpanBERT:提出基于分词的预训练模型,多项任务性能超越现有模型!

    作者 | Mandar Joshi, Danqi Chen, Yinhan Liu, Daniel S. Weld, Luke Zettlemoyer, Omer Levy 译者 | Rachel 责 ...

  7. 论文研读-AI4VIS-可视化推荐-VizML: 一种基于机器学习的可视化推荐方法

    VizML: 一种基于机器学习的可视化推荐方法 1 论文概述 1.1 摘要 1.2 引言 2 问题陈述 3 相关工作 3.1 基于规则的可视化推荐系统 3.2 基于机器学习的可视化推荐系统 4 数据 ...

  8. rdkit 绘制分子【可视化分子】

    rdkit 内置了Draw模块,用于绘图,把一些经常用到的方法直接放在Draw下面. 文章目录 一.引入所需库 二.分子对象转化为图片 2.1 分子对象转图片文件函数解析 2.2 分子对象转图片函数解 ...

  9. RDKit | 基于RDKit和Cytoscape绘制分子相似图

    化学信息学中有许多网络结构化数据.例如分子,分子相似图和MMP等. Cytoscape是一款图形化显示网络并进行分析和编辑的软件 基于RDKit和Cytoscape绘制分子的相似图. py2cytos ...

最新文章

  1. 干货|卷积有多少种?一文读懂深度学习中的各种卷积
  2. Java HttpSession 详解
  3. intel219网卡的linux驱动,ubuntu16.04安装I219-V网卡驱动问题解决方法(示例代码)
  4. opencv 正脸和侧脸检测
  5. memcached 介绍
  6. 在.NET Core程序中设置全局异常处理
  7. C#实现简单WEB服务器
  8. tina中信号带宽_如何评测示波器带宽
  9. android系统存储路径在哪里,Android 手机存储目录
  10. 仓库码放要求_仓储管理的全流程SOP操作示范,你们公司仓库管理规范吗?
  11. javascript原生代码取单选框的值
  12. NSGA2算法中文版详细介绍
  13. Oracle Coherence中文教程三:配置
  14. ppt如何替换其他mo ban_“华南师范大学”专属PPT模板来了!华南师大同学们的PPT我们承包了!...
  15. 透彻理解神经网络剪枝算法
  16. A Brief History of Humankind — 01 the cognitive revolution
  17. python语言中、复数类型中实数部分_python学习03.02:Python数值类型(整形、浮点型和复数)及其用法...
  18. 如何在没有 Mac 的情况下使用 Flutter 和 Codemagic 构建和分发 iOS 应用
  19. 计算机打开查看方式默认是什么样,如何设置电脑文件夹默认查看方式
  20. Pycharm使用GPU,CUDA环境配置

热门文章

  1. 某程序员吐槽:提离职后领导开始演戏,假装不知道我工资低,对我进行挽留,怎么办?...
  2. 记一次单机系统的性能优化:最后竟是 TCP 的锅
  3. 再见了Spring Cloud!这个架构有点厉害,甚至干掉了Dubbo!
  4. 面试官再问我如何保证 RocketMQ 不丢失消息,这回我笑了!
  5. TensorFlow图像分类:如何构建分类器
  6. 没有功能需求设计文档?对不起,拒绝开发!
  7. 用Leangoo管理你的项目
  8. 平衡树性质与基本算法
  9. MOD函数语法和参数
  10. java中countinue,.random(用于产生一个随机数)入门可看