因此,我正在尝试找到将shuffle
,filter
和repeat
运算符与tf.Dataset,tf.eager和Keras模型子类化(TF 1.9+ )。
考虑以下代码:
bunch_of_images_len = len(bunch_of_images_path) # Size 100
tf.data.Dataset.from_tensor_slices(bunch_of_images_path)
.shuffle(buffer_size=bunch_of_images_len, reshuffle_each_iteration=False)
.map(load_image_from_disk)
.filter(something)
.batch(batch_size)
.repeat()
现在,让我们想象一下该数据集经历了一个纪元,而不是产生100张图像,而是由于filter()
操作而产生了90张图像。将会发生的情况是,一旦产生了90张图像,repeat()
操作将被激活,而shuffle()
操作将重新启动数据流,为当前的10张剩余图像分配大小为100的缓冲区时代。
问题是:随机播放操作确实要花费很多时间,如果滤镜过滤出很多图像,那么shuffle
操作可以在一个时期内重复执行4、5、6次。希望它发生一次!
我还必须在进行shuffle
操作之前进行filter
操作,否则重新排列会重新排列实际的图像(而不是图像路径)并且会占用大量RAM
所以我的问题是:如何获得一个改组后的缓冲区,如果该时期没有完成,它不会重新改组数据,而是重用它已经改组后的数据。考虑一下:
filter
操作将丢弃多少张图像reshuffle_each_iteration=False
的Keras模型子类化,但这没用。谢谢。