一、背景知识

python中两个属相相关方法

result = obj.name 会调用builtin函数getattr(obj,'name')查找对应属性,如果没有name属性则调用obj.__getattr__('name')方法,再无则报错

obj.name = value 会调用builtin函数setattr(obj,'name',value)设置对应属性,如果设置了__setattr__('name',value)方法则优先调用此方法,而非直接将值存入__dict__并新建属性

二、nn.Module的__setattr__()方法逻辑

nn.Module中实现了__setattr__()方法,当再class的初始化__init__()中执行module.name=value时,会在其中判断value是否属于Parameters或者nn.Module对象,是则将之存储进入__dict__._parameters和__dict__._modules两个字典中;如果是其他对象诸如Variable、List、dict等等,则调用默认操作,将值直接存入__dict__中。

示例

nn.Module的新建Parameter属性,在._parameters中可以查询到,在.__dict__中没有,属于.__dict__._parameters中

import torch as t
import torch.nn as nnmodule = nn.Module()
module.param = nn.Parameter(t.ones(2,2))print(module._parameters)"""
OrderedDict([('param', Parameter containing:1  11  1[torch.FloatTensor of size 2x2])])
"""print(module.__dict__)
"""
{'_backend': <torch.nn.backends.thnn.THNNFunctionBackend at 0x7f5dbcf8c160>,'_backward_hooks': OrderedDict(),'_buffers': OrderedDict(),'_forward_hooks': OrderedDict(),'_forward_pre_hooks': OrderedDict(),'_modules': OrderedDict(),'_parameters': OrderedDict([('param', Parameter containing:1  11  1[torch.FloatTensor of size 2x2])]),'training': True}
"""

以通常List的格式传入的子Module直接从属于属于.__dict__,并未被_modules识别

submodule1 = nn.Linear(2,2)
submodule2 = nn.Linear(2,2)
module_list = [submodule1,submodule2]
module.submodules = module_listprint('_modules:',module_list)
# _modules: [Linear (2 -> 2), Linear (2 -> 2)]
print('__dict__[submodules]:',module.__dict__.get('submodules'))
# __dict__[submodules]: [Linear (2 -> 2), Linear (2 -> 2)]
print('__dict__[submodules]:',module.__dict__['submodules'])
# __dict__[submodules]: [Linear (2 -> 2), Linear (2 -> 2)]

以ModuleList格式传入的子Module可被._modules识别,而不直接从属于.__dict__

module_list = nn.ModuleList(module_list)
module.submodules = module_listprint(isinstance(module_list,nn.Module))
# Trueprint(module._modules)
"""
OrderedDict([('submodules', ModuleList ((0): Linear (2 -> 2)(1): Linear (2 -> 2)
))])
"""
print(module.__dict__.get('submodules'))
# None
print(module.__dict__['submodules'])
"""
---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
<ipython-input-19-d4344afabcbf> in <module>()
----> 1 print(module.__dict__['submodules'])KeyError: 'submodules'
"""

三、属性查询函数__getattr__相关特性

nn.Module的.__getattr__()方法会对__dict__._module、__dict__._parameters和__dict__._buffers这三个字典中的key进行查询。当nn.Module进行属性查询时,会先在__dict__进行查询(仅查询本级),查询不到对应属性值时,就会调用.__getattr__()方法,再无结果就报错。

示例

对于__dict__中的属性.training,可以看到.__getattr__('training')查询时就没有结果,

print(module.__dict__.get('submodules'))
# Nonegetattr(module,'training')
# Truemodule.training
# Truemodule.__getattr__('training')
"""
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
……
AttributeError: 'Module' object has no attribute 'training'
"""

另外,我们可以看到.__getattr__可以查询到的结果如下,都是nn.Module自建的属性,

module.__getattr__
"""
<bound method Module.__getattr__ of Module ((submodules): ModuleList ((0): Linear (2 -> 2)(1): Linear (2 -> 2))
)>
"""

对于普通的新建属性,其实和nn.Module自建的没什么不同,不同查询方式输出相似,

module.attr1 = 2
getattr(module,'attr1')
# 2module.__getattr__('attr1')
"""
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
……
AttributeError: 'Module' object has no attribute 'attr1'
"""

对于nn.Module的特殊属性,可以看到,getattr和.__getattr__均可查到,这也是由于getattr一次查找无果后,调用.__getattr__的结果,

getattr(module,'param')
"""
Parameter containing:1  11  1
[torch.FloatTensor of size 2x2]
"""module.__getattr__('param')
"""
Parameter containing:1  11  1
[torch.FloatTensor of size 2x2]
"""

转载于:https://www.cnblogs.com/hellcat/p/8509351.html

『PyTorch』第十五弹_torch.nn.Module的属性设置查询相关推荐

  1. PyTorch框架学习十五——可视化工具TensorBoard

    PyTorch框架学习十五--可视化工具TensorBoard 一.TensorBoard简介 二.TensorBoard安装及测试 三.TensorBoard的使用 1.add_scalar() 2 ...

  2. PyTorch 入坑七:模块与nn.Module学习

    PyTorch 入坑七 模型创建概述 PyTorch中的模块 torch模块 torch.Tensor模块 torch.sparse模块 torch.cuda模块 torch.nn模块 torch.n ...

  3. pytorch学习笔记十五:Hook函数与CAM可视化

    一.Hook函数概念 Hook函数机制:不改变模型主体,实现额外功能,像一个挂件或挂钩等. 为什么需要这个函数呢?这与Pytorch的动态图计算机制有关,在动态图的计算过程中,一些中间变量会释放掉,比 ...

  4. 『Python』__getattr__()特殊方法

    self的认识 & __getattr__()特殊方法 将字典调用方式改为通过属性查询的一个小class, class Dict(dict):def __init__(self, **kw): ...

  5. 十四、理解nn.module方法——学习python面向对象编程(一)

    起因 在(十二)中说到pytorch中创建神经网络的两种方法:一个是Sequential类(这也是一种继承父类属性和方法并可对其方法重构的子类),另一个是自己编写代码,继承nn.module类,对其内 ...

  6. pytorch中的神经网络模块基础类——torch.nn.Module

    1.torch.nn.Module概要 pytorch官网对torch.nn.Module的描述如下. torch.nn.Module是所有的神经网络模块的基类,且所有的神经网络模块都可以包含其他的子 ...

  7. 『PyTorch』第五弹_深入理解autograd_中:Variable梯度探究

    查看非叶节点梯度的两种方法 在反向传播过程中非叶子节点的导数计算完之后即被清空.若想查看这些变量的梯度,有两种方法: 使用autograd.grad函数 使用hook autograd.grad和ho ...

  8. 『PyTorch』第十一弹_torch.optim优化器 每层定制参数

    一.简化前馈网络LeNet 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 im ...

  9. 《逆袭进大厂》第十五弹之智力情景题 | 个人博客

    卷友们好,我是阿秀. 嗯,智力题&情景题终于来了,这次阿秀不再是鸽秀... 其实真不是我不更,主要是最近事情有点多,最近在忙着个人博客和研究生毕业答辩的事情. 搭这个博客主要是因为不止一个小伙 ...

最新文章

  1. 设置google浏览器不缓存JS
  2. shp文件导入数据库
  3. et文件怎么转成excel_微软推出Office App,Word、Excel、PowerPoint三合一(附下载)
  4. php member limit,php 安全有关问题
  5. Mysql临时表的用法 - 51CTO.COM
  6. 制作自定义工作流(WWF)设计器
  7. DropDownList下拉绑定到GridView中实现功能
  8. java final对象_java面向对象基础_final详细介绍
  9. 穿上马甲就没认出polya定理之典型题目手环
  10. 虚拟服务器密码遗忘怎么办,win7虚拟机忘记密码怎么办_win7虚拟机忘记密码的解决方法...
  11. mipi的dsi全称_高通mipi dsi代码理解
  12. 生日倒生日计时html代码,一款非常精美实用的生日倒计时代码
  13. 解决UI黑边问题,Alpha Bleeding技术简介
  14. 微信公众号开发三 测试号申请
  15. Unity工程发布到HoloLens
  16. chrome谷歌浏览器插件制作简易教程
  17. HTML+CSS面试技巧
  18. k8s对外攻击面总结
  19. 计算机的表白隐藏功能,微信隐藏符号功能大全 情人节可以发这些表白
  20. octave常用指令

热门文章

  1. JS获取JSON对象数组某个属性最大值
  2. Android View 自定义RangeSeekBar范围选择器
  3. 睡觉前后爆笑的情侣小两口~媳妇不要闹了~
  4. form input类型
  5. SQL SERVER数据库开发之触发器的应用
  6. 前后端整合---请求
  7. 计算机网络学习笔记(6. 多路复用)
  8. 计算机网络学习(六)—网络层概述以及相关习题
  9. HTML+CSS制作旋转的loading效果
  10. mybatis批量删除和插入