我正在尝试为DNA序列分类实现LSTM模型,但是目前尚无法使用,因为训练需要多长时间(6.5K序列上每个周期25秒,每个样本大约4ms,我们需要来训练数以十万计的序列的多个版本的模型。
DNA序列可以表示为A,C,G和T的字符串,例如“ ACGGGTGACAT”可以是单个DNA序列的例子。每个序列属于我要预测的两个类别之一,每个序列包含1000个字符。最初,我的模型不包含Embedding层,而是我将每个序列手动转换为一个热编码的矩阵(4行乘1000列),该模型虽然效果不佳,但速度却非常快。在这一点上,尽管我已经在网上看到使用嵌入层具有明显的优势。因此,我添加了一个嵌入层,而不是使用单热编码矩阵,而是将序列转换为整数,每个字符由一个不同的整数表示。
实际上,该模型现在工作得更好,但是它慢了大约30倍,无法使用。我可以在这里做些什么来加快嵌入层的速度吗?
以下是构建和拟合模型的功能:
from tensorflow.keras.layers import Embedding, Dense, LSTM, Activation
from tensorflow.keras import Sequential
from tensorflow.keras.optimizers import Adam
from tensorflow.keras.utils import to_categorical
def build_model():
# initialize a sequential model
model = Sequential()
# add embedding layer
model.add(Embedding(5, 1, input_length=1000, mask_zero=True))
# Add LSTM layer
model.add(
LSTM(5)
)
# Add Dense NN layer
model.add(
Dense(units=2)
)
model.add(Activation('softmax'))
optimizer = Adam(clipnorm=1.)
model.compile(
loss="categorical_crossentropy", optimizer=optimizer, metrics=['accuracy']
)
return model
def train_model(X_train, y_train, epochs, batch_size):
model = build_model()
# y_train is initially a list of zeroes and ones, needs to be converted to categorical
y_train = to_categorical(y_train)
history = model.fit(
X_train, y_train, epochs=epochs, batch_size=batch_size
)
return model, history
任何帮助将不胜感激-经过大量的搜索和反复试验,我似乎无法加快这一步。
答案 0 :(得分:0)
可能的建议是使用“便宜”的RNN,例如SimpleRNN而不是LSTM。它需要训练的参数较少。在一些简单的测试中,我的LSTM速度提高了约3倍,并且嵌入处理与您目前使用的相同。不知道是否可以将序列长度从1000减少到较小的数字,但这也可能是探索的方向。我希望这会有所帮助。