当前位置:网站首页>PyTorch函数中的__call__和forward函数
PyTorch函数中的__call__和forward函数
2022-07-02 17:50:00 【D.ziyu】
初学nn.Module,看不懂各种调用,后来看明白了,估计会忘,故写篇笔记记录
init & call
代码:
class A():
def __init__(self):
print('init函数')
def __call__(self, param):
print('call 函数', param)
a = A()
输出
分析:A进行类的实例化,生成对象a,这个过程自动调用_init_(),没有调用_call_()
上面的代码加一行
class A():
def __init__(self):
print('init函数')
def __call__(self, param):
print('call 函数', param)
a = A()
a(1)
输出
分析:a是对象,python中让对象有了像函数一样加括号(参数)的功能,使用这种功能时,自动调用_call_()
_ call_()中可以调用其它函数,如forward函数
class A():
def __init__(self):
print('init函数')
def __call__(self, param):
print('call 函数', param)
res = self.forward(param)
return res + 2
def forward(self, input_):
print('forward 函数', input_)
return input_
a = A()
b = a(1)
print('结果b =',b)

分析:_call _()成功调用了forward(),且返回值给了b
另外我之前有个误解,以为该类的值只有参数声明了才能用,这是错误的
class A():
def __init__(self):
print('init函数')
self.a = 100 # 声明参数a
def __call__(self, param):
print('call 函数', param)
res = self.forward(param)
return res + 2
def forward(self, input_):
print('forward 函数', input_, self.a)
return input_
a = A()
b = a(1)
print('结果b =',b)
print(a.a)

nn.Module
看了上面的例子,就知道了_call _()的作用,那下面看更CNN的例子
from torch import nn
import torch
class Ding(nn.Module):
def __init__(self):
print('init')
super().__init__()
def forward(self, input):
output = input + 1
print("forward")
return output
dzy = Ding()
x = torch.tensor(1.0)
out = dzy(x)
print(out)
结果:
分析:
这里并没有调用_call_() 和forward(),但还是显示了forward,原因是:Ding这个子类继承了父类nn.Module里的call函数,接下来去源码看
发现_call_调用了_call_impl这个函数,相当于起了个外号一样,那就去这个函数看


这里有很多参数,详细可见参考2。发现这里forward_call 要么是_slow_forward,要么是self.forward(),而这个_slow_forward()也会用self.forward()
所以: _call _()用了forward,而这个父类的forward在子类中重写了(简单代码)
当然,也可以重写__call__(),比如我们不让它使用forward()
from torch import nn
import torch
class Ding(nn.Module):
def __init__(self):
print('init')
super().__init__()
def __call__(self, input_):
print('重写call, 不用forward')
return 'hhh'
def forward(self, input):
output = input + 1
print("forward")
return output
dzy = Ding()
x = torch.tensor(1.0)
out = dzy(x)
print(out)

总结
使用对象dzy(x)时,用了父类nn.Module的call函数,调用了forward,而这个forward又被我们在子类里重写了。
参考
https://blog.csdn.net/dss_dssssd/article/details/83750838
https://zhuanlan.zhihu.com/p/366461413
边栏推荐
- 【JVM调优实战100例】01——JVM的介绍与程序计数器
- 在纽约寻找童真——新泽西州乐高乐园探索中心的美好一天
- The difference between interceptor and filter
- 故障排查:kubectl报错ValidationError: unknown field \u00a0
- Mini Golf Course: a good place for leisure and tourism in London
- What are the links of the problem
- Meta universe chain game system development (logic development) - chain game system development (detailed analysis)
- [100 cases of JVM tuning practice] 01 - introduction of JVM and program counter
- How to play when you travel to Bangkok for the first time? Please keep this money saving strategy
- SLAM|如何时间戳对齐?
猜你喜欢

Responses of different people in technology companies to bugs | daily anecdotes

论文导读 | 关于将预训练语言模型作为知识库的分析与批评

UML 类图

鸿蒙第四次学习
![[100 cases of JVM tuning practice] 01 - introduction of JVM and program counter](/img/c4/3bba96fda92328704c2ddd929dcdf6.png)
[100 cases of JVM tuning practice] 01 - introduction of JVM and program counter

Mysql高级篇学习总结8:InnoDB数据存储结构页的概述、页的内部结构、行格式

The difference between interceptor and filter

【JVM调优实战100例】01——JVM的介绍与程序计数器

仿京东放大镜效果(pink老师版)

UML class diagram
随机推荐
仿京东放大镜效果(pink老师版)
SLAM|如何时间戳对齐?
Excel查找一列中的相同值,删除该行或替换为空值
[daily question] the next day
@Component cannot get Dao layer
新加坡暑假旅遊攻略:一天玩轉新加坡聖淘沙島
迷你高尔夫球场:伦敦休闲旅游好去处
高频面试题
Looking for innocence in New York -- a beautiful day at the discovery center of Legoland, New Jersey
Masa framework - DDD design (1)
Progress progress bar
在纽约寻找童真——新泽西州乐高乐园探索中心的美好一天
Have you stepped on the nine common pits in the e-commerce system?
2022软件工程期末考试 回忆版
How can retail enterprises open the second growth curve under the full link digital transformation
【每日一题】第一天
新加坡暑假旅游攻略:一天玩转新加坡圣淘沙岛
How to play when you travel to Bangkok for the first time? Please keep this money saving strategy
Obligatoire pour les débutants, cliquez sur deux boutons pour passer à un contenu différent
The difference between SLC, MLC, TLC and QLC NAND SSD: which is better?