有没有一种方法可以加快tf.keras中的嵌入层?

时间:2019-10-17 22:15:21

标签: python tensorflow machine-learning keras deep-learning

我正在尝试为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

任何帮助将不胜感激-经过大量的搜索和反复试验,我似乎无法加快这一步。

1 个答案:

答案 0 :(得分:0)

可能的建议是使用“便宜”的RNN,例如SimpleRNN而不是LSTM。它需要训练的参数较少。在一些简单的测试中,我的LSTM速度提高了约3倍,并且嵌入处理与您目前使用的相同。不知道是否可以将序列长度从1000减少到较小的数字,但这也可能是探索的方向。我希望这会有所帮助。