Вызов функции forward без .forward () - PullRequest
0 голосов
/ 04 марта 2019

Глядя на некоторый код pytorch для оценки позы AlphaPose я заметил незнакомый синтаксис:

По сути, мы определяем класс Darknet, который наследует nn.Module свойства, например, так: class Darknet(nn.Module)

Это реконструирует нейронную сеть из некоторого файла конфигурации, а также определяет функции для загрузки предварительно обученных весов и прямого прохода

Теперь прямой проход принимает следующие параметры:

def forward(self, x, CUDA)

Следует отметить, что в определении класса forward это единственный метод, имеющий атрибут CUDA (это станет важным позже)

В ходе прямого прохода мы получаем прогнозы:

for i in range(number_of_modules):
     x = self.module[i](x)

, где module[i] был построен как:

module = nn.Sequential()
conv = nn.Conv2d(prev_fileters, filters, kernel_size, stride, pad, bias=bias)
module.add_module("conv_{0}".format(index), conv)

Затем мы вызываем invoke эту модель и (я предполагаю) метод пересылки, например, так:

self.det_model = Darknet("yolo/cfg/yolov3-spp.cfg")
self.det_model.load_weights('models/yolo/yolov3-spp.weights')
self.det_model.cpu()
self.det_model.eval()

image = image.cpu()
prediction = self.det_model(img, CUDA = False)

IПредположим, что последняя строка является вызовом прямого прохода, но почему бы не использовать .forward?Это специфический синтаксис для pytorch или я пропускаю некоторые базовые принципы python?

1 Ответ

0 голосов
/ 04 марта 2019

В этом нет ничего особенного.Когда вы вызываете что-то как class_object(fn params), это вызывает метод __call__ этого класса.

Если вы копаете код факела, в частности nn.Module, вы увидите, что __call__ внутренне вызывает вперед, но заботится о хуках и заявляет, что Pytorch позволяет.Поэтому, когда вы звоните self.det_model(img, cuda), вы все равно звоните вперед.

См. Код для nn.module здесь .

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