【学习笔记】【Pytorch_疑问解答】pytorch.nn.Module类的__call__

【学习笔记】【Pytorch】【疑问解答】jtorch.nn.Module类的__call__,子类继承

  • 问题描述
  • 问题解答
  • 参考

问题描述

transforms.RandomCrop类里没有__call__函数,为什么可以调用sun_object(x)语句?【sun_object表示子类实例化的对象】

问题解答

transforms.RandomCrop类里并没有__call__函数,但是其继承torch.nn.Module,父类Module中有__call__方法,因此sun_object(x)这条语句可以正常执行。

# torch/nn/modules/module.py
......
class Module:
	......
	
	def _call_impl(self, *input, **kwargs):
	......
	__call__ : Callable[, Any] = _call_impl
	......

但是Module类中并没有直接给出__call__的实现体,而是__call__后紧跟冒号,此冒号表示类型注解;后面的CallableAny是typing模块中的,Callable表示可调用类型,即等号右边应该是一个可调用类型,此处指的是_call_impl;Any是一种特殊的类型,它与所有类型兼容;Callable[…, Any]表示_call_impl可接受任意数量的参数并返回Any。这里__call__实际指向了_call_impl函数,因此调用__call__实际是调用_call_impl

参考

1.PyTorch中nn.Module类中__call__方法介绍_fengbingchun的博客-程序员秘密__call_impl
2.探究PyTorch中model(image)会自动调用forward函数?

3.Python 中 typing 模块和类型注解的使用
4.Python3中typing模块介绍

你可能感兴趣的:(Pytorch_疑问解答,学习,深度学习,pytorch)