網站首頁 編程語言 正文
最近導師讓我跑模型,生物信息方向的,我一個學計算機的,好多東西都看不明白。現在的方向大致是,用深度學習的模型預測病毒感染人類的風險。
既然是病毒,就需要拿到它的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
相關推薦
- 2022-04-28 C語言動態開辟內存詳解_C 語言
- 2022-09-24 ASP.NET?MVC實現文件下載_實用技巧
- 2022-07-09 python實現通訊錄系統_python
- 2022-07-21 pandas合并操作
- 2022-09-29 淺談音視頻?pts?dts基本概念及理解_其它綜合
- 2022-08-21 Python命令行庫click的具體使用_python
- 2022-04-12 【debug】TypeError: mel() takes 0 positional argumen
- 2023-02-01 Python中列表遍歷使用range和enumerate的區別講解_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支