Python實現將DNA序列存儲為tfr文件并讀取流程介紹_第1頁
Python實現將DNA序列存儲為tfr文件并讀取流程介紹_第2頁
Python實現將DNA序列存儲為tfr文件并讀取流程介紹_第3頁
Python實現將DNA序列存儲為tfr文件并讀取流程介紹_第4頁
Python實現將DNA序列存儲為tfr文件并讀取流程介紹_第5頁
已閱讀5頁,還剩2頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第Python實現將DNA序列存儲為tfr文件并讀取流程介紹最近導師讓我跑模型,生物信息方向的,我一個學計算機的,好多東西都看不明白。現在的方向大致是,用深度學習的模型預測病毒感染人類的風險。

既然是病毒,就需要拿到它的DNA,也就是堿基序列,然后把這些ACGT序列丟進模型里面,然后就是預測能不能感染人類,說實話,估計結果不會好,現在啥都是transformer,而且我看的這篇論文,我認為僅僅從DNA序列大概預測不出什么東西。

但是就那樣吧,現在數據去哪里下載,需要下載什么樣的數據,下載完成后怎么處理我還是一臉懵逼,但是假設上面都處理好了,然后即使把數據丟給模型,跑就完了。

也不是沒進度,目前了解到的是,我應該使用一種叫fasta格式的文件,然后把里面的一大串ACGT序列拿出來,轉為模型可以處理的數據。然后,以后再說。

現在假設我已經有了ACGT的序列,然后把它轉為模型可以處理的矩陣。

這里,我隨機生成長度為131072的基因序列,為什么是這個數字呢,因為這是之前看的論文里的值,,暫時按照這個來做。

實現:

首先是導入庫

importnumpyasnp

importrandom

importtensorflowastf

importinspect

fromtypingimportAny,Callable,Dict,Optional,Text,Union,Iterable

importos

然后,定義一個生成長度為131072bp的函數:

#隨機生成131072的dna序列

length=131072

defrandomSeq(length):

return''.join([random.choice('ACGT')foriinrange(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編碼,可以直接拿來用

defone_hot_encode(sequence:str,

alphabet:str='ACGT',

neutral_alphabet:str='N',

neutral_value:Any=0,

dtype=np.float32)-np.ndarray:

"""One-hotencodesequence."""

defto_uint8(string):

returnnp.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)

returnhash_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的矩陣,現在來把序列變?yōu)榫仃嚒?/p>

編碼成one-hot矩陣

dnaVec=one_hot_encode(dna)

現在DNA序列已經變成了矩陣,接下來需要把這一條序列,也就是一個樣本數據,變成TensorFlow中的TFRecord文件格式。TFRecord是TensorFlow中的數據集存儲格式。當我們將數據集整理成TFRecord格式后,TensorFlow就可以高效地讀取和處理這些數據集,從而幫助我們更高效地進行大規(guī)模的模型訓練。

關于tfr文件的處理,我就不在細說了,總之現在我們需要構建example。

在此之前,我們需要先這么做:

#給出結果的tfr文件的路徑

path='/content/drive/MyDrive/test_Enformer/result.tfr'

#dna的numpy數組轉成字節(jié)流,這樣才能存儲

dnaVec=dnaVec.tobytes()

接下來就是把這個字節(jié)流數據寫入到tfr文件中,這里同時寫入這條數據的label中,我的問題是給一個Dna序列,預測是或者不是的二分類問題,所以我同時把這條dna序列對應的真實標簽也寫進去,但是我是隨機從0,1中選擇一個。

fromtensorflow.core.example.feature_pb2importBytesList

withtf.io.TFRecordWriter(path)aswriter:

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())

這部分的代碼執(zhí)行結束后,就已經把dna序列以及對應的標簽寫入了tfr文件中,不過這個tfr文件中只有一個example,你可以寫更多個。

剛剛寫入的tfr文件

到這里,相當于已經把數據準備好了,接下來就是讀取數據。

#從剛才的路徑中加載數據集

dataset=tf.data.TFRecordDataset(path)

#定義Feature結構,告訴解碼器每個Feature的類型是什么

feature_description={"sequence":tf.io.FixedLenFeature((),tf.string),

"label":tf.io.FixedLenFeature((),64)}

#將TFRecord文件中的每一個序列化的tf.train.Example解碼

defparse_example(example_string):

#解析之后得到的example

example=tf.io.parse_single_example(example_string,feature_description)

#example['sequence']還是字節(jié)流的形式,重新轉為數字向量

sequence=tf.io.decode_raw(example['sequence'],tf.float32)

sequence=tf.reshape(sequence,(length,4))#形狀需要重塑,不然就是一個長向量

label=tf.cast(example['label'],64)#標簽對應的類型轉換

#每一天example解析后返回對應的一個字典

return{

'sequence':sequence,

'label':label

}

#把parse_example函數

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論