У меня есть следующий генератор:
def customGenerator(generator, indexes):
for i in indexes:
x,y = generator[i]
yield (np.squeeze(x),
{'outputsA': y[:,4:6], 'outputsB': y[:,11:],
'outputsC': y[:,10]} )
, а затем строки для обучения модели (я опускаю некоторые строки, которые не имеют отношения к проблеме):
randomize = np.arange( len(generator) )
np.random.shuffle(randomize)
trainLimit = int( 0.9*len(generator) )
model.fit(x = customGenerator(generator, randomize[:trainLimit]), y = None,
validation_data = customGenerator(generator, randomize[trainLimit:]),
epochs=1000, steps_per_epoch = trainLimit)
Установка steps_per_epoch значение None (или просто удаление этого аргумента) вызывает ту же ошибку.
Этот код хорошо работает в течение первой эпохи, но затем при запуске второй эпохи он сообщает, что закончились данные:
Epoch 1/1000
2534/2534 [==============================] - 1124s 443ms/step - loss: 20.3274 - outputsA_loss: 8.2611 - outputsB_loss: 11.8572 - outputsC_loss: 0.2091 - val_loss: 11.4947 - val_outputsA_loss
: 3.3958 - val_outputsB_loss: 7.9044 - val_outputsC_loss: 0.1945
Epoch 2/1000
WARNING:tensorflow:Your input ran out of data; interrupting training. Make sure that your dataset or generator can generate at least `steps_per_epoch * epochs` batches (in this case, 2534000
batches). You may need to use the repeat() function when building your dataset.
Это предупреждение не просто предупреждение, оно полностью останавливает выполнение.
кажется, что оно проходит через генератор только один раз, хотя я думал, что он будет перезапускать генератор каждую эпоху.
Я действительно не знаю, как это сделать.
Я мог бы создать входной массив, который представляет собой исходные данные, повторяемые 1000 раз, но для этого потребуется много памяти, и должен быть способ сказать ему перезапускать генератор на каждой итерации, но я не знаю как.