MONAI-LayerFactory设计与实现
LayerFactory
用于创建图层的工厂对象,这使用给定的工厂函数来实际产生类型或构建可调用程序。这些函数是通过名称来参考的,可以在任何时候添加。
用到的关键技术点:
- 装饰器(Decorators),
例如:@property装饰器,创建只读属性,@property装饰器会将方法转换为相同名称的只读属性,可以与所定义的属性配合使用,这样可以防止属性被修改 - 几个特殊的函数:
__getitem__,__getattr__
LayerFactory 类中的方法
-
def add_factory_callable(self, name: str, func: Callable) -> None:
在给定的名称下将工厂函数添加到此对象中。 -
def factory_function(self, name: str) -> Callable:
装饰器,用于添加一个具有给定名称的工厂函数。 -
def get_constructor(self, factory_name: str, *args) -> Any:
获取给定工厂名称和参数的构造函数。TypeError: When ``factory_name`` is not a ``str``. -
def __getitem__(self, args) -> Any:
获取给定的名称或名称/参数对。如果args是一个可调用的,它被认为是构造函数本身,并被返回。
本身并被返回,否则它应该是工厂名称或包含名称和参数的一对。 -
def __getattr__(self, key):
如果key是一个工厂名称,则返回它,否则表现为继承。这允许将工厂名称作为常量来引用
例如,Fact.FOO表示一个带有工厂函数foo的工厂因子。
为这些层类型定义工厂
Dropout = LayerFactory()
Norm = LayerFactory()
Act = LayerFactory()
Conv = LayerFactory()
Pool = LayerFactory()
Pad = LayerFactory()
利用装饰器函数注册函数实例
Droupt 工厂注册相关的工厂方法,其中参考代码如下
@Dropout.factory_function("dropout")
def dropout_factory(dim: int) -> Type[Union[nn.Dropout, nn.Dropout2d, nn.Dropout3d]]:types = (nn.Dropout, nn.Dropout2d, nn.Dropout3d)return types[dim - 1]
Act 工厂注册方法
Act.add_factory_callable("elu", lambda: nn.modules.ELU)
Act.add_factory_callable("relu", lambda: nn.modules.ReLU)
Act.add_factory_callable("leakyrelu", lambda: nn.modules.LeakyReLU)
调用流程分析
调用卷积工厂如下
from monai.networks.layers.factories import Conv
def test_factories():dimension = 3#当我们访问一个不存在的属性的时候,就会进入__getattr__#Conv.CONVTRANS 这个属性是不存在的,所以作者重写了__getattr__方法# 会从self.factories查找注册方法的keyname = Conv.CONVTRANS#[] 会调用__getitem__,作者重写了__gettitem__# __gettitem__ 会判断是否是一个可调用的对象,如果不是可调用的对象,则调用其构造函数conv = Conv[name, dimension]
if __name__ == "__main__":test_factories()
CONVTRANS的构造函数如下:
@Conv.factory_function("convtrans")
def convtrans_factory(dim: int) -> Type[Union[nn.ConvTranspose1d, nn.ConvTranspose2d, nn.ConvTranspose3d]]:types = (nn.ConvTranspose1d, nn.ConvTranspose2d, nn.ConvTranspose3d)
在调用convtrans_factory方法之前通过装饰器已经把{“CONVTRANS”,convtrans_factory} 注册到 self.factories: Dict[str, Callable] 中。
源码
import warnings
from typing import Any, Callable, Dict, Tuple, Type, Unionimport torch
import torch.nn as nnfrom monai.utils import look_up_option, optional_importInstanceNorm3dNVFuser, has_nvfuser = optional_import("apex.normalization", name="InstanceNorm3dNVFuser")__all__ = ["LayerFactory", "Dropout", "Norm", "Act", "Conv", "Pool", "Pad", "split_args"]class LayerFactory:"""Factory object for creating layers, this uses given factory functions to actually produce the types or constructingcallables. These functions are referred to by name and can be added at any time."""def __init__(self) -> None:self.factories: Dict[str, Callable] = {}@propertydef names(self) -> Tuple[str, ...]:"""Produces all factory names."""return tuple(self.factories)def add_factory_callable(self, name: str, func: Callable) -> None:"""Add the factory function to this object under the given name."""self.factories[name.upper()] = funcself.__doc__ = ("The supported member"+ ("s are: " if len(self.names) > 1 else " is: ")+ ", ".join(f"``{name}``" for name in self.names)+ ".\nPlease see :py:class:`monai.networks.layers.split_args` for additional args parsing.")def factory_function(self, name: str) -> Callable:"""Decorator for adding a factory function with the given name."""def _add(func: Callable) -> Callable:self.add_factory_callable(name, func)return funcreturn _adddef get_constructor(self, factory_name: str, *args) -> Any:"""Get the constructor for the given factory name and arguments.Raises:TypeError: When ``factory_name`` is not a ``str``."""if not isinstance(factory_name, str):raise TypeError(f"factory_name must a str but is {type(factory_name).__name__}.")func = look_up_option(factory_name.upper(), self.factories)return func(*args)def __getitem__(self, args) -> Any:"""Get the given name or name/arguments pair. If `args` is a callable it is assumed to be the constructoritself and is returned, otherwise it should be the factory name or a pair containing the name and arguments."""# `args[0]` is actually a type or constructorif callable(args):return args# `args` is a factory name or a name with argumentsif isinstance(args, str):name_obj, args = args, ()else:name_obj, *args = argsreturn self.get_constructor(name_obj, *args)def __getattr__(self, key):"""If `key` is a factory name, return it, otherwise behave as inherited. This allows referring to factory namesas if they were constants, eg. `Fact.FOO` for a factory Fact with factory function foo."""if key in self.factories:return keyreturn super().__getattribute__(key)
参考链接
LayerFactory 源码文件
Python 魔法方法(三) getattr,setattr, delattr
装饰器博客
相关文章:
MONAI-LayerFactory设计与实现
LayerFactory 用于创建图层的工厂对象,这使用给定的工厂函数来实际产生类型或构建可调用程序。这些函数是通过名称来参考的,可以在任何时候添加。 用到的关键技术点: 装饰器(Decorators), 例如:property装饰器,创建…...
Thinkphp 6.0路由的定义
本节课我们来了解一下路由方面的知识,然后简单的使用一下路由的功能。 一.路由简介 1. 路由的作用就是让 URL 地址更加的规范和优雅,或者说更加简洁; 2. 设置路由对 URL 的检测、验证等一系列操作提供了极大的便利性; …...
Kafka系列之:深入理解Kafka集群调优
Kafka系列之:深入理解Kafka集群调优 一、Kafka硬件配置选择二、Kafka内存选择三、CPU选择四、网络选择五、生产者调优六、broker调优七、消费者调优八、Kafka总体调优一、Kafka硬件配置选择 服务器台数选择: 2 * (生产者峰值生产速率 * 副本数 / 100) + 1磁盘选择: Kafka…...
creator-泄漏检测之资源篇
title: creator-泄漏检测之资源篇 categories: Cocos2dx tags: [creator, 优化, 泄漏, 内存] date: 2023-03-29 14:48:48 comments: false mathjax: true toc: true creator-泄漏检测之资源篇 前篇 资源释放 - https://docs.cocos.com/creator/manual/zh/asset/release-manager…...
【DevOps】Jenkins 运行任务时遇到 FATAL:Unable to produce a script file 报错(已解决)
文章目录一、问题描述二、定位原因三、解决方案四、其他方案五、总结关键词: Jenkins、Unable to produce a script file、UnmappableCharacterException、IOException: Failed to create a temp file on一、问题描述 由于使用的 Jenkins 存在安全漏洞(…...
Web前端
WEB前端 HTMLCSSJavaScriptjQuery(js框架)Bootstrap(CSS框架)AJAXJSON 文章目录 WEB前端WEB前端三大核心技术Web开发工具文本编辑器集成开发环境(IDE)浏览器选择HTML什么是 HTML?HTML版本变迁HTML-HelloWorldHTML 文档 = 网页HTML 标签属性(Attribute)HTML 常用标签...
资源操作:Resources
文章目录1. Spring Resources概述1.2 Resource 接口1.3 Resource的实现类1.3.1 UrlResource访问网络资源1.3.2 ClassPathResource访问类路径下资源1.3.3 FileSystemResource访问文件系统资源1.3.4 ServletContextResource1.3.5、InputStreamResource1.3.6、ByteArrayResource1.…...
GDB调试的学习
很早就想在好好学一学gdb了,正好最近学算法(以前一直以为干硬件不需要什么特别厉害的算法,结果现在卷起来了。大厂面试题也有复杂一些的算法了) 下面的这些命令是别的博主总结的 GDB 调试过程_gdb调试过程_麷飞花的博客-CSDN博客…...
熵值法综合评价分析流程
熵值法综合评价分析流程 一、案例背景 当前有一份数据,是各品牌车各个维度的得分情况,现在想要使用熵值法进行综合评价,得到各品牌车的综合得分,从而进行车型优劣对比,为消费者提供购车依据。 数据如下(数…...
使用Python Pandas库操作Excel表格的技巧
在数据分析和处理中,我们经常需要对Excel表格进行操作。Python Pandas库提供了丰富的API来读取、写入、修改Excel表格。本文将介绍如何使用Python Pandas库操作Excel表格,包括向Excel表格添加新行、创建Excel表格等。 1.向Excel表格添加新行 下面是一个…...
LeetCode练习七:动态规划上:线性动态规划
文章目录一、 动态规划基础知识1.1 动态规划简介1.2 动态规划的特征1.2.1 最优子结构性质1.2.2 重叠子问题性质1.2.3 无后效性1.3 动态规划的基本思路1.4 动态规划基础应用1.4.1 斐波那契数1.4.2 爬楼梯1.4.3 不同路径1.5 个人总结二、记忆化搜索2.1 记忆化搜索简介2.2 记忆化搜…...
基于正点原子F407开发版和SPI接口屏移植touchgfx完整教程(一)
一、相关软件包安装 1、打开cubemx包管理器 2、安装F4软件包 3、安装touchgfx软件包 二、工程配置 1、新建工程 2、sys配置 3、rcc配置 4、crc配置 5、添加touchgfx软件包 6、配置touchgfx软件包 将width和height改为自己屏幕尺寸 7、生成工程 三、代码修改 1、将屏幕相关驱…...
Linux--进程间通信
前言 上一篇相关Linux文章已经时隔2月,Linux的学习也相对于来说是更加苦涩;无妨,漫漫其修远兮,吾将上下而求索。 下面该片文章主要是对进程间通信进行介绍,还对管道,消息队列,共享内存,信号量都…...
hadoop伪分布式集群搭建
基于hadoop 3.1.4 一、准备好需要的文件 1、hadoop-3.1.4编译完成的包 链接: https://pan.baidu.com/s/1tKLDTRcwSnAptjhKZiwAKg 提取码: ekvc 2、需要jdk环境 链接: https://pan.baidu.com/s/18JtAWbVcamd2J_oIeSVzKw 提取码: bmny 3、vmware安装包 链接: https://pan.baidu…...
Qt 中的信息输出机制:QDebug、QInfo、QWarning、QCritical 的简单介绍和用法
Qt 中的信息输出机制介绍QDebug在 Qt 中使用 qDebug输出不同类型的信息浮点数:使用 %!f(MISSING) 格式化符号输出浮点数布尔值:使用 %! (MISSING)和 %! (MISSING)格式化符号输出布尔值对象:使用 qPrintable() 函数输出对象的信息qInfoqWarnin…...
C++读写excel文件的的第三方库
一、比较流行的库 1. OpenXLSX 用于读取、写入、创建和修改 Microsoft Excel (.xlsx) 文件的 C 库。 2. xlnt xlnt 是一个现代 C 库,用于操作内存中的电子表格以及从 XLSX 文件读取/写入它们,如ECMA 376 第 4 版中所述。xlnt 1.0 版的首次公开发布是在 …...
【关于Linux中----多线程(一)】
文章目录认识线程创建线程线程优点和缺点创建一批线程终止线程线程的等待问题认识线程 在一个程序里的一个执行路线就叫做线程(thread)。更准确的定义是:线程是“一个进程内部的控制序列”一切进程至少都有一个执行线程线程在进程内部运行&a…...
2023年全国最新安全员精选真题及答案34
百分百题库提供安全员考试试题、建筑安全员考试预测题、建筑安全员ABC考试真题、安全员证考试题库等,提供在线做题刷题,在线模拟考试,助你考试轻松过关。 11.(单选题)物料提升机附墙架设置要符合设计要求,但…...
数据出境是什么意思?我国数据出境合规要求是什么?
随着经济全球化深入以及云计算等技术的发展,数据在全球范围跨境流动。数据跨境在促进经济增长、加速创新的同时,对数据主权、数据权属、个人信息保护等一系列问题逐渐浮出水面。今天我们就先来了解一下数据出境是什么意思?我国数据出境合规要…...
Liunx——Git工具使用
目录 1)使用 git 命令行安装 git 2)在 Gitee 创建仓库 创建仓库 3)Linux克隆仓库到本地 4)提交代码三板斧: 1.三板斧第一招: git add 2.三板斧第二招: git commit 3.三板斧第三招: git push 5)所遇…...
酒吧数字化方案:Java德州扑克小酒馆扫码点餐预约系统源码
在消费升级与数字化转型的大背景下,中小型德州扑克小酒馆的运营模式正逐步从“人工主导”向“数字化赋能”转变。不同于传统酒吧,德州扑克小酒馆以“休闲娱乐餐饮服务”为核心,其运营痛点集中在点餐效率低、预约管理乱、桌台调度难、合规管控…...
Bootstrap5 侧边栏导航
Bootstrap5 侧边栏导航 随着Web技术的发展,用户界面(UI)设计越来越受到重视。Bootstrap作为一个流行的前端框架,它为开发者提供了丰富的组件和工具,以快速构建响应式、移动优先的网站和应用程序。在Bootstrap 5中,侧边栏导航是一个重要的组件,它可以帮助用户在网站或应…...
为你的爬虫或数据分析脚本添加Taotoken大模型智能解析功能
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 为你的爬虫或数据分析脚本添加Taotoken大模型智能解析功能 在数据工程与分析工作中,我们常常会遇到非结构化或半结构化…...
从零构建μC/OS-II硬件抽象层:以ARM7 LPC2292为例详解移植核心
1. 项目概述与核心思路十年前,我第一次把μC/OS-II从一个ARM7开发板搬到另一个不同型号的ARM7芯片上,光是改启动文件和中断向量表就折腾了一周。那时候我就想,要是有一套标准化的“中间层”,能把芯片底层的差异给屏蔽掉࿰…...
GCC __builtin函数避坑指南:让你的跨平台C代码在ARM和x86上都跑得稳
GCC __builtin函数跨平台避坑实战:ARM与x86兼容性深度解析 在嵌入式开发与高性能计算领域,GCC编译器的__builtin函数集一直是开发者提升性能的利器。但当代码需要同时运行在ARM架构的嵌入式设备和x86架构的服务器上时,这些看似美妙的"魔…...
从‘KN’与‘taoN’反推Kp/Ki:一个让电机PI整定思路瞬间清晰的视角
从系统级特性反推PI参数:基于KN与taoN的电机控制整定方法论 在电机控制领域,PI参数整定一直是工程师面临的经典难题。传统方法往往直接调整Kp和Ki,却忽略了这两个参数背后隐藏的系统级特性——开环增益KN与微分时间常数taoN。这种"只见树…...
基于Python的自动化科研写作工具:Aut_Sci_Write架构与实现
1. 项目概述:一个面向科研写作的自动化工具最近在GitHub上看到一个挺有意思的项目,叫“Aut_Sci_Write”。光看名字,大概就能猜到它的核心方向:自动化科学写作。作为一个在科研和工程领域摸爬滚打多年的从业者,我深知一…...
歌词滚动姬:重新定义歌词时间轴同步的专业级工具
歌词滚动姬:重新定义歌词时间轴同步的专业级工具 【免费下载链接】lrc-maker 歌词滚动姬|可能是你所能见到的最好用的歌词制作工具 项目地址: https://gitcode.com/gh_mirrors/lr/lrc-maker 还在为歌词与音乐不同步而烦恼吗?是否曾经花…...
暗黑破坏神2存档修改器终极指南:5分钟掌握Diablo Edit2完整教程
暗黑破坏神2存档修改器终极指南:5分钟掌握Diablo Edit2完整教程 【免费下载链接】diablo_edit Diablo II Character editor. 项目地址: https://gitcode.com/gh_mirrors/di/diablo_edit 你是否曾经在暗黑破坏神2中花费数小时刷装备却一无所获?是否…...
在 Claude Code 中配置 Taotoken 以解决封号与 Token 不足问题
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 在 Claude Code 中配置 Taotoken 以解决封号与 Token 不足问题 对于依赖 Claude Code 进行编程辅助的开发者而言,服务中…...
