Вариант использования аргумента функции python

#python

Вопрос:

У меня есть функция python с именем grids() с ключевым словом self в аргументах и другая функция python с именем build_targets() . Я хочу использовать gridsize и anchor_vec от grids() к другой функции python с именем build_targets() . Обе функции следующие:

 def grids(self, img_size=(608,608), gridsize=(19, 19), device='cpu', type=torch.float32):

    nx, ny = gridsize  # x and y grid size
    self.nx = nx
    self.ny = ny

    if isinstance(img_size, int):
        self.img_size = int(img_size)
    else:
        self.img_size = max(img_size)

    self.stride = self.img_size / max(gridsize)

    yv, xv = torch.meshgrid([torch.arange(ny), torch.arange(nx)])

    self.register_buffer('grid_xy', torch.stack((xv, yv), 2).view((1, 1, ny, nx, 2)).to(device)) 


    self.anchor_vec = self.anchors.to(device) / self.stride
    self.register_buffer('gridsize',torch.Tensor(gridsize).to(device))


def build_targets(model, targets):

    for i in layers_list:
        ng, anchor_vec = gridsize, anchor_vec # from grids() 
 

Есть ли какой-либо способ использовать gridsize и anchor_vec в build_targets() или как я могу вызвать его в build_target() функции?

Любые комментарии будут высоко оценены!

Комментарии:

1. self это не ключевое слово. В вашем коде это просто имя первого аргумента ваших методов. Таково соглашение в Python, поскольку этот аргумент передается экземпляру при вызове метода из экземпляра.

2. являются ли эти функции классом?

3. @luigigi, функция grid() не из класса. Я искал способ вызвать его внутри функции build_target()

4. если grids() это не функция в классе, почему у вас есть self первый аргумент? это не имеет смысла. также вызовы self.nx в этом методе не будут работать, потому что вы пытаетесь ссылаться на переменные класса (если только вы не передадите объект в качестве первого аргумента при вызове grids , что очень маловероятно). вам следует ознакомиться с основами классов python. вероятно, вам нужен класс с обоими методами в качестве функций в вашем классе, чтобы вы могли писать переменные класса и получать к ним доступ, как anchor_vec в ваших функциях.

5. @luigigi спасибо за ваши комментарии. Не могли бы вы проверить следующую ссылку [ github.com/ming71/yolov3-pytorch/blob/… , в строке 311 есть функция create_grids (), я пытался использовать эту функцию, но мой собственный способ реализации модели.

Ответ №1:

Похоже grids() , что это метод внутри класса, тогда у вас есть 2 варианта:

  1. Измените build_targets() , сделайте его методом внутри класса, добавив self к его аргументам:
 class SomeClass:
    def grids(...):
        self.gridsize = gridsize # (*)
        #some code

    def build_targets(self, model, targets):
        for i in layers_list:
            ng, anchor_vec = self.gridsize, self.anchor_vec # requires (*)
            # or
            ng, anchor_vec = (self.nx, self.ny), self.anchor_vec # does not requires (*)
 

Зовущий:

 some_instance.build_targets(some_model, some_targets)
 
  1. Добавьте дополнительные аргументы в build_targets() :
 def build_targets(model, targets, gridsize, anchor_vec):
    for i in layers_list:
        ng, anchor_vec = gridsize, anchor_vec
 

Зовущий:

 build_targets(some_model, some_targets, (some_instance.nx, some_instance.ny), some_instance.anchor_vec)
# quite long line
 

Таким образом, build_targets() является «независимым» от класса. Сделать это равносильно build_targets() выходу из класса.