我有一个包含19个元素的数据集,批次大小为10。我将dataset设置为继续迭代相同的元素,但我注意到最后一批只有4个元素,而不是5个,然后从5、5、5、4开始,等等。
如何才能强迫迭代器用来自下一次迭代的元素填充较短的批,从而使所有批具有相同的大小?
P.S.只是想了解一下,这难道不是训练模特时的明显行为吗?
发布于 2018-11-20 08:36:51
要具有这种行为,.repeat()方法应该在batch()或padded_batch()方法之前调用。所以:
file_names = [...]
def my_map_func(record):
....
dataset = tf.data.TFRecordDataset(file_names)\
.map(map_func=my_map_func)\
.repeat()\ # here!
.batch(5)发布于 2019-10-06 17:59:15
为了扩展repeat和batch的使用,我将这样说。实际上,如果您想要一个固定的.repeat(),那么放置batch_size的位置并不重要。如果在drop_remainder=True中设置.batch(),那么在第一个维度中就不会得到None,那么无论.repeat()的位置如何,您都会得到一个固定的批大小。重复和批处理非常直观地使用,例如,让我们定义4个数据集,改变批处理和重复的位置:
import tensorflow as tf
dataset = tf.data.Dataset.range(3)
dataset1 = dataset.batch(2,drop_remainder=True)
dataset1 = dataset1.repeat()
dataset2 = dataset.repeat()
dataset2 = dataset2.batch(2,drop_remainder=True)
dataset3 = dataset.repeat()
dataset3 = dataset3.batch(2)
dataset4 = dataset.batch(2)
dataset4 = dataset4.repeat()您将得到这样的结果:
Dataset1:注意2从来不在任何批处理中
Dataset2:这就是你想要做的事情。注意现在2在第二批中的情况。
repeat的位置也不一样。Dataset3:
drop_remainder=True,所以您将得到一个None,但是您将得到批总是固定大小为2的。Dataset4
https://stackoverflow.com/questions/53382769
复制相似问题