Это зависит от того, какой генератор вы используете.
Если это keras.utils.Sequence
(стандартный генератор Keras, который вы получаете с ImageDataGenerator
и такие методы, как flow_from_dataframe
, flow
et c.), Они имеют свойство len
и могут их партии получают по индексу.
Итак, для них вы создаете массив индексов:
batches = len(val_generator)
indices = np.arange(batches)
Затем вы можете создать свой собственный генератор Python :
def my_gen(val_generator):
batches = len(val_generator)
indices = np.arange(batches)
while True: #these non standard generators using "yield" must be infinite
#shuffle the batches
np.random.shuffle(indices)
#iterate the indices:
for i in indices:
yield val_generator[i]
Подходит для вашего нового "неприкасаемого" генератора. Keras не может запустить его заново, потому что эта опция не существует.
model.fit(.... validation_data = my_gen(val_generator), validation_steps = choose)
Если это уже генератор Python (который использует yield
), вы можете быть уверены, что Keras не сбросить это невозможно Это специальный генератор, и все, что вам нужно, это перемешивать ваши данные каждый цикл, как описано выше. Но вместо того, чтобы перетасовывать все данные, перетасуйте индексы. Примерно так же, как я делал выше, но вместо того, чтобы получать от генератора Keras, получайте данные.
def my_gen(dataX, dataY, batch_size):
samples = len(dataX)
indices = np.arange(samples)
batches = samples // batch_size
if samples % batch_size > 0:
batches += 1
while True:
np.random.shuffle(indices)
for b in range(batches):
start = b * batch_size
end = (b+1) * batch_size
batchX = dataX[indices[start:end]]
batchY = dataY[indices[start:end]]
yield batchX, batchY