Я пытаюсь реализовать модель 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
Любая помощь будет принята с благодарностью - после долгих поисков. и методом проб и ошибок, я не могу ускорить это.