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,这个就是内部元素值的类型。

简单生成一下:

Python实现将DNA序列存储为tfr文件并读取流程介绍

然后输入序列长度是131072bp,所以输入的矩阵就是131072x4的矩阵,现在来把序列变为矩阵。

编码成one-hot矩阵

dnaVec = one_hot_encode(dna)

Python实现将DNA序列存储为tfr文件并读取流程介绍

现在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文件

Python实现将DNA序列存储为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。

Python实现将DNA序列存储为tfr文件并读取流程介绍

这个字典有两个键sequence和lable,对应着序列矩阵和标签值

Python实现将DNA序列存储为tfr文件并读取流程介绍

这就是可以用来训练的数据。

来源:https://blog.csdn.net/weixin_42576837/article/details/126331917

标签:Python,存储,读取,tfr
0
投稿

猜你喜欢

  • 浅淡BANNER设计

    2010-09-25 18:37:00
  • 使用Python从有道词典网页获取单词翻译

    2022-12-10 21:18:03
  • 手写个小组件(组件入门)asp版

    2013-06-01 20:29:25
  • Pyqt助手安装PyQt5帮助文档过程图解

    2021-01-31 00:34:06
  • python爬虫框架scrapy实战之爬取京东商城进阶篇

    2023-02-27 21:20:51
  • 解决vue this.$forceUpdate() 处理页面刷新问题(v-for循环值刷新等)

    2024-06-05 09:15:26
  • mysql 正确清理binlog日志的两种方法

    2024-01-21 14:11:02
  • JS实现控制表格内指定单元格内容对齐的方法

    2024-04-17 09:42:28
  • Go实现一个配置包详解

    2024-05-22 10:29:57
  • Python实现爬取需要登录的网站完整示例

    2022-08-09 11:40:33
  • Python中移除List重复项的五种方法

    2021-12-11 20:15:38
  • SQL Server中TRUNCATE事务回滚操作方法

    2024-01-20 14:43:23
  • selenium+python实现自动登录脚本

    2021-09-30 01:36:19
  • 关于element-ui中el-form自定义验证(调用后端接口)

    2024-04-27 15:57:00
  • Python淘宝或京东等秒杀抢购脚本实现(秒杀脚本)

    2023-01-23 20:25:14
  • Golang实现简易的命令行功能

    2024-02-08 10:17:31
  • django 删除数据库表后重新同步的方法

    2024-01-12 23:11:56
  • 教你为MySQL数据库换挡加速

    2010-03-03 16:58:00
  • Django添加bootstrap框架时无法加载静态文件的解决方式

    2023-04-16 07:27:44
  • WEB2.0网页制作标准教程(11)不用表格的菜单

    2008-02-19 19:36:00
  • asp之家 网络编程 m.aspxhome.com