Утечка памяти тренировки модели Keras - PullRequest
0 голосов
/ 27 сентября 2019

Я новичок в Keras, Tensorflow, Python и пытаюсь создать модель для личного использования / будущего обучения.Я только начал с Python и придумал этот код (с помощью видео и учебных пособий).Моя проблема в том, что использование Python в моей памяти медленно нарастает с каждой эпохой и даже после создания новой модели.Как только память на 100%, тренировка просто останавливается без ошибок и предупреждений.Я не знаю слишком много, но проблема должна быть где-то в цикле (если я не ошибаюсь).Я знаю о

k.clear.session ()

, но либо проблема не была устранена, либо я не знаю, как интегрировать ее в мой код.У меня есть: Python v 3.6.4, Tensorflow 2.0.0rc1 (версия для процессора), Keras 2.3.0

Это мой код:

import pandas as pd
import os
import time
import tensorflow as tf
import numpy as np
import keras
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout, LSTM, BatchNormalization
from tensorflow.keras.callbacks import TensorBoard, ModelCheckpoint

EPOCHS = 25
BATCH_SIZE = 32           

df = pd.read_csv("EntryData.csv", names=['1SH5', '1SHA', '1SA5', '1SAA', '1WH5', '1WHA',
                                         '2SA5', '2SAA', '2SH5', '2SHA', '2WA5', '2WAA',
                                         '3R1', '3R2', '3R3', '3R4', '3R5', '3R6',
                                         'Target'])

df_val = 14554 

validation_df = df[df.index > df_val]
df = df[df.index <= df_val]

train_x = df.drop(columns=['Target'])
train_y = df[['Target']]
validation_x = validation_df.drop(columns=['Target'])
validation_y = validation_df[['Target']]

train_x = np.asarray(train_x)
train_y = np.asarray(train_y)
validation_x = np.asarray(validation_x)
validation_y = np.asarray(validation_y)

train_x = train_x.reshape(train_x.shape[0], 1, train_x.shape[1])
validation_x = validation_x.reshape(validation_x.shape[0], 1, validation_x.shape[1])

dense_layers = [0, 1, 2]
layer_sizes = [32, 64, 128]
conv_layers = [1, 2, 3]

for dense_layer in dense_layers:
    for layer_size in layer_sizes:
        for conv_layer in conv_layers:
            NAME = "{}-conv-{}-nodes-{}-dense-{}".format(conv_layer, layer_size, 
                    dense_layer, int(time.time()))
            tensorboard = TensorBoard(log_dir="logs\{}".format(NAME))
            print(NAME)

            model = Sequential()
            model.add(LSTM(layer_size, input_shape=(train_x.shape[1:]), 
                                       return_sequences=True))
            model.add(Dropout(0.2))
            model.add(BatchNormalization())

            for l in range(conv_layer-1):
                model.add(LSTM(layer_size, return_sequences=True))
                model.add(Dropout(0.1))
                model.add(BatchNormalization())

            for l in range(dense_layer):
                model.add(Dense(layer_size, activation='relu'))
                model.add(Dropout(0.2))

            model.add(Dense(2, activation='softmax'))

            opt = tf.keras.optimizers.Adam(lr=0.001, decay=1e-6)

            # Compile model
            model.compile(loss='sparse_categorical_crossentropy',
                          optimizer=opt,
                          metrics=['accuracy'])

            # unique file name that will include the epoch 
            # and the validation acc for that epoch
            filepath = "RNN_Final.{epoch:02d}-{val_accuracy:.3f}"  
            checkpoint = ModelCheckpoint("models\{}.model".format(filepath, 
                         monitor='val_acc', verbose=0, save_best_only=True, 
                         mode='max')) # saves only the best ones

            # Train model
            history = model.fit(
                train_x, train_y,
                batch_size=BATCH_SIZE,
                epochs=EPOCHS,
                validation_data=(validation_x, validation_y),
                callbacks=[tensorboard, checkpoint])

# Score model
score = model.evaluate(validation_x, validation_y, verbose=2)
print('Test loss:', score[0])
print('Test accuracy:', score[1])
# Save model
model.save("models\{}".format(NAME))

Также я не знаю, если этоВозможно задать 2 проблемы в рамках одного вопроса (я не хочу спамить здесь со своими проблемами, которые любой с любым опытом работы с Python может решить в течение минуты), но у меня также есть проблема с сохранением контрольной точки.Я хочу сохранить только наиболее эффективную модель (1 модель на 1 NN спецификацию - количество узлов / слоев), но в настоящее время она сохраняется после каждой эпохи.Если это неуместно, я могу создать для этого еще один вопрос.

Большое спасибо за любую помощь.

1 Ответ

0 голосов
/ 27 сентября 2019

Одним из источников проблемы является то, что новый цикл model = Sequential() не не удаляет предыдущую модель;он остается встроенным в область действия графа TensorFlow, и каждый новый model = Sequential() добавляет еще одну устаревшую конструкцию, которая в конечном итоге переполняет память.Чтобы убедиться, что модель полностью уничтожена, запустите ниже, как только закончите с моделью:

import gc
del model
gc.collect()
K.clear_session()

gc - это модуль Python для сборки мусора, который очищает остатки model после del.K.clear_session() является основным вызовом и очищает график TensorFlow.

Кроме того, хотя ваша идея для определения контрольных точек модели, ведения журнала и поиска гиперпараметров вполне обоснована, она довольно ошибочно выполнена;на самом деле вы будете тестировать только одну комбинацию гиперпараметров для всего настроенного вами вложенного цикла.Но об этом следует спросить в отдельном вопросе.

...