您可以自己调整图像大小以解决此处的舍入错误,或者您可以尝试将相同大小的项目组合成批次。
假设您有一个图像生成器,并且图像具有 size 属性,您可以创建一个生成器,该生成器将生成大小相同的批量图像,如下所示:
from itertools import groupby
from collections import deque, defaultdict
def same_size_batches(images, batch_size=5):
image_cache = defaultdict(deque)
# We assume the image object has a size parameter we can group by
for size, images in groupby(images, key=lambda image: image.size):
for image in images:
image_cache[size].append(image)
# Everytime our batch gets big enough, yield it and reset
if len(image_cache[size]) == batch_size:
yield iter(image_cache[size])
image_cache[size].clear()
这里的主要部分是 group by,它按相同的键对连续的项目进行分组,并返回该键和与该键匹配的项目的生成器。在我们的例子中,关键是图像的大小。
然后,我们保留相同大小的项目的缓存,每次其中一个大小达到我们所需的批量大小时,我们为该批量生成一个生成器。
我们可以使用具有所需尺寸参数的假图像对象来演示此操作:
import random
class FakeImage(object):
def __init__(self, _id):
self.id = _id
self.size = (370, 1224) if random.random() < 0.25 else (375, 1242)
def __repr__(self):
return "<Image {} {}>".format(self.id, self.size)
images = (FakeImage(_id) for _id in range(100))
for batch in same_size_batches(images, batch_size=5):
print(list(batch))
这会导致类似:
[<Image 0 (375, 1242)>, <Image 2 (375, 1242)>, <Image 3 (375, 1242)>, <Image 4 (375, 1242)>, <Image 6 (375, 1242)>]
[<Image 7 (375, 1242)>, <Image 8 (375, 1242)>, <Image 9 (375, 1242)>, <Image 10 (375, 1242)>, <Image 12 (375, 1242)>]
[<Image 1 (370, 1224)>, <Image 5 (370, 1224)>, <Image 11 (370, 1224)>, <Image 14 (370, 1224)>, <Image 16 (370, 1224)>]
[<Image 13 (375, 1242)>, <Image 15 (375, 1242)>, <Image 18 (375, 1242)>, <Image 19 (375, 1242)>, <Image 20 (375, 1242)>]
[<Image 21 (375, 1242)>, <Image 23 (375, 1242)>, <Image 24 (375, 1242)>, <Image 25 (375, 1242)>, <Image 26 (375, 1242)>]
...
如果我们没有足够的数量来填充批量大小的块,我们不能保证生成所有图像,但如果输入是无限生成器,这不是问题。