Почему Keras 'fit_generator иногда не вызывает on_epoch_end () для генератора проверочных данных? - PullRequest
1 голос
/ 15 января 2020

Я заметил, что Keras иногда не сможет вызвать метод on_epoch_end() моего keras.utils.Sequence генератора проверочных данных , особенно когда каждый шаг оценки модели быстрый (например, когда размер партии мал ).

Например, вот минимальный рабочий пример, демонстрирующий разницу в поведении Keras при размере пакета 1 и размере пакета 64:

    import numpy as np
    from tensorflow.keras import layers, models
    from tensorflow.keras.utils import Sequence

    FEATURE_SIZE = 512 ** 2


    class DataGenerator(Sequence):

        def __init__(self, batch_size, log=False):
            self.batch_size = batch_size
            self.log = log

        def __len__(self):
            return 1

        def __getitem__(self, i):
            return np.ones((self.batch_size, FEATURE_SIZE)), np.ones((self.batch_size, 1))  # Some dummy data

        def on_epoch_end(self):
            if self.log:
                print('on_epoch_end() called')


    def train(batch_size):
        print('Training with batch_size =', batch_size)
        training_generator = DataGenerator(batch_size)
        test_generator = DataGenerator(batch_size, log=True)

        model = models.Sequential()
        model.add(layers.Dense(4, activation='sigmoid', input_shape=[FEATURE_SIZE]))
        model.add(layers.Dense(1, activation='sigmoid', input_shape=[FEATURE_SIZE]))
        model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])

        model.fit_generator(generator=training_generator, validation_data=test_generator, epochs=5, verbose=0)


    train(batch_size=1)
    train(batch_size=64)

Я получаю вывод:

    Training with batch_size = 1
    on_epoch_end() called

    Training with batch_size = 64
    on_epoch_end() called
    on_epoch_end() called
    on_epoch_end() called
    on_epoch_end() called
    on_epoch_end() called

Из результатов видно, что on_epoch_end() вызывается разное количество раз в зависимости от размера партии.

Это очень проблематично c, поскольку мой генератор данных ожидает, что on_epoch_end() будет надежно вызываться один раз после каждой эпохи.

Кто-нибудь знает, как это исправить?


Я использую версию Keras:

    tensorflow.keras.__version__
    Out[143]: '2.1.6-tf'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...