Почему экземпляр последовательности keras повторяется вечно? - PullRequest
0 голосов
/ 11 сентября 2018

Вот ссылка на [исходный код класса Sera Keras] [1].

Я создал точно такой же объект, выполнив следующие действия:

  1. копирование и вставка одних и тех же методов __init__, __getitem__ и __len__ из класса InfiniteGenerator в класс KGen.
  2. копирование метода iter из исходного кода класса Sequence класса 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)

1 Ответ

0 голосов
/ 08 января 2019

Я столкнулся с этим также с помощью tenorflow.keras версии 1.10. Вы можете увидеть в исходном коде, что они определили __iter__() для возврата бесконечного генератора. Я добавил следующую функцию во все мои классы Sequence, чтобы создать однократный итератор для ситуаций, когда он мне нужен.

def gen_iter(self):
    for i in range(len(self)):
        yield self[i]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...