【啥都生】分类项目中的模型搭建代码解析

news2024/11/18 15:33:06
def build_model(cfg):
    if isinstance(cfg, list):
        modules = [
            eval(cfg_.pop("type"))(**cfg_) for cfg_ in cfg
        ]
        return Sequential(*modules)
    else:
        return eval(cfg.pop("type"))(**cfg)

b站up啥都生维护的分类项目
这段代码的功能是完成模型搭建,其中有三个python的巧妙用法,这里是自己的理解,有不对的地方希望各路大佬指出!

  • ①eval语句(将参数变成函数返回)
  • ②初始化__init__文件的作用(调包列表)
  • ***解包语法(*是将列表解包为单个元素**是解包字典)
  • isinstance和sequential

1.eval 语句

这个函数的功能是将参数变为可执行语句。
例子:
例子1

2.**语法

2.1 单个*

  • 2.1.1 单个*表示乘和倍数(用在两个变量中间)
print(3*4)         # 输出:12
print('nihao '*3)  # 输出:nihao nihao nihao 
  • 2.1.2 单个*表示组合、解包元组(用在单个变量前)
# 组合
# 接受任意多个参数放在一个元组内   
def demo(*p):
    print(p)


demo((1,2,3))      # 输出:((1, 2, 3),)
demo(1,2,3)        # 输出:(1, 2, 3)
# 解包
# 函数串参时将一个参数解包为三个
def demo(a, b, c):
    print(a, b, c)
a1 = ['ni', 'hao', 'a']
b1 = ['da', 'tai', 'yang']
c1 = ['shu', 'ya', 'zi']
demo(a1,b1,c1)  # 输出: ['ni', 'hao', 'a'] ['da', 'tai', 'yang'] ['shu', 'ya', 'zi']
# 这句中的*语法就是将a数组的三个元素解包,变为三个字符串分别传给形参a,b,c
demo(*a1)       # 输出: ni hao a 

# 解包为独立的元素输出
a = [1,2,3,4]
print(*a, sep='--')  # 输出:1--2--3--4

2.2 双星号**

  • 2.2.1 双星号**表示取幂(用在两个变量之间)
print(7**2)  # 输出:49
  • 2.2.2双星号**表示组合、解包字典(用在单个变量前)
# 组合
def demo(**p):
    return p
print(demo(x=1,y=2,z=6,q=9)) #输出:{'x': 1, 'y': 2, 'z': 6, 'q': 9}
# 解包
dic = {'x':'1','y':'2','z':'6'}
for s in dic:
    print(dic.get(s))
st = "{z}---{z}---{z} ".format(**dic)
st2 = '{z}---{x}---{x}---{y}'.format(**dic)
print(st, st2)           #输出:6---6---6  6---1---1---2

3.__init__初始化文件

导包的时候from某某import **号表示导入该文件夹下所有包,那是如何精确导入呢?
通过在文件夹下定义__init__.py文件:把该文件夹视作一个模块,当某程序调用该文件夹功能是率先访问__init__.py文件
当我们使用from某某import *导包时,首先访问的是__init__.py文件中的__all__列表,该列表中的元素就是按顺序对应前面导入的模型。
在这里插入图片描述

4 在代码中的解析

  1. 首先判断传入参数是不是列表
  • isinstance
    作用:判断是否是同一类型,返回true or false
    在这段代码中就是判断cfg是不是列表
isinstance(object, classinfo)
object -- 实例对象。
classinfo -- 可以是直接或间接类名、基本类型或者由它们组成的元组
isinstance()type() 区别:

type() 不会认为子类是一种父类类型,不考虑继承关系。
isinstance() 会认为子类是一种父类类型,考虑继承关系。
如果要判断两个类型是否相同推荐使用 isinstance()
  1. 如果是列表
    代码使用列表推导式遍历cfg列表,将其中的每个字典元素cfg_处理成一个模块实例,并将所有模块组成一个modules列表。列表中的每个字典元素表示一个模块的配置,其中"type"键对应的值是模块的类名(字符串形式),其他键值对是模块的初始化参数。
    eval(cfg_.pop(“type”))这一部分是为了根据字符串形式的模块类名创建模块实例。eval()函数将字符串作为表达式进行求值,从而创建相应的模块实例。pop(“type”)用于从cfg_字典中弹出键为"type"的元素,以便接下来的**cfg_只包含模块的初始化参数。
    最后,使用Sequential(*modules)将所有的模块组成一个Sequential模型,并将其作为函数的返回值

  2. 如果不是列表
    这里的处理方式与之前类似,但是不同之处在于这里的cfg表示一个模块的配置字典,而不是多个模块的配置列表。代码首先使用eval()根据字符串形式的模块类名创建模块实例,然后将配置参数**cfg传递给模块的初始化函数来创建模块实例,并将其作为函数的返回值。
    请注意,由于代码使用了eval()函数,这可能会导致潜在的安全风险,特别是如果cfg的内容来自不受信任的来源。如果可能的话,最好使用其他方法来创建模块实例,比如通过模块类名的映射字典,以避免eval()的使用。
    总结起来,这段代码是一个根据传入配置cfg构建神经网络模型的函数,如果cfg是列表,则构建一个由多个模块组成的Sequential模型,如果cfg是字典,则构建单个模块。在创建模块时,cfg中的"type"键对应的字符串表示模块类名,其他键值对表示模块的初始化参数。

例如cfg是model_cfg的实例化对象如下所示
在这里插入图片描述
在这里插入图片描述

  • 每个模型需要的初始化参数是如何传入的?
    主要是return eval(cfg.pop("type"))(**cfg)
    pop后字典剩下的键值传入给对应的模型也就是类别class,这也解释了为什么不用get,pop仅让我们找到指定的模型,若全部传入则会报错没有定义type匹配不上.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/826577.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Cesium态势标绘专题-文本标注(标绘+编辑)

标绘专题介绍:态势标绘专题介绍_总要学点什么的博客-CSDN博客 入口文件:Cesium态势标绘专题-入口_总要学点什么的博客-CSDN博客 辅助文件:Cesium态势标绘专题-辅助文件_总要学点什么的博客-CSDN博客 本专题没有废话,只有代码,代码中涉及到的引入文件方法,从上面三个链…

Vue模版语法

先看以下例题是回顾vue的用法 <body><div id"box">{{myname}} - {{myage}}</div><script>var vm new Vue({el:"#box",data:{myname:"lyx",myage:26}})</script></body> 运行结果如下&#xff1a;vue对象被…

什么是熵?

熵&#xff08;Entropy&#xff09;是一个重要的概念&#xff0c;最初出现在热力学领域&#xff0c;用于描述系统的混乱程度或不确定性。熵也被广泛应用于信息理论、统计学和计算机科学等领域。通常来讲&#xff0c;熵&#xff0c;是对混乱程度、不确定程度的度量。熵越大&…

【测试学习三】软件测试的生命周期 BUG的相关知识

目录 一、软件测试的生命周期&#xff08;重要&#xff09; &#x1f351;1、软件的生命周期&#xff1f; &#x1f351;2、软件测试的生命周期&#xff1f; 二、关于BUG &#x1f351;1、如何描述与定义一个BUG&#xff1f;&#xff08;了解&#xff09; &#x1f351;2…

分时电价调整后上海储能项目投资回收期分析-安科瑞黄安南

2022年12月16日&#xff0c;上海市发改委发布《关于进一步完善我市分时电价机制有关事项的通知》(沪发改价管〔2022〕50号)。通知明确上海分时电价机制&#xff0c;一般工商业及其他两部制、大工业两部制用电夏季&#xff08;7、8、9月&#xff09;和冬季&#xff08;1、12月&a…

Tomcat安装与管理

文章目录 Tomcat安装及管理Tomcat gz包安装&#xff1a;JDK安装&#xff1a;Tomcat安装&#xff1a;修改配置文件&#xff08;如下&#xff09;&#xff1a;服务启动配置&#xff1a; Tomcat-管理(部署jpress)&#xff1a;修改允许访问的主机修改允许管理APP的主机进入管理&…

实用干货!一文读懂Salesforce中6种数据关系类型!

Salesforce中对象之间的数据关系可能是一个棘手的话题。对于创建自定义对象的业务场景&#xff0c;需要决定使用哪些关系类型来扩展Salesforce数据模型。 01 查找关系 查找关系&#xff08;Lookup Relationships&#xff09;是一种松散耦合&#xff08;loosely coupled&…

【SQL】-【计算两个varchar类型的timestamp的毫秒差】

背景 TRANSTAMP3、TRANSTAMP2在Oracle数据库中的类型为varchar&#xff0c;但实际保存的值是时间戳timestamp类型&#xff0c;现在要计算二者的毫秒差 Oracle或MySQL extract(second from (to_timestamp(TRANSTAMP3,yyyy-mm-dd hh24:mi:ss.ff) - to_timestamp(TRANSTAMP2,yyy…

盘点那些不想骑车的原因和借口。

在自行车骑行的热潮中&#xff0c;我们都会找到各种千奇百怪的借口来解释我们为什么不想骑。本文将结合当前热点话题和趋势&#xff0c;从心理学、文化等多个角度&#xff0c;深入探讨这些借口背后的原因。 首先&#xff0c;我们不能忽视的是&#xff0c;骑行是一项需要耐力和毅…

web集群学习

目录 简述静态网页和动态网页的区别 Webl.0 和 Web2.0 的区别 安装tomcat8&#xff0c;配置服务启动脚本&#xff0c;部署jpress应用 1、安装jdk文件&#xff1a; 2、下载tomcat的二进制包&#xff1a; 3、创建用户组和用户 创建Tomcat的登录服务脚本 此处创建的登录服务…

代码随想录算法训练营第三十二天 | 全是没接触过的知识点,要复习

以下题目多次复习 200 岛屿数量未看解答自己编写的青春版重点本题的解题思路&#xff0c;也是之前没有接触过的&#xff0c;四字总结&#xff1a;学会感染&#xff01; 题解的代码日后复习重新编写 32 最长有效括号未看解答自己编写的青春版重点这道题&#xff0c;动态规划的思…

19-2.vuex

目录 1 安装 2 挂载 2.1 vue2写法 2.2 vue3写法 3 state 3.1 声明数据 3.2 使用数据 3.3 处理数据 4 mutations 4.1 基本使用 4.2 传递参数 4.3 mutations中不能写异步的代码 5 actions 5.1 基本使用 5.2 传递参数 6 getters Vuex是做全局数据…

CAS原理解析

CAS是一种乐观锁机制&#xff0c;一种比较并交换的过程和理念&#xff0c;用来解决线程安全问题&#xff0c;具体来讲就是对共享变量值的安全更新机制。能够保证原子、可见、一致性。这种交换过程是在Unsafe类中实现。 从一段简单的代码开始来对源码做分析 public static void…

坚鹏:常德市银行业协会BLM银行数字化转型战略培训圆满结束

常德市银行业协会BLM银行数字化转型战略培训圆满结束 在数字化转型背景下&#xff0c;常德市银行业协会为了落实监管政策《关于银行业保险业数字化转型的指导意见》&#xff0c;充分认识到学习银行银行数字化转型战略的价值和重要性&#xff0c;特别举办《2023年数字化转型战略…

06 Ubuntu22.04上的miniconda3安装、深度学习常用环境配置

下载脚本 我依然是在清华镜像当中寻找的脚本。这里找脚本真的十分方便&#xff0c;我十分推荐。 wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/Miniconda3-latest-Linux-x86_64.sh 下载十分快速&#xff0c;10秒解决问题 运行miniconda3安装脚本 赋予执…

邀请媒体现场报道,有哪些作用?

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 邀请媒体现场报道活动具有多种重要作用和意义&#xff0c;可以为你的活动带来广泛的曝光和正面影响。以下是一些邀请媒体现场报道的作用和意义&#xff1a; 1. 增加活动曝光度&#xff…

Android 自定义按钮(可滑动、点击)

按钮图片素材 https://download.csdn.net/download/Lan_Se_Tian_Ma/88151085 px 和 dp 转换工具类&#xff08;Java&#xff09; // px 和 dp 转换工具类 public class DensityUtil {/*** 根据手机的分辨率从 dip 的单位 转成为 px(像素)*/public static int dip2px(Conte…

C 语言多线程(上)

一&#xff0c;线程创建 1.1 每一个线程都有一个唯一的线程ID&#xff0c;ID类型为pthread_t&#xff0c;这个ID是一个无符号长整形数&#xff0c;如果想要得到当前线程的线程ID&#xff0c;可以调用如下函数&#xff1a; pthread_t pthread_self(void); // 返回当前线程的线…

如何设计一个自动化测试框架?

一个成熟的测试框架主要由 4 部分组成&#xff1a;基础模块、管理模块、运行模块和统计模块 基础模块 底层核心库 一般指用于操作被测试应用程序的第三方库&#xff0c;例如在 Web 端的 Selenium/WebDriver。如API端的Requests 对象库 PO模式中的页面对象 可重用组件 如一些…

JavaScript 手撕大厂面试题数组扁平化以及增加版本 plus

前言 现在的前端面试手撕题是一个必要环节&#xff0c;有点时候八股回答的不错但是手撕题没写出来就会让面试官印象分大减&#xff0c;很可能就挂了… 概念 数组的扁平化其实就是将一个多层嵌套的数组转换为只有一层的数组 比如&#xff1a; [1, [2, [3, [4, 5]]]] > [1…