Как функция apply (fn) в pytorch работает с функцией без оператора return в качестве аргумента? - PullRequest
1 голос
/ 10 апреля 2019

У меня есть несколько вопросов о следующих фрагментах кода:

>>> def init_weights(m):
        print(m)
        if type(m) == nn.Linear:
            m.weight.data.fill_(1.0)
            print(m.weight)

>>> net = nn.Sequential(nn.Linear(2, 2), nn.Linear(2, 2))
>>> net.apply(init_weights)

apply () является частью пакета pytorch.nn. Вы найдете код в документации этого пакета. Заключительные вопросы: 1. Почему этот пример кода работает, хотя к init_weights () не добавляется аргумент или скобки, если он задан для apply ()? 2. Откуда функция init_weights (m) получает аргумент m, когда она передается в качестве параметра функции apply () без скобок и m?

1 Ответ

0 голосов
/ 11 апреля 2019

Мы найдем ответы на ваши вопросы в указанной документации: torch.nn.Module.apply(<i>fn</i>):

Применяется fn рекурсивно к каждому подмодулю (как возвращено .children() ) а также себя.Типичное использование включает инициализацию параметров модели (см. Также torch-nn-init ).

  1. Почему этот пример кода работает, хотя аргументов нет илискобки, добавленные в init_weights (), когда это дано для apply ()?
    • Данная функция init_weights не вызывается до вызова apply, именно потому, что в скобках нет, скорее ссылка на init_weights дается на apply и только изнутри apply позже init_weights вызывается.
  2. Откуда функция init_weights (m) получает аргумент m, когда она передается в качестве параметра функции apply () без скобока м?
    • Он получает свой аргумент при каждом вызове в пределах apply, и, как сказано в документации, он вызывается для итерации по каждому подмодулю (в данном случае) net, а также net., из-за вызова метода net.apply(…).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...