最近导师让我跑模型,生物信息方向的,我一个学计算机的,好多东西都看不明白。现在的方向大致是,用深度学习的模型预测病毒感染人类的风险。

既然是病毒,就需要拿到它的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文件并读取相关推荐

  1. numpy序列预处理dna序列_合成生物学快讯2019年第12期:基于DNA的分子数字数据存储...

    本文由中国科学院上海生命科学信息中心 战略情报团队供稿 基于DNA的分子数字数据存储:现状与挑战 编者按:美国华盛顿大学和微软研究院的研究人员2019年8月在Nature杂志发文,对基于DNA的分子数 ...

  2. C#,生信软件实践(01)——DNA序列数据库FASTA文件合并工具的源代码

    1 生物信息学简介 生物信息学(BioInformatics)是研究生物信息的采集.处理.存储.传播,分析和解释等各方面的学科,也是随着生命科学和计算机科学的迅猛发展,生命科学和计算机科学相结合形成的 ...

  3. 32. Pandas借助Python爬虫读取HTML网页表格存储到Excel文件

    Pandas借助Python爬虫读取HTML网页表格存储到Excel文件 实现目标: 网易有道词典可以用于英语单词查询,可以将查询的单词加入到单词本; 当前没有导出全部单词列表的功能.为了复习方便,可 ...

  4. np array 存储 json格式文件的写入与读取

    Python中提供了list容器,可以当作数组使用.但列表中的元素可以是任何对象,因此列表中保存的是对象的指针,这样一来,为了保存一个简单的列表[1,2,3].就需要三个指针和三个整数对象.对于数值运 ...

  5. Python文件内容读取成绩单,计算出平均分并且写入原文件存储

    python文件内容读取成绩单,计算出平均分并且写入原文件存储 文件内容如下:( 格式参考下表, 内容自己定义) 姓名 语文 数学 英语 aaa 80 70 65 bbb 85 88 90 ccc 7 ...

  6. c语言结构体数组放入文件中,c-从文件中读取数据并存储到结构数组中

    因此,我需要帮助创建一个程序来打开文件,并将文件中的数据读取到结构数组中,然后计算各种东西,例如最高,最低,平均和标准偏差.现在,我更关心如何读取实际文件并将其放入结构数组中. 以下是分配的说明: - ...

  7. 【python学习】批量读取Materials Studio的sdf文件,从文件中提取特定信息并按列存储在CSV文件

    批量读取Materials Studio的sdf文件,从文件中提取特定信息并按列存储在CSV文件 Materials Studio在执行dmol3模块中结构优化任务时,任务结束后会产生一系列的输出文件 ...

  8. 根据 基因名、bed 文件的基因位置,提取 DNA 序列 bedtools

    根据 基因名.bed 文件的基因位置,提取 DNA 序列 bedtools 1.根据 Gene Symbol 查找在序列上的位置 2.根据 基因位置 提取参考上的序列 1.根据 Gene Symbol ...

  9. python文件处理,将DNA序列转换为RNA序列

    1 #!/usr/bin/python 2 #-*- coding:utf-8 -*- 3 "将DNA序列转换为RNA序列,即将T转换为U即可,利用字符串的replace方法" 5 ...

最新文章

  1. CoordinatorLayout 和 AppBarLayout 实现的局部点击按钮实现滑动某一个固定的距离
  2. 问题 c: 插入排序_插入排序:它是什么,以及它如何工作
  3. 联想小新air13pro重装系统_联想 小新Air 13 ProU盘装系统win7教程
  4. mysql8 修改权限_MySQL8修改重置root密码,远程连接权限设置
  5. Eigen(8)实例最小二乘法
  6. Uoj 441 保卫王国
  7. PhpStrom 配置Xdebug
  8. ubuntu server 16.04 开启root密码登录
  9. c语言 graph,基于图(graph)的应用举例
  10. WM_NOTIFY的使用
  11. 计算机加密是什么意思,bitlocker驱动加密是什么意思?
  12. 入门JSP第一步,看这里~
  13. DPPM(动态电源路径管理)与VINDPM(输入电压动态电源管理)
  14. C语言分数加减法编程,分数加减法(C语言)
  15. matlab画正态分布图简单算法
  16. Web前端开发十日谈
  17. java pdf中插入图片
  18. Galaxy S9最新谍照曝光 采用新款DeX扩展坞
  19. Apache Zeppelin 简单介绍,以及下载地址
  20. Python tkinter (1) - Tk 用法演示

热门文章

  1. 找规律万能公式_初中规律题的万能公式
  2. the mesh is compo…
  3. 提高spark任务稳定性的解决方案及Blacklist 机制说明解释
  4. 在C#中实现SQLite的事务处理
  5. 爬取豆瓣图书排行榜前十并使用图表的形式展示
  6. uni-app 打开外部网页地址 web url
  7. Android--万能自定义弹窗
  8. pd.Series()函数
  9. 1. 无法解析的外部符号 “__declspec(dllimport) const XXX::vftable“ ` 2. `无法定义 dllimport 实体`
  10. docker环境安装jira(Linux系统)