Ошибка нехватки памяти при использовании генератора в fit_generator - PullRequest
0 голосов
/ 24 марта 2020

Во время обучения моей сети 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'))

Я не могу найдите решение, как продолжать генерировать пакеты, сохраняя при этом свободную память после каждого пакета.

...