Почему бы не супер () .__ init __ (модель, себя) в Pytorch - PullRequest
1 голос
/ 18 апреля 2020

Для torch.nn.Module ()

Согласно официальной документации: Базовый класс для всех нейросетевых модулей. Ваши модели также должны быть подклассами этого класса. Модули также могут содержать другие Модули, позволяющие вкладывать их в древовидную структуру. Вы можете назначить подмодули как обычные атрибуты.

import torch.nn as nn
import torch.nn.functional as F

class Model(nn.Module):
    def __init__(self):
        super(Model, self).__init__()
        self.conv1 = nn.Conv2d(1, 20, 5)
        self.conv2 = nn.Conv2d(20, 20, 5)

    def forward(self, x):
        x = F.relu(self.conv1(x))
        return F.relu(self.conv2(x))

Использовано super(Model, self).__init__() Почему бы и нет super().__init__(Model, self)

1 Ответ

1 голос
/ 18 апреля 2020

Эта конструкция:

super().__init__(self)

действительна только в Python 3.x, тогда как первая,

super(Model, self).__init__()

работает как в Python 2.x, так и Python 3.х. Таким образом, разработчики PyTorch не хотели нарушать весь код, написанный в Python 2.x, путем применения синтаксиса Python 3.x super(), поскольку обе конструкции по сути делают то же самое в данном случае, который инициализирует следующие переменные:

    self.training = True
    self._parameters = OrderedDict()
    self._buffers = OrderedDict()
    self._backward_hooks = OrderedDict()
    self._forward_hooks = OrderedDict()
    self._forward_pre_hooks = OrderedDict()
    self._state_dict_hooks = OrderedDict()
    self._load_state_dict_pre_hooks = OrderedDict()
    self._modules = OrderedDict()

Подробнее см. в соответствующем обсуждении на форуме PyTorch по теме topi c, is-there-a-reason- почему люди-потребительной супер-класса с собственной инициализации, а не-из-супер-инициализации?

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