【问题标题】:Keras: Generator runs out of data when starting second epochKeras:生成器在开始第二个时期时用完了数据
【发布时间】:2020-09-17 02:35:12
【问题描述】:

我有以下生成器:

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 运行良好,但在开始第二个 epoch 时它说它用完了数据:

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. 

这个警告不仅仅是一个警告,它会完全停止执行。

它似乎只运行一次生成器,而我认为它会在每个 epoch 重新启动生成器。

我真的不知道该怎么做。

我可以创建一个输入数组,它是重复 1000 次的原始数据,但这会占用大量内存,并且必须有一种方法告诉它在每次迭代中重新启动生成器,但我没有不知道怎么做。

【问题讨论】:

    标签: python tensorflow keras generator


    【解决方案1】:

    生成器在 for 循环结束时停止。要简单地重复数据,请将 for 循环包装在 while 循环中:

    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]} )
    

    【讨论】:

    • 我建议在 for 循环之前执行训练集示例的洗牌(根据每个时期)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-09
    • 2020-10-08
    • 1970-01-01
    • 1970-01-01
    • 2021-04-04
    相关资源
    最近更新 更多