网站建设品牌排行榜域名买卖网站
网站建设品牌排行榜,域名买卖网站,建设银行网站钓鱼网站,wordpress设置代理目录 前言1. 问题所示2. 原理分析2.1 forward函数理解2.2 forward函数用法 前言
深入深度学习框架的代码#xff0c;发现forward函数没有被显示调用
但代码确重写了forward函数#xff0c;于是好奇是不是python的魔术方法作用
1. 问题所示
代码如下所示#xff1a;
cla… 目录 前言1. 问题所示2. 原理分析2.1 forward函数理解2.2 forward函数用法 前言
深入深度学习框架的代码发现forward函数没有被显示调用
但代码确重写了forward函数于是好奇是不是python的魔术方法作用
1. 问题所示
代码如下所示
class Module(nn.Module):# 初始化def __init__(self):super(Module, self).__init__()# ......# 前向传播def forward(self, x):# ......return x# 输入数据
data ..... # 实例化
module Module()# 前向传播
module(data) 整个代码串没有显示调用forward函数 由此引发疑问
谁去调用forward函数什么时候调用forward函数
2. 原理分析
回顾python的基础知识python 类和对象的详细分析 可以清楚知道对象需要执行方法在方法中传入参数即可类似 module.forward(data)但是执行对象(参数)就可成功。
这也说明module(data) 等价于 module.forward(data)。 即该代码块调用了forward函数那他是怎样实现什么时候调用的呢
本身Pytorch大部分操作都是通过继承nn.Module类实现查看其源代码
class Module(object):def __init__(self):def forward(self, *input):def add_module(self, name, module):def cuda(self, deviceNone):def cpu(self):def __call__(self, *input, **kwargs):def parameters(self, recurseTrue):def named_parameters(self, prefix, recurseTrue):def children(self):def named_children(self):def modules(self): def named_modules(self, memoNone, prefix):def train(self, modeTrue):def eval(self):def zero_grad(self):def __repr__(self):def __dir__(self):内部中有个def __call__(self, *input, **kwargs):函数默认父类会执行该函数
大致如下
class Module():def __call__(self, data): print(data)module Module()# 输出 1
module(1)这正说明深度学习的模型继承了nn.Module类内部的__call__方法有对forward方法的调用才不用显式地调用forward方法。 对此深度学习的模型框架需要重写构造函数中的__init__函数和forward函数。
2.1 forward函数理解
通过module中的__call__方法__call__方法调用module中的forward方法forward方法 —若碰到Module子类则迭代回馈第一步 —若碰到Function子类则执行第四步调用Function子类中的call方法__call__方法调用Function中的forward方法由于层层嵌套现在只需回馈上一层的值即可 Function中的forward返回值 - module中的forward返回值 - module中的__call__进行forward_hook返回值
代码逻辑如下
def __call__(self, *input, **kwargs):# 此处执行forward函数result self.forward(*input, **kwargs)for hook in self._forward_hooks.values():#将注册的hook拿出来用hook_result hook(self, input, result)return result 围观角度所谓的__call__为函数调用只需要将该类型的对象当做函数使用即可即 module(data) 等价于 module.forward(data)。 宏观角度当一个类默认实现特殊方法__call__该类的实例就变成可调用的类型即对象名() 等价于 对象名.__call__()
2.2 forward函数用法 CNN可学习的参数层和不可学习的参数层大致如下 可学习的参数卷积层和全连接层的权重、bias、BatchNorm的β和γ等。不可学习的参数(超参数)学习率、batch size、weight decay、模型的深度宽度分辨率等。 Module类中的init构造函数一般放置可学习的参数其不可学习的参数如果不放置在init层则在forward函数中可用nn.functional来代替。forward函数必须重写实现模型功能链接各层之间的功能
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/89543.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!