Можно ли взломать ввод / вывод keras.fit_generator, чтобы остановить процесс проверки / изменения STATE с Sl + на Rl? - PullRequest
0 голосов
/ 20 мая 2019

Я тренировал свою модель глубокого обучения в течение 25 часов в 1 эпоху, после чего проверка не завершилась через 25 часов. Я хотел бы как-то сохранить модель.

Мои процессы следующие:

aksel    14135 40.6 26.8 43304288 17717160 pts/19 Sl+ May18 1292:38 python generator_main.py v31 v29
aksel    14312  0.0  2.3 20212124 1561936 pts/19 S+ May18   0:06 python generator_main.py v31 v29
aksel    14313  0.0  0.9 19311000 638528 pts/19 S+  May18   0:18 python generator_main.py v31 v29
aksel    14315  0.0  0.9 19311000 638528 pts/19 S+  May18   0:24 python generator_main.py v31 v29
aksel    14316  0.0  1.0 19311000 681516 pts/19 S+  May18   0:17 python generator_main.py v31 v29
aksel    25467  0.7 12.8 34743884 8448060 pts/19 S+ May19  14:38 python generator_main.py v31 v29
aksel    25468  0.7 12.8 34743884 8450772 pts/19 S+ May19  14:47 python generator_main.py v31 v29
aksel    25469  0.7 12.8 34743884 8462988 pts/19 S+ May19  14:36 python generator_main.py v31 v29
aksel    25470  0.7 12.8 34743884 8485316 pts/19 S+ May19  14:33 python generator_main.py v31 v29

Строка, на которой он застрял:

hist = s2_model.model.fit_generator(generator=training_generator,
                validation_data=validation_generator,
                **fit_params,
)

fit_params:

fit_params = {
'workers':4,
'class_weight':class_weights,
'max_queue_size':8,
'epochs':1,
'steps_per_epoch':40000,
'use_multiprocessing':True,
'callbacks':[EarlyStopping(**early_stopping_params),stop_cb],
}

Могу ли я как-то отправить сигнал об остановке этой строки и переходе к следующей строке, чтобы сохранить модель?

1 Ответ

0 голосов
/ 20 мая 2019

После нескольких часов чтения исходного кода keras я сдался и сделал ошибку в keras Github. https://github.com/keras-team/keras/issues/12840

Просто тренируйся снова, на этот раз умнее. Проблема в том, что обратный вызов Checkpoint работает только с эпохами. И моя эпоха заняла 25 часов:)

Решение состоит в том, чтобы сделать обработчик сигнала:

Вот мой код для пользовательского обратного вызова, который останавливает обучение и сохраняет мою модель, нажав CTRL + Z:

class SignalStopping(keras.callbacks.Callback):
'''Stop training when an interrupt signal (or other) was received
    # Arguments
    sig: the signal to listen to. Defaults to signal.SIGTSTP.
    doubleSignalExits: Receiving the signal twice exits the python
        process instead of waiting for this epoch to finish.
    patience: number of epochs with no improvement
        after which training will be stopped.
    verbose: verbosity mode.
'''
# SBW 2018.10.15 Since ctrl-c trapping isn't working, watch for existence of file, e.g. .\path\_StopTraining.txt.
def __init__(self, sig=signal.SIGTSTP, doubleSignalExits=False, verbose=1):
    super(SignalStopping, self).__init__()
    self.signal_received = False
    self.verbose = verbose
    self.doubleSignalExits = doubleSignalExits
    def signal_handler(sig, frame):
        self.model.stop_training = True
        #if self.signal_received and self.doubleSignalExits:
        #    if self.verbose > 0:
        #        print('') #new line to not print on current status bar. Better solution?
        #        print('Received signal to stop ' + str(sig)+' twice. Exiting..')
        #    exit(sig)
        #self.signal_received = True
        #if self.verbose > 0:
        #    print('') #new line to not print on current status bar. Better solution?
        #    print('Received signal to stop: ' + str(sig))
    signal.signal(signal.SIGTSTP, signal_handler)
    self.stopped_epoch = 0

def on_epoch_end(self, epoch, logs={}):
    if self.signal_received:
        self.stopped_epoch = epoch
        self.model.stop_training = True
        print("stop_training=true")

def on_train_end(self, logs={}):
    print("on_train_end")
    if self.stopped_epoch > 0 and self.verbose > 0:
        print('Epoch %05d: stopping due to signal' % 

(self.stopped_epoch))

И я называю это с:

stop_cb = SignalStopping()

Затем поместите его в список обратных вызовов, который передается в fit_generator.

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