Загрузка процессора и время до начала обучения на каждой модели ..fit () в Керасе - PullRequest
0 голосов
/ 22 марта 2019

Я создал LSTM с Keras API.Теперь я сталкиваюсь с проблемой, пытаясь проверить в ней разные значения (например, скорость обучения).Каждый раз, когда я меняю свои значения и определяю новую модель, каким-то образом модель занимает все больше и больше времени, пока обучение не начнется, загрузка ЦП во время ожидания будет на уровне 100%.Я делаю что-то не так, чтобы старшая учебная сессия повлияла на новые модели?

Мой код структурирован следующим образом, в одном файле я называю оценку с другими значениями и многими итерациями, например:

for i in range(0, 100):
    acc = model.create(xtrain, ytrain, hidden_units=hidden_size, batch_size=batch_size, learning_rate=learning_rate, l2_reg=l2_reg)

модель - это другой файл.Там я использую переданные значения для обучения новой модели и возвращаю точность, чтобы найти наилучший размер партии и т. Д. Код для создания модели выглядит примерно так:

def create(xtrain, ytrain, hidden_units, batch_size, learning_rate, l2_reg):
    # defining some layers from input to output
    # example: input = Input(shape=(20,)) ...

    # creating the model
    model = Model(inputs=[input], output=[outputs])
    model.compile(optimizer='Adam', loss='binary_crossentropy', metrics=['acc'])

    # calling model.fit
    es = EarlyStopping(monitor='val_loss', mode='min', patience=4, verbose=1)
    model.fit(xtrain, ytrain, epochs=100, batch_size=batch_size, validation_data=(some_xval_data, some_yval_data), callbacks=[es])

    ## In the end I evaluate the model on unseen data and return the accuracy
    loss, acc = model.evaluate(x_testdata, y_testdata, batch_size=batch_size)
    return acc

Теперь каждый раз, когда модель начинает тренироватьсясценарий печатает:

Epoch 1/100

При первых оценочных вызовах модель мгновенно начинает тренироваться, и я вижу время, необходимое для каждого шага.Но через некоторое время, после печати «Эпохи 1/100», внезапно начинается время, пока не начнется тренировка.И время увеличивается от звонка к звонку.Пока он ожидает начала обучения, я могу заметить, что загрузка моего процессора в это время составляет 100%.

Так что, я ошибаюсь при вызове метода каждый раз снова?Есть ли какой-то процесс там старых вызовов "создать" эффект более новых?Я просто надеюсь, что старое обучение не влияет на новое обучение в моей структуре кода?

Ответы [ 2 ]

2 голосов
/ 22 марта 2019

Благодаря @ Федору Петрову и @ desertnaut.

Они обсуждали в комментариях другой ответ, что мне нужно вызвать функцию clear_session:

from keras.backend import clear_session

def create():
    # do all the model stuff
    # evaluate the model
    clear_session() 
    return

Теперь я могу звонить create() столько раз, сколько захочу, без утечек памяти.

0 голосов
/ 22 марта 2019

Взрыв использования памяти во время оценки - уже известная проблема. Повторно обученная оценка модели keras приводит к утечке памяти при вызове в цикле Обычно это замечают, когда оценка выполняется периодически в обратном вызове. В вашем случае вы просто вызываете метод оценки (...) 100 раз, что также достаточно для наблюдения за проблемой.

Поскольку я обучал свои модели в облаке, я "решил" аналогичную проблему, просто увеличив объем ОЗУ экземпляра.

UPD. Это было мое знание некоторое время назад. Результатом плодотворного обсуждения ниже стал следующий ответ (как указано здесь https://github.com/keras-team/keras/issues/2102):

   keras.backend.clear_session()

Запустив это, вы удалите ненужную информацию из вашего tf.Graph

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