Глядя на некоторый код 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?