Python module

news/2025/1/14 22:49:25/

1、module:

_modules 可以直接获取特定名称的子模块对象,但无法直接获取名称以及遍历所有子模块,所以需要递归是一个字典,所以其好处就是可以直接用键值索引,坏处是无法直接迭代需要用items(),其中键是子模块的名称,值是对应的子模块对象。
_moudules.items()是迭代字典的基本用法,返回可迭代对象,基操如下:

for key, value in my_dict.items():print(key, value)

如果是:

for key in my_dict:print(key)

则迭代一个字典的键。

所以看下面这段代码:

for name, module in model._modules.items():if hasattr(module, "_modules"):.....

name: layer1 (key)
module: Sequential() (value)

2、

children() 方法返回一个迭代器,用于遍历模型的直接子模块。它只返回子模块的对象,不包含子模块的名称
model.named_children() 返回一个迭代器,该迭代器依次生成由子模块名称和子模块对象组成的元组
每个元组的结构是 (name, child),其中 name 是子模块的名称,child 是子模块对象本身

for name, child in model.named_children():

这和上面的效果是一样的。
而且:model._modules[name]child是一样的

3、

modules(): 返回一个迭代器,提供模型及其所有子模块(包括子模块的子模块,这样就不用递归了
named_modules(): 返回一个迭代器,提供模型及其所有子模块的名称和对象

4、

懂了上面之后我们可以写一个hook函数
Version1:用直接子模块迭代器

def add_IF_hook(model):for name, child in model.named_children():if isinstance(child, ScaledNeuron):child.register_forward_hook(save_spikes_number)else:add_IF_hook(child) # 需要递归children对应的是直接子模块

Version2:用属性_modules,items()转成迭代器

def add_IF_hook(model):for name, module in model._modules.items():if isinstance(module, ScaledNeuron):model._modules[name],register_forward_hook(save_spikes_number)#或者 module.register_forward_hook(save_spikes_number)else:add_IF_hook(module) #需要递归	

上面两个输出的形式是这样的:pipeline是先从layer1—sequential下去,然后到sequential里面找到ScaledNeuron:layer1.2

===> name: 2 child: ScaledNeuron(
(neuron): IFNode(
v_threshold=1.0, v_reset=None, detach_reset=False
(surrogate_function): Sigmoid(alpha=1.0, spiking=True)
)
)

Version3:用全部子模块,最简形式

def add_IF_hook(model):for name, module in model.named_modules():if isinstance(module, ScaledNeuron):print(f"===> name: {name}  child: {module}")module.register_forward_hook(save_spikes_number)

最后输出的形式是这样的:

===> name: layer1.2 child: ScaledNeuron(
(neuron): IFNode(
v_threshold=1.0, v_reset=None, detach_reset=False
(surrogate_function): Sigmoid(alpha=1.0, spiking=True)
)
)
===> name: layer1.6 child: ScaledNeuron(
(neuron): IFNode(
v_threshold=1.0, v_reset=None, detach_reset=False
(surrogate_function): Sigmoid(alpha=1.0, spiking=True)
)
)


http://www.ppmy.cn/news/909621.html

相关文章

【专精特新周报】北交所IPO受理现小高潮,上周共受理59家企业,七成为专精特新;朗鸿科技二度上会,顺利过会...

关注ITValue,看企业级最新鲜、最价值报道! 北交所审核开启加速度,上周单日受理21家企业上市申请;北京专精特新”企业突破4000家,科技企业日增270家;半年股价下跌49%!鱼鳞图面临降层风险...... 图…

液晶驱动芯片分类

本文主要是介绍一些常用的LCD驱动控制IC的型号,方便学习或正在使用的LCD的朋友能够更好地编写LCD的驱动程序。 因此各位朋友在选择LCD液晶模块的时候,在考虑到串行,还是并行的方式时,可根据其驱动控制IC的型号来判别&#…

矽递科技冲刺深交所:年营收7.5亿 拟募资7.75亿

雷递网 雷建平 2月15日 深圳矽递科技股份有限公司(简称:“矽递科技”)日前递交招股书,准备在深交所创业板上市。 矽递科技计划募资7.75亿元,其中,3.5亿元用于超低功耗智能传感系统产业化项目,2.…

赛普拉斯代理商与芯片ic是如何收购成功的

赛普拉斯代理商和芯片是如何获得赛普拉斯专业代理商提供的产品的?会不会出现严重的质量问题?即使是正品,也无法确定质量是否可靠。这是一个不容忽视的问题。.您可以放心,实力代理商将与专业检测机构合作,以严格的标准检…

思普瑞特,小票打印机和标签打印机java网络驱动设计与实现

网络打印走的socket连接,主流的java, php, c, c#等语言都支持socket,所以实现打印机的网络打印几乎是和语言无关的 打印机默认端口是9100 使用socket连接上打印机后,将打印内容按照打印机的指令进行编码后调用send就可以打印了 协议文档 小票…

3.4 Bootstrap 按钮下拉菜单

文章目录 Bootstrap 按钮下拉菜单分割的按钮下拉菜单按钮下拉菜单的大小按钮上拉菜单 Bootstrap 按钮下拉菜单 本章将讲解如何使用 Bootstrap class 向按钮添加下拉菜单。如需向按钮添加下拉菜单,只需要简单地在在一个 .btn-group 中放置按钮和下拉菜单即可。您也可…

Iceberg从入门到精通系列之十八:一篇文章深入了解Flink对Iceberg的支持

Iceberg从入门到精通系列之十八:一篇文章深入了解Flink对Iceberg的支持 一、Flink支持的iceberg功能二、使用Flink SQL Client时的准备三、Flinks Python API四、添加目录。五、Hive catalog六、类型转换七、待支持的功能 Apache Iceberg 支持 Apache Flink 的 Data…

Java:(游戏:豆机)

问题描述: 豆机,也称为梅花瓶或高尔顿瓶,它是一个用来做统计实验的设备,是用英国科学家瑟弗兰克斯高尔顿的名字来命名的。它是一个三角形状的均匀放置钉子(或钩子)的直立板子,如下图所示。 球…