【发布时间】:2019-02-15 10:47:03
【问题描述】:
这是 [keras Sequence 类的源代码][1] 的链接。
我通过执行以下操作创建了我认为完全相同的对象:
- 将
__init__、__getitem__和__len__方法从InfiniteGenerator类复制并粘贴到KGen类。 - 从
Sequence类的源代码复制iter方法到InfiniteGenerator类。
我的假设是这两个生成器都应该创建一个有限列表,但 Sequence 对象将永远继续迭代。为什么?
class InfiniteGenerator(object):
def __init__(self, alist):
self.alist = alist
def __getitem__(self, idx):
return self.alist[idx]
def __len__(self):
return len(self.alist)
def __iter__(self):
for item in (self[i] for i in range(len(self))):
yield item
from keras.utils import Sequence
class KGen(Sequence):
def __init__(self, alist):
self.alist = alist
def __getitem__(self, idx):
return self.alist[idx]
def __len__(self):
return len(self.alist)
if __name__ == '__main__':
ig = InfiniteGenerator(list(range(4)))
for item in ig:
print(item)
print('now trying second iterator')
import time
time.sleep(1)
kg = KGen(list(range(4)))
for item in kg:
print(item)
【问题讨论】:
-
我运行这段代码时停止了一次。
-
很奇怪。代码中没有错误。我只是通过将此代码粘贴到 ipython REPL 中进行了仔细检查,然后我在第二个迭代器上得到了无限循环。我正在使用我在我的 macbook 上安装了 anaconda 的 python3。我在 Ubuntu 14 上得到了相同的结果。
-
你有没有想过这个问题?我遇到了同样的问题。
idx重置,但它只是继续运行... -
您知道您使用的是什么版本的 Keras 吗?我意识到,在 2.2.3 之前,他们实际上使用了无限生成器。更改也是最近才进行的,所以我认为这很可能是问题所在。 github.com/keras-team/keras/commit/…
-
不幸的是,我不确定,但是我 pip 升级了 keras 和 tensorflow,现在当我运行上面的脚本时,它不会像以前那样无限循环。