基于深度学习的 DNA 序列分类模型 - 使用 Keras 和 LSTM 实现
import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns from sklearn.model_selection import train_test_split from keras.models import Sequential from keras.layers import Dense, Flatten, Conv1D, MaxPooling1D, LSTM, Reshape from keras.utils import to_categorical
def read_fasta(file): seqs = [] labels = [] with open(file, 'r') as f: for line in f: if line.startswith('>'): labels.append(line.strip()[1:]) else: seqs.append(line.strip()) label_dict = {l:i for i,l in enumerate(set(labels))} label_indices = [label_dict[l] for l in labels] seqs = np.array(seqs)[np.argsort(label_indices)] labels = np.array(label_indices) return seqs, labels
def seq_to_num(seqs, sequence_length): seq_num = [] for seq in seqs: seq_num.append([int(i) for i in seq.replace('A', '1').replace('C', '2').replace('G', '3').replace('T', '4')]) seq_num = np.array(seq_num) seq_num = np.pad(seq_num, ((0,0), (0, sequence_length-seq_num.shape[1])), 'constant', constant_values=0) return seq_num
def encode_labels(labels): label_dict = {l:i for i,l in enumerate(set(labels))} encoded_labels = [label_dict[l] for l in labels] return to_categorical(encoded_labels)
def create_model(): model = Sequential() model.add(Conv1D(filters=32, kernel_size=3, activation='relu', input_shape=(1000, 1))) model.add(MaxPooling1D(pool_size=2)) model.add(Conv1D(filters=64, kernel_size=3, activation='relu')) model.add(MaxPooling1D(pool_size=2)) model.add(Flatten()) model.add(Reshape((-1, 64))) # 新增的Reshape层 model.add(LSTM(64)) model.add(Dense(64, activation='relu')) model.add(Dense(2, activation='softmax')) model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy']) return model
seqs, labels = read_fasta('CP015726.fasta') seq_num = seq_to_num(seqs, sequence_length=1000) encoded_labels = encode_labels(labels) X_train, X_test, y_train, y_test = train_test_split(seq_num, encoded_labels, test_size=0.2, random_state=42) model = create_model() history = model.fit(X_train.reshape((-1, 1000, 1)), y_train, epochs=10, batch_size=32, validation_split=0.2) score = model.evaluate(X_test.reshape((-1, 1000, 1)), y_test, verbose=0) print('Test loss:', score[0]) print('Test accuracy:', score[1])
原文地址: https://www.cveoy.top/t/topic/lKSq 著作权归作者所有。请勿转载和采集!