Есть ли способ ускорить встраивание слоя в tf.keras? - PullRequest
2 голосов
/ 18 октября 2019

Я пытаюсь реализовать модель LSTM для классификации последовательностей ДНК, но на данный момент она непригодна для использования из-за того, как много времени занимает тренировка (25 секунд на эпоху на 6,5 тыс. Последовательностей, около 4 мс на образец, и нам нужнообучить несколько версий модели более 100 тысячам последовательностей).

Последовательность ДНК может быть представлена ​​в виде строки A, C, G и T, например, «ACGGGTGACAT» может быть примером одногоПоследовательность ДНК. Каждая последовательность принадлежит к одной из двух категорий, которые я пытаюсь предсказать, и каждая последовательность содержит 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 голосов
/ 18 октября 2019

Возможным предложением является использование «более дешевого» RNN, такого как SimpleRNN, вместо LSTM. У него меньше параметров для тренировки. В некотором простом тестировании я получил ~ 3-кратное ускорение по сравнению с LSTM с той же обработкой встраивания, что и сейчас. Не уверен, что вы можете уменьшить длину последовательности с 1000 до меньшего числа, но это может быть и направление для изучения. Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...