我在对Word2Vec和PyTorch的介绍中遇到了一些我不太熟悉的代码。我以前从未见过这种类型的代码结构。
> OC_EDITOR="subl" oc edit service helloworld -o json
我对以下代码行有些困惑。
OC_EDITOR=subl : The term 'OC_EDITOR=subl' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again.
我过去可能会无意中忽略了这种语法,但是我不记得以前曾有一个变量被传递给类实例吗?参照定义了>>> import torch
>>> from torch import nn
>>> # an Embedding module containing 10 tensors of size 3
>>> embedding = nn.Embedding(10, 3)
>>> # a batch of 2 samples of 4 indices each
>>> input = torch.LongTensor([[1,2,4,5],[4,3,2,9]])
>>> embedding(input)
tensor([[[-0.0251, -1.6902, 0.7172],
[-0.6431, 0.0748, 0.6969],
[ 1.4970, 1.3448, -0.9685],
[-0.3677, -2.7265, -0.1685]],
[[ 1.4970, 1.3448, -0.9685],
[ 0.4362, -0.4004, 0.9400],
[-0.6431, 0.0748, 0.6969],
[ 0.9124, -2.3616, 1.1151]]])
的PyTorch documentation,是否可以通过装饰器>>> embedding(input)
包装Class Embedding()
来启用此行为?下面的代码表明可能是这种情况?
@weak_script_method
在这种情况下,为什么最好使用装饰器def forward()
?
答案 0 :(得分:4)
否,@weak_script_method
与它无关。 embedding(input)
遵循Python函数调用语法,该语法可以与“传统”函数以及定义__call__(self, *args, **kwargs)
魔术函数的对象一起使用。所以这段代码
class Greeter:
def __init__(self, name):
self.name = name
def __call__(self, name):
print('Hello to ' + name + ' from ' + self.name + '!')
greeter = Greeter('Jatentaki')
greeter('EBB')
将导致Hello to EBB from Jatentaki!
打印到标准输出。同样,Embedding
是一个对象,您可以通过告诉它应包含多少个嵌入,其维数为多少等来构造对象,然后在构造之后,可以像调用函数一样调用它来检索所需的嵌入部分。
在__call__
源中看不到nn.Embedding
的原因是它是nn.Module
的子类,它提供了自动的__call__
实现,该实现委托给forward
和前后调用一些额外的内容(请参见documentation)。因此,调用module_instance(arguments)
大致等同于调用module_instance.forward(arguments)
。
@weak_script_method
装饰器与它无关。它与jit
的兼容性有关,@weak_script_method
是@script_method
的一种变体,设计用于PyTorch内部使用-给您的唯一信息应该是nn.Embedding
与{ {1}},如果您想使用它。