Py学习  »  机器学习算法

如何把DNA序列编码成深度学习的向量化输入——GP-GCN框架教程

生信技能树 • 1 年前 • 398 次点击  



背景介绍




现在越来越多的工作利用深度学习来实现DNA序列的分类或者回归任务,但是如何把DNA序列编码成深度学习的向量化输入?换句话说,怎么把由A,C,G,T组成的DNA“字符串”转化成深度学习需要的向量(矩阵)格式?


目前常用的方法有one-hot encoding和k-mer frequency vector。One-hot encoding是把A表示成[1,0,0,0], C表示成[0,1,0,0],G表示成[0,0,1,0],T表示成[0,0,0,1],这样一条长度为L的DNA序列可以转成4*L的矩阵,但多数情况下参与训练的DNA序列长度都不一样,然而深度学习模型要求输入的矩阵大小一致,这时候如果长度差别不是很大,可以用cutting & padding的方法;如果长度差别很大,one-hot encoding就不太适合了。这时候可以采用k-mer frequency vector来表示DNA序列,也就是把这条序列中所有的k-mer的出现频率或者次数提取出来,组成一个向量作为输入,这种方法的很显然会丢失很多序列的信息,比如k-mer之间的interaction。


这里要介绍的GP-GCN framework[1]就是为了解决这些问题。[1]这篇文章主要是拿病毒的序列作为例子来验证这个框架,实际上这个框架可以用于任何DNA序列。



GP-GCN framework原理



如果对原理不感兴趣,可以跳过这部分直接看软件教程哦~

01

sequence to graph




对于一条DNA序列s,我们都可以把它转化成一个graph。graph的点对应k-mer,边对应k-mer之间的interaction。点的特征是这个k-mer出现的频率;边的特征是这两个k-mer连在一起出现的频率(因为考虑不同的间隔距离,所以是一个向量)。这里考虑不同的间隔距离是为了解决在生物序列中常出现的基因变异的情况。

02

graph embedding




接下来使用图卷积神经网络进行消息传递,将k-mer的信息通过序列中的信息(保存在边上)聚合到其他k-mer上。

03

downstream analysis




接下来把所有k-mer的embeddings放在一起,接上普通的全连接层(也可以先用卷积神经网络降维),形成一个完整的神经网络用于下游分析。




软件教程



软件源码和README可以在https://github.com/deepomicslab/GCNFrame找到。

安装



pip install GCNFrame

由于GP-GCN框架是用pytorch和pytorch_geometric写的,需要安装pytorch 1.7和pytorch_geometric 1.7。


数据准备



  • [必要] fasta格式的序列

  • [必要] 序列的classification label (需要和fasta顺序一致)

  • [可选] 如果除了序列本身,还有其他的特征想要一起训练,可以提供txt文件

    以上三种数据的example均可在https://github.com/deepomicslab/GCNFrame里找到。


代码



# This is an example to train a two-classes model.from GCNFrame import Biodata, GCNmodelimport torchdevice = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
# 1data = Biodata(fasta_file="example_data/nature_2017.fasta", label_file="example_data/lifestyle_label.txt", feature_file="example_data/CDD_protein_feature.txt")# 2dataset = data.encode(thread=20)# 3model = GCNmodel.model(label_num=2, other_feature_dim=206).to(device)# 4GCNmodel.train(dataset, model, weighted_sampling=True)# 5 GCNmodel.test("GCN_model.pt", fasta_file="test.fasta", feature_file="test_feature.txt")


以上就是training,validation和test的全部代码~

除去前面的引用包以外一共五句,现在来一句句解释:

1:读入准备好的数据,包括fasta file,label file 和feature file(如果没有可以写None)

2:提取序列中的特征,把序列编码成graph

3:建立GCN 模型

4:开始训练,如果你的数据里每个类别sample数量不平均,可以选择weighted_sampling=True防止训练产生的bias。这里的训练会显示training accuracy和validation accuracy,可以利用validation accuracy进行调参。训练完后会自动保存为"GCN_model.pt"。

5:用训练好的模型预测新序列的label。这里的fasta_file和feature_file(如果有)是你新的测试集


参数



如果对模型比较有兴趣,想通过调参进一步提高模型准确率,可以参考下面的常用参数介绍~

  • Biodata的参数:

  • K:k-mer长度(默认3,用2信息量太小,3以上容易内存过大,建议用3)

  • d:gapped范围(默认3,表示pattern之间可以容忍的距离,越大包含信息量越多,但容易过拟合)

  • thread:线程数(默认10)


  • GCNmodel.model的参数:

  • K: 同上,请与Biodata保持一致

  • d: 同上,请与Biodata保持一致

  • gcn_layer_num:SAGEConv层数(默认4)


  • GCNmodel.train的参数:

  • learning_rate: 训练速度(默认1e-4)

  • batch_size:每批处理的样本的个数(默认64)

  • epoch_n: 训练迭代次数(默认20,如果训练准确率不高,可以提高此参数)

  • val_split: 选取多少比例的数据作为validation(默认10%)

  • weighted_sampling:是否按照类别权重训练(默认是,可以处理不均衡数据集)

  • model_name:保存的模型名称(默认"GCN_model.pt")


  • GCNmodel.test的参数:

  • K: 同上,请与Biodata保持一致

  • d: 同上,请与Biodata保持一致


更多的参数可以在https://github.com/deepomicslab/GCNFrame里找到,可以根据validation accuracy对参数进行调整。


GP-GCN框架的介绍就到这里,欢迎大家使用GP-GCN框架来把深度学习用到自己的序列和任务上!如果有任何软件方面的问题,欢迎留言;如果有对软件的建议或者需要更多的功能,也请告诉我,我们非常乐意在后面的版本增加更多的功能




Reference



[1] Ruohan WANG, Yen Kaow NG, Xianglilan ZHANG, Jianping WANG & Shuai Cheng Li (2022). A graph representation of gapped patterns in phage sequences for graph convolutional network. bioRxiv.



原文链接可到本文章发表页面



END




Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/147446
 
398 次点击