我正在阅读English-to-Spanish translation with a sequence-to-sequence Transformer教程。
def make_dataset(pairs, batch_size=64):
eng_texts, fra_texts = zip(*pairs)
eng_texts = list(eng_texts)
fra_texts = list(fra_texts)
dataset = tf.data.Dataset.from_tensor_slices((eng_texts, fra_texts))
dataset = dataset.batch(batch_size)
dataset = dataset.map(format_dataset, num_parallel_calls=4)
return dataset.shuffle(2048).prefetch(AUTOTUNE).cache()
特别是在dataset.shuffle(2048).prefetch(16).cache()
行中
我的问题:
1.据我所知,这里的2048
将是存储在缓冲区中的数据点的数量,而不是批处理,但将对批处理进行 Shuffle ,对吗?
prefetch(16)
。要预取的批数,对吗?
编辑:3.map
是在每次从数据集获取时应用于批处理,还是只在训练期间第一次应用。
1条答案
按热度按时间dxxyhpgq1#
问题1
应用
Dataset.shuffle()
和Dataset.batch()
转换的顺序可能会对结果数据集产生影响:Dataset.batch()
之前应用Dataset.shuffle()
:Dataset.batch()
之前应用Dataset.shuffle()
时,将对数据集的各个元素应用混洗操作。这意味着每个批次中元素的顺序是随机的,但批次本身保持不变。Dataset.batch()
之后应用Dataset.shuffle()
:Dataset.batch()
之后应用Dataset.shuffle()
时,将对整个批次而不是单个元素应用混洗操作。问题二
应用
Dataset.prefetch()
和Dataset.batch()
转换的顺序可能会影响数据集的行为和性能:Dataset.batch()
之前应用Dataset.prefetch()
:Dataset.batch()
之前应用Dataset.prefetch()
时,将对数据集的各个元素执行预取操作。这意味着在模型处理当前批元素的同时,在后台获取和准备下一批元素。Dataset.batch()
之后应用Dataset.prefetch()
:Dataset.batch()
之后应用Dataset.prefetch()
时,预取操作将对整个数据批执行,而不是对单个元素执行。问题三
如果您想应用一次转换并在多个epoch中重用它,则可以使用
cache()
方法显式缓存转换后的数据集。这允许将转换后的数据集存储在内存或磁盘上,并在后续时期中重用,而无需重新计算转换。