Использование оперативной памяти при обучении RNN с устройствами LSTM - PullRequest
2 голосов
/ 22 января 2020

Я следую учебному пособию по рекуррентным нейронным сетям и обучаю RNN, чтобы научиться предсказывать следующую букву из алфавита, учитывая последовательность букв. Проблема в том, что мое использование ОЗУ медленно растет с каждой эпохой, для которой я тренирую сеть. Я не могу закончить sh обучение этой сети, потому что у меня «только» 8192 МБ оперативной памяти, и она исчерпана после + - 100 эпох. Почему это так? Я думаю, что это как-то связано с тем, как работает LSTM, поскольку они хранят некоторую информацию в памяти, но было бы неплохо, если бы кто-то мог объяснить мне некоторые дополнительные детали.

Код, который я использую, относительно прост и полностью самодостаточен (Вы можете скопировать / вставить и запустить его , внешний набор данных не требуется, так как набор данных является просто алфавитом ). Поэтому я включил его в полном объеме, поэтому проблема легко воспроизводима.

Используемая версия тензорного потока - 1.14.

import numpy as np
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import LSTM
from keras.utils import np_utils
from keras_preprocessing.sequence import pad_sequences
np.random.seed(7)

# define the raw dataset
alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"

# create mapping of characters to integers (0-25) and the reverse
char_to_int = dict((c, i) for i, c in enumerate(alphabet))
int_to_char = dict((i, c) for i, c in enumerate(alphabet))

num_inputs = 1000
max_len = 5
dataX = []
dataY = []
for i in range(num_inputs):
    start = np.random.randint(len(alphabet)-2)
    end = np.random.randint(start, min(start+max_len,len(alphabet)-1))
    sequence_in = alphabet[start:end+1]
    sequence_out = alphabet[end + 1]
    dataX.append([char_to_int[char] for char in sequence_in])
    dataY.append(char_to_int[sequence_out])
    print(sequence_in, "->" , sequence_out)

#Pad sequences with 0's, reshape X, then normalize data
X = pad_sequences(dataX, maxlen=max_len, dtype= "float32" )
X = np.reshape(X, (X.shape[0], max_len, 1))
X = X / float(len(alphabet))
print(X.shape)

#OHE the output variable.
y = np_utils.to_categorical(dataY)

#Create & fit the model
batch_size=1
model = Sequential()
model.add(LSTM(32, input_shape=(X.shape[1], 1)))
model.add(Dense(y.shape[1], activation= "softmax" ))
model.compile(loss= "categorical_crossentropy" , optimizer= "adam" , metrics=[ "accuracy" ])
model.fit(X, y, epochs=500, batch_size=batch_size, verbose=2)

1 Ответ

0 голосов
/ 01 февраля 2020

Проблема в том, что ваши последовательности довольно длинные (1000 последовательных входов). Поскольку LSTM-модули поддерживают какое-то состояние в течение эпох, а вы пытаетесь обучить его 500 эпохам (что очень много), особенно когда вы тренируетесь на ЦП, ваша память со временем будет заполнена. Я предлагаю вам попробовать потренироваться на GPU, который посвятил свою память. Также проверьте эту проблему: https://github.com/Element-Research/rnn/issues/5

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