Python实现将DNA序列存储为tfr文件并读取流程介绍
作者:weixin_42576837 发布时间:2021-08-04 08:02:23
最近导师让我跑模型,生物信息方向的,我一个学计算机的,好多东西都看不明白。现在的方向大致是,用深度学习的模型预测病毒感染人类的风险。
既然是病毒,就需要拿到它的DNA,也就是碱基序列,然后把这些ACGT序列丢进模型里面,然后就是预测能不能感染人类,说实话,估计结果不会好,现在啥都是transformer,而且我看的这篇论文,我认为仅仅从DNA序列大概预测不出什么东西。
但是就那样吧,现在数据去哪里下载,需要下载什么样的数据,下载完成后怎么处理我还是一脸懵逼,但是假设上面都处理好了,然后即使把数据丢给模型,跑就完了。
也不是没进度,目前了解到的是,我应该使用一种叫fasta格式的文件,然后把里面的一大串ACGT序列拿出来,转为模型可以处理的数据。然后,以后再说。
现在假设我已经有了ACGT的序列,然后把它转为模型可以处理的矩阵。
这里,我随机生成长度为131072的基因序列,为什么是这个数字呢,因为这是之前看的 论文里的值,,暂时按照这个来做。
实现:
首先是导入库
import numpy as np
import random
import tensorflow as tf
import inspect
from typing import Any, Callable, Dict, Optional, Text, Union, Iterable
import os
然后,定义一个生成长度为131072bp的函数:
#随机生成131072的dna序列
length = 131072
def randomSeq(length):
return ''.join([random.choice('ACGT') for i in range(length)])
这个函数的返回结果是长度为length
的字符串,类似ACGTTGC
这样。
然后这种序列模型是没办法处理的,所以需要把它变成矩阵,也就用one-hot编码。
比如ACGT这个序列,编码成:
[ [1,0,0,0],
[0,1,0,0],
[0,0,1,0],
[0,0,0,1] ]
这样的一个矩阵,这个就不细说了,网上很多资料。
然后,我从别人的代码中抄了一个函数,很好用。
#DNA序列转为one-hot编码,可以直接拿来用
def one_hot_encode(sequence: str,
alphabet: str = 'ACGT',
neutral_alphabet: str = 'N',
neutral_value: Any = 0,
dtype=np.float32) -> np.ndarray:
"""One-hot encode sequence."""
def to_uint8(string):
return np.frombuffer(string.encode('ascii'), dtype=np.uint8)
hash_table = np.zeros((np.iinfo(np.uint8).max, len(alphabet)), dtype=dtype)
hash_table[to_uint8(alphabet)] = np.eye(len(alphabet), dtype=dtype)
hash_table[to_uint8(neutral_alphabet)] = neutral_value
hash_table = hash_table.astype(dtype)
return hash_table[to_uint8(sequence)]
这是一个嵌套函数了,仔细研究下还是可以理解的,我就不说了,会用就行了。
简单讲一下参数的意思:
sequence:字符串类型,就是输入的碱基序列。
alphabet: str = ‘ACGT’ :词表,一共只需要这四个词
neutral_alphabet: str = ‘N’,
neutral_value: Any = 0,
上面这两一起用,就是说遇到N这个碱基就会编码成[0,0,0,0]的向量。
dtype=np.float32,这个就是内部元素值的类型。
简单生成一下:
然后输入序列长度是131072bp,所以输入的矩阵就是131072x4的矩阵,现在来把序列变为矩阵。
编码成one-hot矩阵
dnaVec = one_hot_encode(dna)
现在DNA序列已经变成了矩阵,接下来需要把这一条序列,也就是一个样本数据,变成TensorFlow中的TFRecord文件格式。TFRecord 是 TensorFlow 中的数据集存储格式。当我们将数据集整理成 TFRecord 格式后,TensorFlow 就可以高效地读取和处理这些数据集,从而帮助我们更高效地进行大规模的模型训练。
关于tfr文件的处理,我就不在细说了,总之现在我们需要构建example。
在此之前,我们需要先这么做:
#给出结果的tfr文件的路径
path = '/content/drive/MyDrive/test_Enformer/result.tfr'
#dna的numpy数组转成字节流,这样才能存储
dnaVec = dnaVec.tobytes()
接下来就是把这个字节流数据写入到tfr文件中,这里同时写入这条数据的label中,我的问题是给一个Dna序列,预测是或者不是的二分类问题,所以我同时把这条dna序列对应的真实标签也写进去,但是我是随机从0,1中选择一个。
from tensorflow.core.example.feature_pb2 import BytesList
with tf.io.TFRecordWriter(path) as writer:
feature = {
#序列使用的是tf.train.BytesList类型
'sequence':tf.train.Feature(bytes_list=tf.train.BytesList(value=[dnaVec])),
#label是随机生成的0,或者1
'label':tf.train.Feature(int64_list=tf.train.Int64List(value=[np.random.choice([0,1])]))
}
example = tf.train.Example(features=tf.train.Features(feature=feature))
writer.write(example.SerializeToString())
这部分的代码执行结束后,就已经把dna序列以及对应的标签写入了tfr文件中,不过这个tfr文件中只有一个example,你可以写更多个。
刚刚写入的tfr文件
到这里,相当于已经把数据准备好了,接下来就是读取数据。
#从刚才的路径中加载数据集
dataset = tf.data.TFRecordDataset(path)
#定义Feature结构,告诉解码器每个Feature的类型是什么
feature_description = {"sequence": tf.io.FixedLenFeature((), tf.string),
"label": tf.io.FixedLenFeature((), tf.int64)}
#将 TFRecord 文件中的每一个序列化的 tf.train.Example 解码
def parse_example(example_string):
#解析之后得到的example
example = tf.io.parse_single_example(example_string,feature_description)
#example['sequence']还是字节流的形式,重新转为数字向量
sequence = tf.io.decode_raw(example['sequence'], tf.float32)
sequence = tf.reshape(sequence,(length,4)) #形状需要重塑,不然就是一个长向量
label = tf.cast(example['label'],tf.int64) #标签对应的类型转换
#每一天example解析后返回对应的一个字典
return {
'sequence':sequence,
'label': label
}
#把parse_example函数映射到dataset中的每个example,
#这里的dataset中只有一个example
dataset = dataset.map(parse_example)
此时的dataset是一个可以遍历的对象,内部元素可以认为是解析完成后的example。
这个字典有两个键sequence和lable,对应着序列矩阵和标签值
这就是可以用来训练的数据。
来源:https://blog.csdn.net/weixin_42576837/article/details/126331917
猜你喜欢
- 1. 问题描述水仙花数也被称为超完全数字不变数、自恋数、自幂数、阿姆斯壮数或阿姆斯特朗数,水仙花数是指一个3位数,它的每个位上的数字的3次幂
- 解决方案在安装包的路径的../database/state/cvu/cvu_prereq.xml文件尾部添加如下:<OPERATING
- 触发器:触发器的使用场景以及相应版本:触发器可以使用的MySQL版本:版本:MySQL5以上使用场景例子:每当增加一个顾客到某个数据库表时,
- Requests具有完备的中英文文档, 能完全满足当前网络的需求, 它使用了urllib3, 拥有其所有的特性!最近在学python自动化,
- MySQL-Group-Replication 是mysql-5.7.17版本开发出来的新特性;它在master-slave 之间实现了强一
- 本文实例讲述了python实现与redis交互操作。分享给大家供大家参考,具体如下:相关内容:redis模块的使用设置值获取值安装模块导入模
- 本文实例讲述了JS实现合并json对象的方法。分享给大家供大家参考,具体如下:一、问题:求json对象合并的方法var a ={"
- python中自定义模块导入路径的方式主要有以下3种:(1)使用sys.path.append()随着程序执行,会动态地添加模块导入的路径,
- phpstorm配置debug环境众所周知,在渗透测试进行代码审计的时候,往往要审计代码的执行过程,亦或是在开发php项目的时候,需要了解代
- 程序员周末都喜欢做什么?在公司加班?在家里加班?看电影?睡觉?程序员都怎么找女朋友?百分之八十的程序员表示,女朋友是啥,有好 * 就够了。程序
- 单线程执行python的内置模块提供了两个内置模块:thread和threading,thread是源生模块,threading是扩展模块,
- 本文实例为大家分享了Python之给我一面国旗的具体代码,供大家参考,具体内容如下1、“给我一面国旗@微信官方”今天“给我一面国旗@微信官方
- 序言哈喽兄弟们,今天来实现一个Python采集视频、弹幕、评论与一体的小软件。平常咱们都是直接代码运行,不过今天我们做成软件,这样的话,咱们
- flask多进程会引起重复加载,解决方法:把耗资源的加载挪到函数里面或者类里面,就不会重复加载资源了。测试发现,不是flask引起的,是多进
- Golang浮点数比较和运算会出现误差。浮点数储存至内存中时,2的-1、-2……-n次方不能精确的表示小数部分,所以再把这个数从地址中取出来
- 对于数字索引数组来说,通过 array_push()函数向数组中添加元素。array_push()函数将数组当成一个栈,将传入的变量压入该数
- 一个非常简单的将半角"转换为中文"的asp函数function new_str(str)
- 起因事情是这样的,项目最近有个需求。服务器有个图片空间,说白了就是个文件夹。文件夹的结构大家都知道,一层一层的。然后需要在前端以树形展示。具
- 如何使用pycharm连接SQL Sever:应该是所有的错误都经历了(不得不说挺崩溃的)Tip:不要跳步操作。步骤一:先检测自己的SQL
- 本文实例讲述了Python自定义线程池实现方法。分享给大家供大家参考,具体如下:关于python的多线程,由与GIL的存在被广大群主所诟病,