报错:Make sure that your dataset or generator can generate at least `steps_per_epoch * epochs`

日萌社

人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战(不定时更新)


    1.使用repeat() 解决如下报错:
        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, 414 batches). You may need to use the repeat() function 
        when building your dataset.
        警告:tensorflow:输入的数据用完;中断训练。请确保您的数据集或生成器至少可以生成
        “每个steps_per_epoch*epoch”批(在本例中为414 batches)。在构建数据集时,可能需要使用repeat()函数。
        
    2.解决:
		 方式一:
		        如果使用 model.fit(train_dataset, validation_data=test_dataset, steps_per_epoch=M, epochs=N),
		        即同时steps_per_epoch和epochs的话,则要求把训练集和验证集都拷贝N份(epochs份),
		        因为使用了steps_per_epoch之后,每次epoch的遍历是对不同份的训练集和验证集进行遍历,
		        不再是对同一份训练集和验证集进行遍历,因此一开始就要拷贝N份(epochs份)的源训练集和源验证集,
		        供以遍历epoch次。可以使用repeat(epochs)对数据集进行拷贝epochs份。
		 方式二: 
		        如果使用 model.fit(train_dataset, validation_data=test_dataset, epochs=N),
               只使用了epochs的话,那么每次epoch的遍历都是对同一份训练集和验证集进行遍历,便不需要把训练集和验证集都拷贝N份(epochs份),
               其中steps_per_epoch值不需要传入,即会在第一次epoch的遍历中自动计算steps_per_epoch值。
               
    3.例子:batch、repeat、steps_per_epoch、epochs的使用
            1.先用 batch(批次大小) 然后才用 repeat(重复次数),
              比如:repeat(2)重复数据集2次,即复制一份数据集,最终即有两份数据集。
            2.steps_per_epoch 即表示 一个epoch 里面遍历批量数据的次数,即遍历多少个批量数据完成一个epoch。
            3.应保证要输入到模型的数据集(包括训练集/验证集)的批量个数都均为steps_per_epoch*epoch。

            4.fit中没有定义steps_per_epoch,只定义了epochs的话,那么只会对同一份数据集进行遍历epochs次进行训练。
              如果fit中同时有传训练集和验证集validation_data进行训练/验证的话,那么均为对同一份训练集和验证集进行遍历epochs次进行训练/验证。
              打印的训练信息格式如下:当前步数step/总步数steps - ETA:剩余训练时间  - loss - accuracy
              
            5.fit中同时定义了steps_per_epoch和epochs的话,那么表示对数据集进行遍历epochs次进行训练,并且每个epoch中遍历steps_per_epoch个批量数据。
              但要注意的是此处所说的对数据集进行遍历epochs次指的不是对同一份数据集遍历epochs次,而是对epochs份数据集遍历epochs次,
              而每份数据集遍历1次,因此需要对原始数据集拷贝epochs份,才能每份数据集遍历1次,一共遍历epochs次进行训练。
              如果fit中同时有传训练集和验证集validation_data进行训练/验证的话,那么同时要把训练集和验证集validation_data都拷贝epochs份。
              可以使用repeat(epochs)对数据集进行拷贝epochs份。
              第一个epoch打印的训练信息格式如下:
                当前步数step/Unknown - ETA:剩余训练时间  - loss: - accuracy: 
              第一个epoch之后的每个epoch打印的训练信息格式如下:(因为经过第一个epoch之后底层就已经计算好每个epoch需要遍历多少个批量数据,即得出总步数steps) 
                当前步数step/总步数steps - ETA:剩余训练时间  - loss - accuracy
        
    4.使用顺序:from_tensor_slices -> map -> shuffle -> batch -> repeat -> prefetch
发布了389 篇原创文章 · 获赞 129 · 访问量 21万+

猜你喜欢

转载自blog.csdn.net/zimiao552147572/article/details/105033835