DNA序列存储为tfr文件并读取
最近导师让我跑模型,生物信息方向的,我一个学计算机的,好多东西都看不明白。现在的方向大致是,用深度学习的模型预测病毒感染人类的风险。
既然是病毒,就需要拿到它的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_valuehash_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):#解析之后得到的exampleexample = 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,对应着序列矩阵和标签值
这就是可以用来训练的数据。
DNA序列存储为tfr文件并读取相关推荐
- numpy序列预处理dna序列_合成生物学快讯2019年第12期:基于DNA的分子数字数据存储...
本文由中国科学院上海生命科学信息中心 战略情报团队供稿 基于DNA的分子数字数据存储:现状与挑战 编者按:美国华盛顿大学和微软研究院的研究人员2019年8月在Nature杂志发文,对基于DNA的分子数 ...
- C#,生信软件实践(01)——DNA序列数据库FASTA文件合并工具的源代码
1 生物信息学简介 生物信息学(BioInformatics)是研究生物信息的采集.处理.存储.传播,分析和解释等各方面的学科,也是随着生命科学和计算机科学的迅猛发展,生命科学和计算机科学相结合形成的 ...
- 32. Pandas借助Python爬虫读取HTML网页表格存储到Excel文件
Pandas借助Python爬虫读取HTML网页表格存储到Excel文件 实现目标: 网易有道词典可以用于英语单词查询,可以将查询的单词加入到单词本; 当前没有导出全部单词列表的功能.为了复习方便,可 ...
- np array 存储 json格式文件的写入与读取
Python中提供了list容器,可以当作数组使用.但列表中的元素可以是任何对象,因此列表中保存的是对象的指针,这样一来,为了保存一个简单的列表[1,2,3].就需要三个指针和三个整数对象.对于数值运 ...
- Python文件内容读取成绩单,计算出平均分并且写入原文件存储
python文件内容读取成绩单,计算出平均分并且写入原文件存储 文件内容如下:( 格式参考下表, 内容自己定义) 姓名 语文 数学 英语 aaa 80 70 65 bbb 85 88 90 ccc 7 ...
- c语言结构体数组放入文件中,c-从文件中读取数据并存储到结构数组中
因此,我需要帮助创建一个程序来打开文件,并将文件中的数据读取到结构数组中,然后计算各种东西,例如最高,最低,平均和标准偏差.现在,我更关心如何读取实际文件并将其放入结构数组中. 以下是分配的说明: - ...
- 【python学习】批量读取Materials Studio的sdf文件,从文件中提取特定信息并按列存储在CSV文件
批量读取Materials Studio的sdf文件,从文件中提取特定信息并按列存储在CSV文件 Materials Studio在执行dmol3模块中结构优化任务时,任务结束后会产生一系列的输出文件 ...
- 根据 基因名、bed 文件的基因位置,提取 DNA 序列 bedtools
根据 基因名.bed 文件的基因位置,提取 DNA 序列 bedtools 1.根据 Gene Symbol 查找在序列上的位置 2.根据 基因位置 提取参考上的序列 1.根据 Gene Symbol ...
- python文件处理,将DNA序列转换为RNA序列
1 #!/usr/bin/python 2 #-*- coding:utf-8 -*- 3 "将DNA序列转换为RNA序列,即将T转换为U即可,利用字符串的replace方法" 5 ...
最新文章
- CoordinatorLayout 和 AppBarLayout 实现的局部点击按钮实现滑动某一个固定的距离
- 问题 c: 插入排序_插入排序:它是什么,以及它如何工作
- 联想小新air13pro重装系统_联想 小新Air 13 ProU盘装系统win7教程
- mysql8 修改权限_MySQL8修改重置root密码,远程连接权限设置
- Eigen(8)实例最小二乘法
- Uoj 441 保卫王国
- PhpStrom 配置Xdebug
- ubuntu server 16.04 开启root密码登录
- c语言 graph,基于图(graph)的应用举例
- WM_NOTIFY的使用
- 计算机加密是什么意思,bitlocker驱动加密是什么意思?
- 入门JSP第一步,看这里~
- DPPM(动态电源路径管理)与VINDPM(输入电压动态电源管理)
- C语言分数加减法编程,分数加减法(C语言)
- matlab画正态分布图简单算法
- Web前端开发十日谈
- java pdf中插入图片
- Galaxy S9最新谍照曝光 采用新款DeX扩展坞
- Apache Zeppelin 简单介绍,以及下载地址
- Python tkinter (1) - Tk 用法演示
热门文章
- 找规律万能公式_初中规律题的万能公式
- the mesh is compo…
- 提高spark任务稳定性的解决方案及Blacklist 机制说明解释
- 在C#中实现SQLite的事务处理
- 爬取豆瓣图书排行榜前十并使用图表的形式展示
- uni-app 打开外部网页地址 web url
- Android--万能自定义弹窗
- pd.Series()函数
- 1. 无法解析的外部符号 “__declspec(dllimport) const XXX::vftable“ ` 2. `无法定义 dllimport 实体`
- docker环境安装jira(Linux系统)