<p>您可以自己调整图像大小以避免舍入误差<em>或</em>您可以尝试<strong>将相同大小的项目分组到一起</strong>。在</p>
<p>假设您有一个图像生成器,并且这些图像具有一个大小属性,则可以创建一个生成器,该生成器将生成一批大小相同的图像,如下所示:</p>
<pre><code>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()
</code></pre>
<p>这里的主要部分是groupby,它按同一个键对连续的项进行分组,并返回该键和匹配该键的项的生成器。在我们的例子中,关键是图像的大小。在</p>
<p>然后,我们保存一个相同大小的项目的缓存,每当其中一个大小达到我们想要的批大小时,我们就会为该批生成一个生成器。在</p>
<p>我们可以用一个具有所需大小参数的假图像对象演示此操作:</p>
^{pr2}$
<p>结果如下:</p>
<pre><code>[<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)>]
...
</code></pre>
<p>如果我们没有足够的空间填充一个批量大小的块,我们不能保证生成所有的图像,但是如果输入是一个无限的生成器,这不是问题。在</p>