dataset.repeat()与model.fit()协同机制及单轮训练样本数疑问
关于TensorFlow中dataset.repeat()与model.fit()协同的epoch样本量问题
你的代码里,训练一轮(epoch)输入模型的样本数量会是53050(1061×50),这是因为你同时在数据集层面和model.fit()里设置了重复逻辑,两者叠加导致了这个结果,具体原因如下:
dataset.repeat(epochs)会把原1061个样本的数据集重复50次,生成一个总样本量为1061×50=53050的“超长数据集”。- 当你把处理好的
tf.data.Dataset传入model.fit()时:fit的epochs参数表示要遍历传入的数据集多少次;- 此时
fit里的batch_size参数会被忽略——因为你已经通过dataset.batch(batch_size)指定了批次大小。
所以当前代码的逻辑是:model.fit()会遍历这个重复50次的数据集50次,每个fit定义的epoch都会处理53050个样本,这显然不符合常规训练逻辑。
正确的两种做法
方式1:让model.fit()控制训练轮次
不在数据集上做repeat,把轮次控制交给fit的epochs参数:
epochs = 50 batch_size = 20 dataset = dataset.batch(batch_size) model.fit(dataset, epochs=epochs)
此时每个epoch会遍历原数据集的1061个样本,总共完成50轮训练,总处理样本量为1061×50。
方式2:用dataset.repeat()控制训练轮次
在数据集上做repeat,同时把fit的epochs设为1:
epochs = 50 batch_size = 20 dataset = dataset.repeat(epochs).batch(batch_size) model.fit(dataset, epochs=1)
这种方式下,fit只遍历一次重复50次的数据集,效果和方式1完全一致,每个逻辑训练轮次对应原数据集的1061个样本。
内容的提问来源于stack exchange,提问作者Ahmed
相关产品推荐
相关产品推荐

