Почему мой объект PyTorch ModuleList становится объектом 'function' после назначения его в качестве переменной класса? - PullRequest
1 голос
/ 25 апреля 2020

Мне действительно нужна твоя помощь с чем-то раздражающим, что я не могу объяснить. Я довольно новичок в PyTorch и хочу реализовать модуль, который требует использования ModuleList. Однако после создания пустого объекта ModuleList я не могу использовать его метод добавления. Почему?

self.modules = torch.nn.ModuleList([])
print(type(self.modules), type(torch.nn.ModuleList())) # -> <class 'method'> <class 'torch.nn.modules.container.ModuleList'>
for m in range(len(self.module_sizes)):

        prev_channels = 0 if m == 0 else self.module_out_channels[-m]
        vgg19_channels = self.vgg19_layer_channels[-(m+1)]
        module_out_channels = self.module_out_channels[-(m+1)]
        module_size = self.module_sizes[-(m+1)]

        self.modules.append(
            GeneratorModule(prev_channels=prev_channels, vgg19_channels=vgg19_channels, out_channels=module_out_channels, module_size=module_size, initial=(m==0))
            )

В сообщении об ошибке написано:

  File "main.py", line 90, in __init__
    self.modules.append(
AttributeError: 'function' object has no attribute 'append'

Пока все хорошо. Я предполагаю, что как только я назначу ModuleList в качестве переменной класса для моего пользовательского подкласса nn.Module, он становится объектом 'function'. Поэтому я изменил код таким образом, что ModuleList присваивается self.modules после добавления l oop. Но затем он выдает еще одну ошибку в следующем фрагменте кода, где говорится:

for m, module in enumerate(self.modules):
     pass

TypeError: 'method' object is not iterable

Я знаю, что это должно работать, поскольку я обнаружил, что другие люди делают это таким образом на inte rnet.

Я был бы очень рад, если бы какой-нибудь более опытный программист PyTorch смог мне помочь. Заранее спасибо!

1 Ответ

0 голосов
/ 25 апреля 2020

На самом деле проблема в другом. Как видите, torch.nn.ModuleList имеет append и другие методы, подобные списку, поэтому он должен работать. Нет, он не «изменится» на «функциональный» объект, это было бы довольно не интуитивно понятно для всех.

Вместо этого происходит то, что torch.nn.Module PyTorch имеет несколько методов, которые вы наследуете, , которые включает в себя modules (позволяет перебирать modules, содержащийся в torch.nn.Module экземпляре).

Просто переименуйте ваш self.modules в self.module_list и вы все хорошо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...