Der zugewiesene wird in den zugewiesenen umgeschrieben. Nachfolgend sind die experimentellen Ergebnisse aufgeführt.
Colab
#Funktion definieren
def func(x, y):
return x - y
func(1, 2) # -1
#Definiere func0
def func0():
return None
func0() #Keine Leistung
#Funktionsname durch Funktionsnamen ersetzen
func0 = func
func(1, 3) # -2
func0(1, 3) # -2
Aus irgendeinem Grund wurde die "call" -Methode "der" Modulklasse "von PyTorch so festgelegt, dass sie einmal mit" _call_impl "festgelegt und dann wie oben beschrieben" call "zugewiesen wurde. Bitte sagen Sie mir, warum PyTorch eine so problematische Beschreibung gemacht hat (ernsthaft). Unten finden Sie den Quellcode.
Python:torch.nn.modules.module
def _call_impl(self, *input, **kwargs):
for hook in itertools.chain(
_global_forward_pre_hooks.values(),
self._forward_pre_hooks.values()):
result = hook(self, input)
if result is not None:
if not isinstance(result, tuple):
result = (result,)
input = result
if torch._C._get_tracing_state():
result = self._slow_forward(*input, **kwargs)
else:
result = self.forward(*input, **kwargs)
for hook in itertools.chain(
_global_forward_hooks.values(),
self._forward_hooks.values()):
hook_result = hook(self, input, result)
if hook_result is not None:
result = hook_result
if (len(self._backward_hooks) > 0) or (len(_global_backward_hooks) > 0):
var = result
while not isinstance(var, torch.Tensor):
if isinstance(var, dict):
var = next((v for v in var.values() if isinstance(v, torch.Tensor)))
else:
var = var[0]
grad_fn = var.grad_fn
if grad_fn is not None:
for hook in itertools.chain(
_global_backward_hooks.values(),
self._backward_hooks.values()):
wrapper = functools.partial(hook, self)
functools.update_wrapper(wrapper, hook)
grad_fn.register_hook(wrapper)
return result
__call__ : Callable[..., Any] = _call_impl
Recommended Posts