Керас: Генератор заканчивает данные при запуске второй эпохи - PullRequest
0 голосов
/ 29 мая 2020

У меня есть следующий генератор:

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 раз, но для этого потребуется много памяти, и должен быть способ сказать ему перезапускать генератор на каждой итерации, но я не знаю как.

1 Ответ

2 голосов
/ 29 мая 2020

Генератор останавливается в конце l oop. Чтобы просто повторить данные, оберните for l oop через некоторое время l oop:

def customGenerator(generator, indexes):

    while True:

        indexes = np.random.shuffle(indexes) # reshuffle every new epoch

        for i in indexes:
            x,y = generator[i]
            yield (np.squeeze(x), 
                    {'outputsA': y[:,4:6], 'outputsB': y[:,11:], 
                    'outputsC': y[:,10]} )
...