Как написать собственный обратный вызов для сохранения модели в каждую эпоху, если точность проверки была улучшена по сравнению с предыдущей эпохой - PullRequest
0 голосов
/ 24 января 2020

Ниже моя пользовательская функция обратного вызова, которую я написал, но она не работает:

class bestval(tf.keras.callbacks.Callback):
    def on_train_begin(self, logs={}):
        self.history={'loss': [],'acc': [],'val_loss': [],'val_acc': []}

    def on_epoch_end(self, epoch, logs={}):
        #appending val_acc in history
        if logs.get('val_acc', -1) != -1:
            self.history['val_acc'].append(logs.get('val_acc'))
        # Trying to compare current epoch val_acc with all the values in self.history['val_acc']
        if logs.get('val_acc')> [i for i in self.history['val_acc']]:
            filepath="model_save/weights-{epoch:02d}-{val_acc:.4f}.hdf5"
            # Saving the model using TF built-in callback 
            checkpoint = tensorflow.keras.callbacks.ModelCheckpoint(filepath=filepath, 
            monitor='val_acc',  verbose=1, mode='auto')
bestobj= bestval()

Подгонка модели:

model.fit(xtr,ytr, epochs=4, validation_data=(xte,yte), batch_size=128, callbacks=[bestobj])

Когда я запускаю вышеупомянутое, я получаю следующее ошибка:

ValueError: Значение истинности массива с более чем одним элементом является неоднозначным. Используйте a.any () или a.all ()

Я знаю, что делаю глупости, но не знаю, как это исправить. Любая помощь будет оценена.

1 Ответ

1 голос
/ 24 января 2020

Я предполагаю, что ошибка в следующей строке, вы пытаетесь сравнить значение со списком. if logs.get('val_acc')> [i for i in self.history['val_acc']]:

попробуй, for i in self.history['val_acc']: if logs.get('val_acc')>i: #your code

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