python-3.x pytorch中的apply(fn)函数如何处理一个没有return语句作为参数的函数?

eagi6jfj  于 2023-04-13  发布在  Python
关注(0)|答案(2)|浏览(138)

我对以下代码片段有一些疑问:

>>> 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.为什么这个代码示例可以工作,尽管当它被赋予apply()时,init_weights()没有添加参数或括号?2.当它作为apply()的参数而没有括号和m时,函数init_weights(m)从哪里获得参数m?

ubof19bj

ubof19bj1#

我们在torch.nn.Module.apply(fn)的文档中找到您问题的答案:
递归地将fn应用于每个子模块(由.children()返回)以及self。典型的用法包括初始化模型的参数(另请参见torch-nn-init)。

  • 为什么这个代码示例可以工作,尽管当它被赋予apply()时,没有给init_weights()添加参数或括号?
  • 给定的函数init_weightsapply调用之前没有被调用,这是因为没有圆括号,而是将对init_weights的引用赋予apply,并且只有在apply内部之后才调用init_weights
  • 当函数init_weights(m)作为apply()的一个参数而没有括号和m时,它从哪里获取参数m?
  • 它在apply中的每次调用中都得到它的参数,并且,正如文档所述,由于方法调用net.apply(…),它被调用m迭代net的每个子模块(在本例中)以及net本身。
o4tp2gmn

o4tp2gmn2#

[文档] def apply(self: T, fn: Callable[['Module'], None]) -> T:

for module in self.children():
        module.apply(fn)
    ***fn(self)***
    return self

从https://pytorch.org/docs/master/_modules/torch/nn/modules/module.html#Module.apply阅读有关apply的源代码,它被称为fn(self)last

相关问题