Keras基于深度学习预测G4序列

前言

今天介绍的这篇文章是关于用深度学习的方法预测G4序列的软件DeepG4,作者将该问题转换成分类问题,文章链接:《DeepG4: A deep learning approach to predict cell-type specific active G-quadruplex regions》


即输入一定的序列特征,利用深度卷积神经网络进行训练,最后输出二分类的结果

关于Keras安装

作者利用R包Keras进行训练,那么这个包常用于深度学习的R包,以tensorflow作为后端,那么该包的安装比较复杂,如果是在windows上安装,需要先安装conda(miniconda也可以,默认安装C盘,安装其他盘请添加环境变量);如果是Linux系统,同样要先安装conda,并且将用户的conda添加到环境变量里面,接下来在R中安装Keras:

install.packages("remotes")
install.packages("reticulate")
library(reticulate)
remotes::install_github("rstudio/tensorflow",force=T)
library(tensorflow)
# 指定tensorflow的版本和python的版本
install_tensorflow(version = "1.15",conda_python_version = "3.5")
remotes::install_github("rstudio/keras", dependencies = TRUE)
library(keras)

这样就安装好Keras了

在Linux系统中,如果安装好conda,还可以利用conda进行安装:

# 利用conda创建名为 r-tensorflow 的虚拟环境
conda create -n r-tensorflow python=3.6
# 进入r-tensorflow 的虚拟环境
source activate r-tensorflow

# 安装tensorflow和keras
conda install -y tensorflow
conda install -y keras

# 在 r-tensorflow 的虚拟环境中安装R
conda install -y r-base
#安装keras包
conda install -y r-keras

然后进入r-tensorflow 虚拟环境中的R里,library(keras)就可以了

DeepG4源码分析

它的核心代码比较简单,我们以序列特征作为分类指标为例子,作者在这里使用的分类指标是将字符信号转换为数字信号,由于基因组文件都是A,G,C,T四个碱基字符,所以很容易就转换为数字信号:


假设说我有一段AGTCG的序列,转换为数字信号即为一个5×4的array,由于G4的序列特征满足

所以某G4序列形成的array按照0,1排列的顺序,从一定程度上可以反应该序列的特征

以DeepG4的测试数据为例,读入的序列为:

[[1]]
  A DNAStringSet instance of length 100
      width seq
  [1]   201 GTTCGGGCCTCGGTCGCGCCGCCGGGTCTTGCAGACGCGAATGTAAACAGAAACA...TGACTCCTGGAGCGACCTTCACGAGGGAAAGCGCGCCCCCCGGCACCCACCCCT
  [2]   201 TTTCTATAGTTTTCTTTTGTTTCTACCTCATGACTAGATGATTCACTGCTTGAAC...GTCAAATCTGTCCATCTTCACTGCCACCCTTCAGTACCAAATGACCAGTCTCTT
  [3]   201 GCTTAAAAGCCTGTAAGAAAGATATAATTTGATAGAACTGGCTAGGATTTGTCAG...CGTCAGGGAGGGGGTGGGGCCTCCACGTGGGAGATCTTGCCTGGAGGTGGTGGA
  [4]   201 TCCCACACCCGGTAGATGTAAGGGAAAAACTGCATTACCCAGAAGGCACTGCCCC...GTGTGACGTCATCTCCGTGGGCCGGTTTGGCCCTGAAACAGTGTGGGGCCTAGA
  [5]   201 AGTAGCTACAGAGTTCCTGCTCCAGCAACCAGGAGCCTTGAGGCAGCACAAGGAC...ACCACAATGTCTGCCAAGAAAGAGGATGAGTCACCAAGACCCACAGGAAAGAGG
  ...   ... ...
 [96]   201 CACATGCCTTCCTTGGGGACGTGTTCACACATGTGGCCCTAGCTGTGAGAGACAG...CATCTCAGAACAGCTGAGCTGGAAGTGGGTGAATAATAATAATAATAATAATAA
 [97]   201 TGGTGGTCTTTCTCTACCGGGCCTGGTAGCCAAAGACAAAGGTCATAATCACTTG...CTATGTACTCTTCAAAGTGCCACCTCCTGGCTGCAAGCCAACCAACACAAAACC
 [98]   201 TGACCGTAGACCTCGTGCACTTCTGCTGCGGTCGGGGCCGGAGTCTGGGCTGGAG...GCGATCCAGAGCCAAGCGCCCCGCCCCTGCCCGGGCGCGCTCCCTCCTTAGCCC
 [99]   201 TTAACGTCATCAGTCGGGAGGACGACAGCTACGCACGCGCGGGGCACCTCCTCTG...GCCACGGTGGAGGCAGCGGCGAGAGGGGGCGGGGACAAGGAGAGGGCACGCACG
[100]   201 GTGTCCGGGTGAGAGACCTGGAGGTGGGGCCTAGGTGTCTACCCGGCCAGGTGCG...TAAGGCTCGGGGCCAGTCGTCGTCCATTCCTTCCTAACACCTCCCTATCCTCCC

源码:

library(Biostrings)
library(rtracklayer)
sequences <- readDNAStringSet("test_G4_data.fa")

# 基本的input
X = sequences
X.atac = NULL
Y=NULL
model=NULL
lower.case=F
treshold = 0.5
seq.size = 201
retrain=FALSE
retrain.path=""
log_odds=F

# 定义序列长度
model.regular.size.accepted <- 201
# 对四个碱基编码
tabv = c("T"=4,"G"=3,"C"=2,"A"=1)

# 转换为序列的数字信号 array
X <- DNAToNumerical(X,tabv = tabv,lower.case=lower.case,seq.size = seq.size)
X_inputs <- X
rm(X)

# 载入已经训练好的模型,h5文件
model <- keras::load_model_hdf5('best_model.h5')
model <- keras::keras_model(inputs = model$input,
                            outputs = keras::get_layer(model, index = log_odds_index)$output)

# 预测
res <- stats::predict(model,X_inputs)

最终的结果为:



结果为一个分数,文章建议该score介于0到1之间为active的G4 regions,而位于该区域外的即为非active的G4 regions。推测该范围是利用正负样本的序列,分别计算它们的score,然后分别看它们的分布,总结出来的经验范围

关于DNAToNumerical函数:

DNAToNumerical <- function(x,tabv = c("T"=4,"G"=3,"C"=2,"A"=1),lower.case=F,seq.size = 201){
  x <- Biostrings::as.matrix(x)
  listMat <- list()
  for(i in 1:length(tabv)){
    nuc_index <- tabv[[i]]
    nuc_value <- names(tabv[i])
    mat <- matrix(0,nrow(x),ncol(x))
    mat[x==nuc_value] <- 1
  
    listMat[[nuc_index]] <- mat
  }
  arrayout <- array(unlist(listMat), dim = c(nrow(listMat[[1]]), ncol(listMat[[1]]), length(listMat)))
  return(arrayout)
}

DeepG4支持自己训练数据

DeepG4也支持自己训练模型,并且自己测试:

ATAC <- system.file("extdata", "Peaks_BG4_G4seq_HaCaT_GSE76688_hg19_201b_Accessibility.bw", package = "DeepG4")
ATAC <- import.bw(ATAC)
# Read positive and segative set of sequences 
bed.pos <- import.bed(system.file("extdata", "Peaks_BG4_G4seq_HaCaT_GSE76688_hg19_201b.bed", package = "DeepG4"))
bed.neg <- import.bed(system.file("extdata", "Peaks_BG4_G4seq_HaCaT_GSE76688_hg19_201b_Ctrl_gkmSVM.bed", package = "DeepG4"))

# Generate classes
Y <- c(rep(1,length(bed.pos)),rep(0,length(bed.neg)))
BED <- c(bed.pos,bed.neg)
Input_DeepG4 <- DeepG4InputFromBED(BED=BED,ATAC = ATAC,GENOME=BSgenome.Hsapiens.UCSC.hg19)

# 训练模型
training <- DeepG4(X=Input_DeepG4[[1]],X.atac=Input_DeepG4[[2]],Y,retrain=TRUE,retrain.path = "DeepG4_retrained.hdf5")

重新训练样本需要加参数retrain=TRUE和相应保存h5文件的路径retrain.path,我们看其源代码:

# 该model重新训练的model
history <- keras::fit(
            model,
            X_inputs,
            Y,
            epochs = 20,
            batch_size = 128,
            validation_split = 0.2,
            verbose= 0)

res <- stats::predict(model,X_inputs)

if(retrain.path == ""){
            retrain.path <- paste0("DeepG4_retrained_",Sys.Date(),".hdf5")
        }
keras::save_model_hdf5(model,retrain.path)    

这样我们就可以使用自己训练的模型进行训练了

DeepG4加入染色质可及性特征进行预测

当然DeepG4也可以将G4区域的内的染色质可及性作为一种指标来训练模型

library(rtracklayer)
library(BSgenome.Hsapiens.UCSC.hg19)
library(DeepG4)

BED <- system.file("extdata", "test_G4_data.bed", package = "DeepG4")
BED <- import.bed(BED)
# 读取染色质可及性的数据
ATAC <- system.file("extdata", "Peaks_BG4_G4seq_HaCaT_GSE76688_hg19_201b_Accessibility.bw", package = "DeepG4")
ATAC <- import.bw(ATAC)

Input_DeepG4 <- DeepG4InputFromBED(BED=BED,ATAC = ATAC,GENOME=BSgenome.Hsapiens.UCSC.hg19)

# 进行预测
predictions <- DeepG4(X=Input_DeepG4[[1]],X.atac = Input_DeepG4[[2]])
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,458评论 6 513
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,030评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,879评论 0 358
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,278评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,296评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,019评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,633评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,541评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,068评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,181评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,318评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,991评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,670评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,183评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,302评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,655评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,327评论 2 358

推荐阅读更多精彩内容