DGL
纽约大学、纽约大学上海分校、AWS上海研究院以及AWS MXNet Science Team共同开源了一个面向图神经网络及图机器学习的全新框架,命名为Deep Graph Library(DGL)。
用于图上的深度学习,支持PyTorch、MXNet等多种深度学习框架。
RDKit
RDKit 是一款开源化学信息学与机器学习工具包,提供C 和python 的API 接口。
RDKit提供各种功能,如不同的化学I/O格式,包括SMILES/SMARTS,结构数据格式(SDF),Thor数据树(TDT),Sybyl线符号(SLN),Corina mol2和蛋白质数据库(PDB)。子结构搜索; 标准SMILES; 手性支持;化学转化;化学反应;分子序列化;相似性/多样性选择;二维药效团;分层子图/片段分析; Bemis和Murcko骨架;逆合成组合分析程序(RECAP); 多分子最大共同亚结构;功能图;基于形状的相似性;基于RMSD的分子分子比对;基于形状的对齐;使用Open3-DALIGN算法的无监督分子-分子比对;与PyMOL进行3D可视化集成;功能组过滤;分子描述符库;相似图;机器学习等等。
MDTraj
由斯坦福的Vijey Pande组开发并维护,2016年Biophysical Journal年度highlight之一,是现在非常流行的分子模拟轨道分析库: (1) 包含许多常用的分析函数,且均优化过或在计算中引用由C或C 写的函数,因此速度非常快,特别是可以直接计算 dssp定义的蛋白质二级结构而无需提前安装 dssp (利用Biopython计算二级结构需要先装dssp);(2) 与ipython notebook交互可以直接显示轨道(尽管能做到这一点的项目有很多)。
mdtraj安装
pip install mdtraj
基于GCN的多任务分类模型
环境准备
- PyTorch:深度学习框架
- DGL:基于PyTorch的库,支持深度学习以处理图形
- RDKit:用于构建分子图并从字符串表示形式绘制结构式
- MDTraj:用于分子动力学轨迹分析的开源库
导入库
代码语言:javascript复制import os
from rdkit import Chem
from rdkit import RDPaths
import numpy as np
import torch
import dgl
if torch.cuda.is_available():
print('use GPU')
device='cuda'
else:
print('use CPU')
device='cpu'
from dgl.model_zoo.chem import GCNClassifier
from dgl.data.chem.utils import mol_to_graph
from dgl.data.chem.utils import mol_to_complete_graph
from dgl.data.chem import CanonicalAtomFeaturizer
from dgl.data.chem import CanonicalBondFeaturizer
from torch import nn
import torch.nn.functional as F
from torch.utils.data import DataLoader
from torch.utils.data import Dataset
from torch.nn import CrossEntropyLoss
加载数据,rdkit的mol对象将转换为图对象
使用标准原子特征化器来完成任务。模块中使用的函数与deepchem相同。
用DGL构建图对象很容易。只需调用mol_to_complete_graph函数。当然,也可以对SMILE字符串使用smiles_to_complete_graph函数。
代码语言:javascript复制trainmols = [m for m in Chem.SDMolSupplier('solubility.train.sdf')]
testmols = [m for m in Chem.SDMolSupplier('solubility.test.sdf')]
prop_dict = {
"(A) low": 0,
"(B) medium": 1,
"(C) high": 2
}
atom_featurizer = CanonicalAtomFeaturizer()
bond_featurizer = CanonicalBondFeaturizer()
g = mol_to_complete_graph(trainmols[0],
add_self_loop=False,
node_featurizer=atom_featurizer,
#edge_featurizer= bond_featurizer
)
定义GCN模型
GCNClassifier将gcn_hidden_feats参数作为列表对象。如果想添加n个GCN图层,则应传递带有n个隐藏图层参数的列表。在以下模型中添加了2个GCN图层以及60和20个隐藏图层。
代码语言:javascript复制# define GCN NET with 2 GCN layers
gcn_net = GCNClassifier(in_feats=n_feats,
gcn_hidden_feats=[60,20],
n_tasks=ncls,
classifier_hidden_feats=10,
dropout=0.5,)
gcn_net = gcn_net.to(device)
数据批处理
代码语言:javascript复制train_data = list(zip(train_g, train_y))
train_loader = DataLoader(train_data, batch_size=128, shuffle=True, collate_fn=collate, drop_last=True)
定义损失函数和优化器
代码语言:javascript复制loss_fn = CrossEntropyLoss()
optimizer = torch.optim.Adam(gcn_net.parameters(), lr=0.01)
gcn_net.train()
训练模型
多标签分类任务,将CrossEntropyLoss用于损失函数。
代码语言:javascript复制epoch_losses = []
epoch_accuracies = []
for epoch in range(1,201):
epoch_loss = 0
epoch_acc = 0
for i, (bg, labels) in enumerate(train_loader):
labels = labels.to(device)
atom_feats = bg.ndata.pop('h').to(device)
atom_feats, labels = atom_feats.to(device), labels.to(device)
pred = gcn_net(bg, atom_feats)
loss = loss_fn(pred, labels)
optimizer.zero_grad()
loss.backward()
optimizer.step()
epoch_loss = loss.detach().item()
pred_cls = pred.argmax(-1).detach().to('cpu').numpy()
true_label = labels.to('cpu').numpy()
epoch_acc = sum(true_label==pred_cls) / true_label.shape[0]
epoch_acc /= (i 1)
epoch_loss /= (i 1)
if epoch % 20 == 0:
print(f"epoch: {epoch}, LOSS: {epoch_loss:.3f}, ACC: {epoch_acc:.3f}")
epoch_accuracies.append(epoch_acc)
epoch_losses.append(epoch_loss)
绘制学习过程
- 项目地址:https://github.com/dmlc/dgl
- 初学者教程:https://docs.dgl.ai/tutorials/basics/index.html
- 所有示例模型的详细从零教程:https://docs.dgl.ai/tutorials/models/index.html
文 / 编辑:王建民
DrugAI