Я заметил, что 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'