Не удалось записать историю модели в файл json в конце 2-й эпохи обучения keras fit_generator - PullRequest
1 голос
/ 28 мая 2019

Я использую настроенный обратный вызов для сохранения параметров истории модели (потери, акк и т. Д.) В файле json on_epoch_end.Я использовал keras fit_generator для обучения данных.В конце 1-й эпохи все работает нормально, и я могу получить файл json с параметрами.Однако после 2-й эпохи я всегда сталкиваюсь с длинной ошибкой, заканчивающейся «TypeError: Объект типа 'float32' не является сериализуемым JSON".Я очень запутался, потому что история модели - это словарь.

Я попытался: 1) изменить json.dumps на json.dump.Но та же ошибка в конце 2-й эпохи 2) Я закомментировал часть файла json и добавил код «print (self.H)» в мой класс обратного вызова.Оно работает.К каждому концу эпохи словарь истории модели может быть распечатан, и мое обучение может быть завершено без ошибок.3) я использую lr decay.Одним из наблюдений является то, что в словаре истории модели для 1-й эпохи нет параметра "lr", а параметр "lr" будет добавлен со 2-й эпохи для словаря истории.

class TrainingMonitor(BaseLogger):
    def __init__(self, figPath, jsonPath=None, startAt=0):
        # store the output path for the figure, the path to the JSON
        # serialized file, and the starting epoch
        super(TrainingMonitor, self).__init__()
        self.figPath = figPath
        self.jsonPath = jsonPath
        self.startAt = startAt

    def on_train_begin(self, logs={}):
        # initialize the history dictionary
        self.H = {}

    def on_epoch_end(self, epoch, logs={}):
        # loop over the logs and update the loss, accuracy, etc.
        # for the entire training process
        for (k, v) in logs.items():
            l = self.H.get(k, [])
            l.append(v)
            self.H[k] = l

        # check to see if the training history should be serialized to the file
        if self.jsonPath is not None:
            f = open(self.jsonPath, "w")
            f.write(json.dumps(self.H))
            f.close()

1 Ответ

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

проблема решена путем изменения «l.append (v)» на «l.append (float (v))».Ошибка заключается в том, что тип данных "lr" - numpy.float32, и кодировщик json может не иметь возможности его кодировать.Ниже показано, что тип данных был изменен на собственный тип с плавающей точкой Python, поэтому нет проблем с записью в json.

acc <class 'numpy.float64'>

acc <class 'float'>

lr <class 'numpy.float32'>

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