Python 理解Pytorch过滤器功能

Python 理解Pytorch过滤器功能,python,pytorch,Python,Pytorch,我查阅了PyTorch框架的文档,发现了很多实例,其中一个变量被分配了一个函数,但当它调用函数时,参数会发生变化。不确定这是如何工作的,任何指针都会有帮助 我所理解的- def func1(word): print("hello", word) var1 = func1 现在在这个场景中,var1(“world”)将打印字符串hello world 但我不明白的是PyTorch的一些台词,比如: def __init__(self, input_size, num_

我查阅了PyTorch框架的文档,发现了很多实例,其中一个变量被分配了一个函数,但当它调用函数时,参数会发生变化。不确定这是如何工作的,任何指针都会有帮助

我所理解的-

def func1(word):
    print("hello", word)
var1 = func1
现在在这个场景中,
var1(“world”)
将打印字符串
hello world

但我不明白的是PyTorch的一些台词,比如:

def __init__(self, input_size, num_classes): 
    super(NN,self).__init__()
    self.fc1 = nn.Linear(input_size, 50)  
    self.fc2 = nn.Linear(50, num_classes)  
def forward(self,x):
    x = F.relu(self.fc1(x))
    x = self.fc2(x)
    return x
我们如何知道只应将1个参数传递给
self.fc2
。它似乎与
nn.Linear
nn.Linear是否返回我们存储在前面示例中的var1中的类似func1的函数?如果是,是否有任何文件说明返回的内容


我确实在nn模块中找到了每个函数的用法,但是否有什么东西可以提供关于如何准确工作的更多细节?

nn。线性
不是一个函数(也不是所有其他层,如卷积层、批处理规范……),而是一个函子,这意味着它是一个实现了
\uuuu call\uuu
方法/运算符的类,当您编写类似
self.fc2(x)
的内容时,会调用该方法/运算符

\uuuu call\uuuu
运算符在基类中实现,它是对另一个方法
\u call\u impl
的调用,该方法本身(基本上)调用
forward
方法。因此,多亏了继承魔法,当您使一个类从
nn.Module
派生时,您只需要实现
forward
方法

这个方法的签名有点取决于您,但在大多数情况下,它会将一个张量作为输入并返回另一个张量

总之:

# calls the constructor of nn.Linear. self.fc1 is now a functor
self.fc1 = nn.Linear(20, 10)
# calls the fc1 functor on an input 
y = self.fc1(torch.randn(2, 10))
# which is basically doing
y = self.fc1.forward(torch.randn(2, 10))

首先,您似乎需要更多地了解函数、变量和类的工作方式。我怀疑你的问题主要在于你需要更加熟悉基本概念和术语。这将是一个个人教程,而不是堆栈溢出服务。是的,
nn.Linear
返回一个接受数组并返回数组的筛选函数。这适用于
torch.nn
模块中的大多数功能。
Linear
的参数给出了数组的大小,文档说明了如何操作数组的大小。严格地说,
Linear
是一个定义
\uuuuuuuu调用\uuuuuu
的类,因此它的实例可以像函数一样调用。@chepner我已经完成了Linear的实现,没有找到调用,虽然我确实在别处读到过,并且对它的工作原理有了一个想法。我在forward函数中看到对functional.linear的调用,它只接受一个输入X并产生输出,但我不明白,什么时候调用linear中的forward函数?这就是遗传的原理吗?我现在更清楚了。我已经取消了我的关闭和否决票。您的问题涉及父级的
\uuuuu init\uuuu
方法的源代码,您在这里没有包括该方法。