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

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匹配不上.

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Web后端基本设计思想

JavaWeb应用的后端一般基于MVC和三层架构思想实现。 MVC是一种设计模式,用于开发用户界面和交互式应用程序。M即Model,业务模型,负责处理应用程序的业务逻辑和数据;V即View,视图,负责给用户展示界面和数据&…

3ds Max建模教程:模拟布料拖拽撕裂和用剑撕裂两种效果

推荐: NSDT场景编辑器 助你快速搭建可二次开发的3D应用场景 1. 拖拽撕布 步骤 1 打开 3ds Max。 打开 3ds Max 步骤 2 在透视视口中创建平面。保持其长度 后座和宽度后座为 100。 创建平面 步骤 3 转到助手>假人并在 飞机的两侧。 助手>假人 步骤 4 选…

基础实验篇 | PX4控制器的外部通信

PX4控制器的外部通信 01 实验名称及目的 PX4控制器的外部通信:在进行硬件在环仿真时,我们常常需要向设计的Simulink控制器中发送数据(传感器数据、故障触发、控制指令、参数调整等),同时接收一些感兴趣的数据。RflySi…

ELK 企业级日志分析系统(一)

目录 一、ELK 简介 1.1 组件说明 1.2 为什么要使用ELK 1.3 完整日志系统的基本特征 1.4 ELK工作原理 二、Elasticsearch的介绍 2.1 Elasticsearch的核心: 三、Logstash 3.1 Logstash简介 四、Kibana 五、部署ELK日志分析系统 5.1 服务器配置 5.2 ELK Elasticse…

在PHP8中检测数据类型-PHP8知识详解

在PHP 8中,可以使用多种方法来检测数据类型。以下是常用的四种方法:使用 gettype() 函数、使用 is_* 系列函数、使用 get_debug_type() 函数、使用 get_class() 函数。 一、使用 gettype() 函数 gettype() 函数返回给定变量的数据类型。例如&#xff1a…

机器学习-New Optimization

机器学习(New Optimization) 前言: 学习资料 videopptblog 下面的PPT里面有一些符号错误,但是我还是按照PPT的内容编写公式,自己知道符号表示什么含义就好了 New Optimization 机器学习(New Optimization)NotationOn-line VS Off-line常用优…

Html5播放器按钮在移动端变小的问题解决方法

Html5播放器按钮在移动端变小的问题解决方法 用手机浏览器打开酷播云视频&#xff0c;有时会出现播放器按钮太小的情况&#xff0c;此时只需在<head>中加入下面这段代码即可解决&#xff1a; <meta name"viewport" content"widthdevice-width, initia…

Python入门二

目录&#xff1a; python封装与property装饰器python继承与类型检查python多态与superpython 模块与包错误与异常Debug 调试与分析python类型注解python数据类dataclasspython内置装饰器python装饰器学生信息管理系统 1.python封装与property装饰器 封装的概念 封装&#x…

如何压缩高清PDF文件大小?将PDF文件压缩到最小的三个方法

PDF格式是一种非常常用的文档格式&#xff0c;但是有时候我们需要将PDF文件压缩为更小的大小以便于传输和存储。在本文中&#xff0c;我们将介绍三种PDF压缩的方法&#xff0c;包括在线PDF压缩、利用软件PDF压缩以及使用WPS缩小pdf。 首先&#xff0c;在线PDF压缩是最常用的方…

《cuda c编程权威指南》04 - 使用块和线程索引映射矩阵索引

目录 1. 解决的问题 2. 分析 3. 方法 4. 代码示例 1. 解决的问题 利用块和线程索引&#xff0c;从全局内存中访问指定的数据。 2. 分析 通常情况下&#xff0c;矩阵是用行优先的方法在全局内存中线性存储的。如下。 8列6行矩阵&#xff08;nx,ny&#xff09;&#xff08;…

JVM内存结构

JVM内存结构 5个部分 程序计数器 Java 虚拟机栈 本地方法栈 堆 方法区 JDK 1.8 同 JDK 1.7 比&#xff0c;最大的差别就是&#xff1a;元数据区取代了永久代。元空间的本质和永久代类似&#xff0c;都是对 JVM 规范中方法区的实现。不过元空间与永久代之间最大的区别在于…

获取 NGINX QUIC+HTTP/3 预览版的二进制包

原文作者&#xff1a;Robert Haynes of F5 原文链接&#xff1a;获取 NGINX QUICHTTP/3 预览版的二进制包 转载来源&#xff1a;NGINX 官方网站 我们很高兴宣布&#xff0c;NGINX QUICHTTP/3 预览版现提供以下两个发行版的预构建二进制包&#xff1a; Red Hat Enterprise Linux…

java实现5种不同的验证码图片,包括中文、算式等,并返回前端

导入以下依赖 <!--图片验证码--><dependency><groupId>com.github.whvcse</groupId><artifactId>easy-captcha</artifactId><version>1.6.2</version></dependency> 编写controller package com.anXin.user.controlle…

牛客网Verilog刷题——VL42

牛客网Verilog刷题——VL42 题目答案 题目 请设计一个可以实现任意小数分频的时钟分频器&#xff0c;比如说8.7分频的时钟信号&#xff0c;注意rst为低电平复位。提示&#xff1a;其实本质上是一个简单的数学问题&#xff0c;即如何使用最小公倍数得到时钟周期的分别频比。设小…

级联选择框

文章目录 实现级联选择框效果图实现前端工具版本添加依赖main.js导入依赖级联选择框样式 后端数据库设计 实现级联选择框 效果图 实现 前端 工具版本 node.js v16.6.0vue3 级联选择框使用 Element-Plus 实现 添加依赖 在 package.json 添加依赖&#xff0c;并 npm i 导入…

高通滤波器,低通滤波器

1.高通滤波器是根据像素与邻近像素的亮度差值来提升该像素的亮度。 import cv2 import numpy as np from scipy import ndimagekernel_3_3 np.array([[-1,-1,-1],[-1,8,-1],[-1,-1,-1]]) print(kernel_3_3) kernel_5_5 np.array([[-1,-1,-1,-1,-1],[-1,1,2,1,-1],[-1,2,4,2,-…

iOS——锁与死锁问题

iOS中的锁 什么是锁锁的分类互斥锁1. synchronized2. NSLock3. pthread 递归锁1. NSRecursiveLock2. pthread 信号量Semaphore1. dispatch_semaphore_t2. pthread 条件锁1. NSCodition2. NSCoditionLock3. POSIX Conditions 分布式锁NSDistributedLock 读写锁1. dispatch_barri…

C++设计模式之责任链设计模式

C责任链设计模式 什么是责任链设计模式 责任链设计模式是一种行为型设计模式&#xff0c;它允许多个处理请求的对象串联起来&#xff0c;形成一个处理请求的链。每个对象都有机会处理请求&#xff0c;如果该对象不能处理请求&#xff0c;则将请求传递给链中的下一个对象。 该…

2023年华数杯建模思路 - 案例:随机森林

## 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 什么是随机森林&#xff1f; 随机森林属于 集成学习 中的 Bagging&#xff08;Bootstrap AGgregation 的简称&#xff09; 方法。如果用图来表示他们之…

51单片机学习--蜂鸣器播放音乐

由原理图可知&#xff0c;蜂鸣器BEEP与P1_5 相关&#xff0c;但其实这个原理图有错&#xff0c;实测接的是P2_5 下面这个代码就是以500HZ的频率响500ms的例子 sbit Buzzer P2^5;unsigned char KeyNum; unsigned int i;void main() {while(1){KeyNum Key();if(KeyNum){for(i …