本次学习主要内容:
提供一部分公开文献中提取的siRNA修饰序列以及相应实验条件数据(例如药物浓度、细胞系、转染方式等),随机打散后使用约85%数据训练,剩余约15%数据用于leaderboard submission评分,主要用于测试针对在训练集中出现过的目标mRNA序列,不同siRNA的沉默效率预测的准确率。
对于siRNA的官方解释:
小干扰RNA(siRNA),有时称为短干扰RNA或沉默RNA,是一类双链RNA分子,长度为20-25个碱基对,类似于miRNA,并且在RNA干扰(RNAi)途径内操作。它干扰了表达与互补的核苷酸序列的特定基因的转录后降解的mRNA,从而防止翻译。
siRNA由双链RNA (double strand RNA,dsRNA) 在细胞内被RNase III (如Dicer) 切割成21~25bp大小的双链RNA。dsRNA可以是外源的,如病毒RNA复制中间体或人工导入的dsRNA;也可以是内源的,如细胞中单链RNA在RNA依赖的RNA聚合酶的作用下形成的dsRNA 。
对于这个siRNA模型:
这是一个基于GRU的神经网络模型;GRU中文是门控循环单元,是一种常用的 GRNN(门控循环神经网络);它对 LSTM 做了很多简化,同时却保持着和 LSTM 相同的效果。
对于GRU的具体内容可以前往Dive-into-DL-PyTorch进行学习。
下面是我遇到的一些问题以及解释:
1、序列分词方式
下列代码的分词方式有两种:第一是典型的根据空格进行分词;第二是根据分词器进行分词(防止序列过长)。
def tokenize_and_encode(self, seq):
if ' ' in seq: # 修改过的序列
tokens = seq.split() # 按空格分词
else: # 常规序列
tokens = self.tokenizer.tokenize(seq) # 使用分词器分词
2、分词器
首先对分词器初始化,定义ngram(长度)和stride(步幅),代码中定义的ngram为5、stride为2。
接下来是对输入序列进行大小写的统一,代码中是全部转换为大写(统一的格式更有利于提高学习效果)。
然后就是处理序列,长度为1的序列直接写入列表toks中;如果长度不为1,则从第一个字符开始取长度为ngram的字符写入列表,接着指针向前移动长度为stride的字符;序列转换完后对最后一个分词长度进行判断,若该分词长度小于ngram则舍去。例如:序列长度小于5时(如:0123),最终得到的列表为空;序列长度大于等于5时(如:0123456789),最终得到的列表中会存在01234,23456,45678三项,而6789长度小于5被移除。
最后便是返回toks列表。
class GenomicTokenizer:
def __init__(self, ngram=5, stride=2):
# 初始化分词器,设置n-gram长度和步幅
self.ngram = ngram
self.stride = stride
def tokenize(self, t):
# 将输入序列转换为大写
t = t.upper()
if self.ngram == 1:
# 如果n-gram长度为1,直接将序列转换为字符列表
toks = list(t)
else:
# 否则,按照步幅对序列进行n-gram分词
toks = [t[i:i+self.ngram] for i in range(0, len(t), self.stride) if len(t[i:i+self.ngram]) == self.ngram]
# 如果最后一个分词长度小于n-gram,移除最后一个分词
if len(toks[-1]) < self.ngram:
toks = toks[:-1]
# 返回分词结果
return toks