洗牌后,Tensorflow 数据集是否在数据集转换的时期之间洗牌?
Does Tensorflow Dataset shuffle between epochs with Dataset transforms after shuffle?
我在 TensorFlow 管道上工作,我将一堆信号加载到数据集中,我随机播放这些信号,然后对信号进行窗口化,然后进行批处理和重复。此数据集用于通过 model.fit 函数调用训练 tf.keras 模型。信号的 windows 不打乱非常重要,这就是数据集转换顺序的原因。
我想知道信号的顺序是否会在时期之间打乱?我发现 dataset.shuffle().batch().repeat()
会在时期之间随机播放数据集,但这对我的应用程序不起作用,因为我需要在随机播放后进行窗口化和其他转换。
我正在使用 TensorFlow 版本 1.13.1。
#... some pre-processing on the signals
signalList = [...] # a list of tuples (data, label)
dataset = tf.data.Dataset.from_generator(lambda: signalList)
dataset = dataset.shuffle(buffer_size=self.buffer_size) ## will this shuffle be repeated??
dataset = dataset.map(...) # windowing and other transforms
dataset = dataset.batch()
dataset = dataset.repeat()
model.fit(dataset, ...)
编辑:我感兴趣的行为是我希望信号的顺序在每个时期都重新洗牌。所以,如果我有 3 个信号
signal0=[window0_0,window0_1]
signal1=[window1_0,window1_1,window1_2]
signal2=[window2_0]
那么输出将如下所示:
tf.Tensor([signal0,signal2,signal1],...) # equivalent to tf.Tensor([window0_0,window0_1,window2_0,window1_0,window1_1,window1_2])
tf.Tensor([signal1,signal0,signal2],...) # equivalent to tf.Tensor([window1_0,window1_1,window1_2,window0_0,window0_1,window2_0])
转换 datset.map(windowing).shuffle().batch().repeat() 会产生类似这样的东西(我对此不感兴趣)
tf.Tensor([window0_1,window1_1,window2_0,window1_0,window0_0,window1_2])
tf.Tensor([window0_0,window1_2,window0_1,window2_0,window1_1,window1_0])
您可以将可选参数传递给 .shuffle()
以防止重新洗牌每个时期。
所以,如果我有这样的数据集:
def gen():
yield 1
yield 2
yield 3
ds = tf.data.Dataset.from_generator(gen, output_shapes=(), output_types=tf.int32)
然后做:
shuffled_and_batched = ds.shuffle(3).batch(3).repeat()
给出输出:
tf.Tensor([3 2 1], shape=(3,), dtype=int32)
tf.Tensor([1 3 2], shape=(3,), dtype=int32)
tf.Tensor([2 1 3], shape=(3,), dtype=int32)
tf.Tensor([3 1 2], shape=(3,), dtype=int32)
tf.Tensor([2 3 1], shape=(3,), dtype=int32)
每个时期都会重新排序我的 3 个元素。据我所知,这是您想避免的行为。
如果我这样做:
shuffled_and_batched = ds.shuffle(3, reshuffle_each_iteration=False).batch(3).repeat()
然后我得到输出:
tf.Tensor([1 3 2], shape=(3,), dtype=int32)
tf.Tensor([1 3 2], shape=(3,), dtype=int32)
tf.Tensor([1 3 2], shape=(3,), dtype=int32)
tf.Tensor([1 3 2], shape=(3,), dtype=int32)
tf.Tensor([1 3 2], shape=(3,), dtype=int32)
顺序打乱一次,然后每个时期重复使用。
经过一些调查,我意识到是的,shuffle
在每个纪元之后都会被调用,即使在洗牌之后和批处理之前还有其他转换。我不确定这对管道意味着什么(例如,我不确定窗口是否在每个时期都被调用并且正在减慢处理速度),但我创建了一个 jupyter notebook,其中我创建了一个小版本管道
signalList = [...] # a list of tuples (data, label)
dataset = tf.data.Dataset.from_generator(lambda: signalList)
dataset = dataset.shuffle(buffer_size=self.buffer_size)
dataset = dataset.map(...) # windowing and other transforms
dataset = dataset.batch()
dataset = dataset.repeat()
创建了一个迭代器
iterator = dataset.make_one_shot_iterator()
并绘制了几个时期的信号
next_ = iterator.get_next()
for i in range(10): # 10 epochs
full_signal = []
for j in range(29): # 29 events for this epoch
next_ = iterator.get_next()
full_signal = np.concatenate((full_signal, next_[0][0]), axis=None)
fig = plt.figure(figsize=(18, 5))
plt.plot(full_signal)
并看到信号看起来总是处于不同的顺序,这意味着它们在每个纪元后都会得到 re-shuffled。
如果有人有更详细的答案,他们可以解释这是如何与 DatasetAPI 编译的方式一起工作的,或者如果他们可以澄清这些转换的顺序是否会减慢管道速度,我将不胜感激!
我在 TensorFlow 管道上工作,我将一堆信号加载到数据集中,我随机播放这些信号,然后对信号进行窗口化,然后进行批处理和重复。此数据集用于通过 model.fit 函数调用训练 tf.keras 模型。信号的 windows 不打乱非常重要,这就是数据集转换顺序的原因。
我想知道信号的顺序是否会在时期之间打乱?我发现 dataset.shuffle().batch().repeat()
会在时期之间随机播放数据集,但这对我的应用程序不起作用,因为我需要在随机播放后进行窗口化和其他转换。
我正在使用 TensorFlow 版本 1.13.1。
#... some pre-processing on the signals
signalList = [...] # a list of tuples (data, label)
dataset = tf.data.Dataset.from_generator(lambda: signalList)
dataset = dataset.shuffle(buffer_size=self.buffer_size) ## will this shuffle be repeated??
dataset = dataset.map(...) # windowing and other transforms
dataset = dataset.batch()
dataset = dataset.repeat()
model.fit(dataset, ...)
编辑:我感兴趣的行为是我希望信号的顺序在每个时期都重新洗牌。所以,如果我有 3 个信号
signal0=[window0_0,window0_1]
signal1=[window1_0,window1_1,window1_2]
signal2=[window2_0]
那么输出将如下所示:
tf.Tensor([signal0,signal2,signal1],...) # equivalent to tf.Tensor([window0_0,window0_1,window2_0,window1_0,window1_1,window1_2])
tf.Tensor([signal1,signal0,signal2],...) # equivalent to tf.Tensor([window1_0,window1_1,window1_2,window0_0,window0_1,window2_0])
转换 datset.map(windowing).shuffle().batch().repeat() 会产生类似这样的东西(我对此不感兴趣)
tf.Tensor([window0_1,window1_1,window2_0,window1_0,window0_0,window1_2])
tf.Tensor([window0_0,window1_2,window0_1,window2_0,window1_1,window1_0])
您可以将可选参数传递给 .shuffle()
以防止重新洗牌每个时期。
所以,如果我有这样的数据集:
def gen():
yield 1
yield 2
yield 3
ds = tf.data.Dataset.from_generator(gen, output_shapes=(), output_types=tf.int32)
然后做:
shuffled_and_batched = ds.shuffle(3).batch(3).repeat()
给出输出:
tf.Tensor([3 2 1], shape=(3,), dtype=int32)
tf.Tensor([1 3 2], shape=(3,), dtype=int32)
tf.Tensor([2 1 3], shape=(3,), dtype=int32)
tf.Tensor([3 1 2], shape=(3,), dtype=int32)
tf.Tensor([2 3 1], shape=(3,), dtype=int32)
每个时期都会重新排序我的 3 个元素。据我所知,这是您想避免的行为。
如果我这样做:
shuffled_and_batched = ds.shuffle(3, reshuffle_each_iteration=False).batch(3).repeat()
然后我得到输出:
tf.Tensor([1 3 2], shape=(3,), dtype=int32)
tf.Tensor([1 3 2], shape=(3,), dtype=int32)
tf.Tensor([1 3 2], shape=(3,), dtype=int32)
tf.Tensor([1 3 2], shape=(3,), dtype=int32)
tf.Tensor([1 3 2], shape=(3,), dtype=int32)
顺序打乱一次,然后每个时期重复使用。
经过一些调查,我意识到是的,shuffle
在每个纪元之后都会被调用,即使在洗牌之后和批处理之前还有其他转换。我不确定这对管道意味着什么(例如,我不确定窗口是否在每个时期都被调用并且正在减慢处理速度),但我创建了一个 jupyter notebook,其中我创建了一个小版本管道
signalList = [...] # a list of tuples (data, label)
dataset = tf.data.Dataset.from_generator(lambda: signalList)
dataset = dataset.shuffle(buffer_size=self.buffer_size)
dataset = dataset.map(...) # windowing and other transforms
dataset = dataset.batch()
dataset = dataset.repeat()
创建了一个迭代器
iterator = dataset.make_one_shot_iterator()
并绘制了几个时期的信号
next_ = iterator.get_next()
for i in range(10): # 10 epochs
full_signal = []
for j in range(29): # 29 events for this epoch
next_ = iterator.get_next()
full_signal = np.concatenate((full_signal, next_[0][0]), axis=None)
fig = plt.figure(figsize=(18, 5))
plt.plot(full_signal)
并看到信号看起来总是处于不同的顺序,这意味着它们在每个纪元后都会得到 re-shuffled。
如果有人有更详细的答案,他们可以解释这是如何与 DatasetAPI 编译的方式一起工作的,或者如果他们可以澄清这些转换的顺序是否会减慢管道速度,我将不胜感激!