нет ссылки на Module.parameters () после использования более одного раза - PullRequest
1 голос
/ 15 января 2020

У меня есть класс, который наследует от torch.nn.Module,

теперь, когда я делаю этот код:

d = net.parameters()
print(len(list(d)))
print(len(list(d)))
print(len(list(d)))

, вывод:

10
0
0

Так что у меня есть ссылка на net .parameters () только один раз , почему?

Затем он, по-видимому, исчезает ... Я получил эту ошибку, пытаясь создать свой собственный оптимизатор, поэтому я передаю этот net .parameters () в качестве параметра моему новому классу, и, очевидно, я не смог его использовать из-за этой странной ситуации.

1 Ответ

4 голосов
/ 15 января 2020

Это работает, как ожидалось. Module.parameters() возвращает итератор, точнее, генератор Python. Одна вещь о них заключается в том, что вы не можете перематывать генератор. Итак, при первом list(d) вызове вы фактически «потребляете» весь генератор. Затем, если вы попытаетесь сделать это снова, оно будет пустым.

Если вам интересно, реализацию .parameters() можно увидеть здесь , и это очень просто:

def parameters(self, recurse=True):
    for name, param in self.named_parameters(recurse=recurse):
        yield param

Возможно, легче обернуть это вокруг этим примером игрушки:

def g():
    for x in [0, 1, 2, 3, 4]:
        yield x

d = g()
print(list(d))  # prints: [0, 1, 2, 3, 4]
print(list(d))  # prints: []
...