【发布时间】:2020-07-02 08:22:00
【问题描述】:
有没有办法让一个迭代器可以重复使用?
我正在尝试用 CNN 模型训练不是图片的东西。为了节省内存,我使用fit_generate() 来拟合数据。据我所知,只有迭代器对象可以在fit_generate() 中使用。但我不能使用 Keras 的函数ImageDataGernerater()。唯一的方法是自己制作一个迭代器。我试过iter(),肯定不是可重复的迭代器。
【问题讨论】:
有没有办法让一个迭代器可以重复使用?
我正在尝试用 CNN 模型训练不是图片的东西。为了节省内存,我使用fit_generate() 来拟合数据。据我所知,只有迭代器对象可以在fit_generate() 中使用。但我不能使用 Keras 的函数ImageDataGernerater()。唯一的方法是自己制作一个迭代器。我试过iter(),肯定不是可重复的迭代器。
【问题讨论】:
您可以制作可重复的迭代器,是的。他们究竟将如何在这里工作?
我可以想象的一件事是让生成器可重复,只需调用__iter__ 重新初始化生成器即可:
from functools import wraps
def repeatable(fn):
@wraps(fn)
def wrapper(*args, **kwargs):
return RepeatableGenerator(fn, *args, **kwargs)
return wrapper
class RepeatableGenerator:
def __init__(self, gen, *args, **kwargs):
self.gen = gen
self.args = args
self.kwargs = kwargs
self.it = None
def __iter__(self):
self.it = self.gen(*self.args, **self.kwargs)
return self
def __next__(self):
return next(self.it)
然后你可以用它来装饰你自己的生成器:
>>> @repeatable
>>> def generator():
... yield 1
... yield 2
>>> g = generator()
>>> list(g)
[1, 2]
>>> list(g)
[1, 2]
或者你可以将它应用到一些现有的生成器:
from foo_lib import bar_generator
bar_generator = repeatable(bar_generator)
【讨论】: