Во время обучения моей сети LSTM с использованием 100 000 предложений (в форме списка) в Google Colab. Моя программа падает из-за ошибки «Недостаточно памяти».
Чтобы решить эту проблему, я создал функцию «Генератор», которая делит список предложений по 100 тыс. На 5 партий по 20 000 предложений, а затем обучает эти партии с помощью функции модели Keras model.fit_generator
. Но снова при загрузке второй партии из 20 000 предложений Google Colab вылетает и перезапускается, показывая «Ошибка нехватки памяти».
Моя модель предсказывает нормально, когда тренируется на 20000 предложений с использованием функции model.fit
.
В ходе анализа ошибок я обнаружил, что при создании np.array
на to_categorical
для второго пакета из 20 000 предложений происходит сбой программы. Как и предыдущий массив пакета 1, находится в памяти.
Для 20 000 предложений он использует 13 ГБ ОЗУ графического процессора на Colab.
Функция генератора:
def generator():
start = 0
end = 0.20
while (end <= 1):
sentences = sentence_list[int(len(sentence_list)*start):int(len(sentence_list)*end)]
tokens = []
print("Total Number of sentences passed : ", len(sentences))
print("sentences are : ", sentences[:30])
for sentence in sentences:
words = sentence.split(" ")
tokens += words
start += 0.20
end += 0.20
train_len = 3+1
text_sequences = []
for i in range(train_len,len(tokens)):
seq = tokens[i-train_len:i]
text_sequences.append(seq)
sequences = {}
count = 1
for i in range(len(tokens)):
if tokens[i] not in sequences:
sequences[tokens[i]] = count
count += 1
tokenizer = Tokenizer()
tokenizer.fit_on_texts(text_sequences)
sequences = tokenizer.texts_to_sequences(text_sequences)
#Collecting some information
unique_words = tokenizer.index_word
unique_wordsApp = tokenizer.word_counts
#vocabulary_size = len(tokenizer.word_counts)
print("vocabulary_size: ", vocabulary_size)
n_sequences = np.empty([len(sequences),train_len], dtype='float32')
for i in range(len(sequences)):
n_sequences[i] = sequences[i]
#print("n_sequences: ", n_sequences)
train_inputs = n_sequences[:,:-1]
train_targets = n_sequences[:,-1]
#print("train_inputs =", train_inputs)
print("train_targets =", train_targets)
train_targets = to_categorical(train_targets, num_classes=vocabulary_size+1, dtype='float32')
print("to_categorical Done")
seq_len = train_inputs.shape[1]
train_inputs.shape
yield train_inputs, train_targets
train_inputs = None
train_targets = None
print("DONE")
Создание и обучение модели:
training_generator = generator()
checkpoint = ModelCheckpoint('one_lac_word_pred_Model4.h5', monitor='loss', verbose=1, save_best_only=True, mode='min')
print("DONE TILL CHECKPOINT")
model.fit_generator(generator=training_generator, steps_per_epoch = 1, epochs=500, verbose=1, callbacks=[checkpoint], workers=0)
print("MODEL FITTING DONE")
model.save('one_lac_word_pred_Model4.h5')
dump(tokenizer,open('one_lac_tokenizer_Model4','wb'))
Я не могу найдите решение, как продолжать генерировать пакеты, сохраняя при этом свободную память после каждого пакета.