当前位置: 首页 > news >正文

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

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

相关文章:

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

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啥都生维护的分类项目 这段代码的功能是完成模型搭建,…...

Ubuntu出现了内部错误

使用的Ubuntu版本是18.04,使用的时候弹出对话框说出现了内部错误,好奇是哪里出现了错误,查找了一下解决的办法,记录一下。 参考解决方案:ubantu出现了内部错误 一旦程序崩溃过一次,就会生成一个.crash文件…...

Stable Diffusion AI绘画初学者指南【概述、云端环境搭建】

概述、云端环境搭建 Stable Diffusion 是什么、能干啥? 是一种基于深度学习的图像处理技术,可以生成高质量的图像。它可以在不需要真实图像的情况下,通过文字描述来生成逼真的图像。 可以对图像进行修复、超分辨率转换,将低分辨…...

小程序动态隐藏分享按钮

// 禁用分享 wx.hideShareMenu({menus: [shareAppMessage, shareTimeline] })// 显示分享 wx.showShareMenu({withShareTicket: true,menus: [shareAppMessage, shareTimeline] })//私密消息 wx.updateShareMenu({isPrivateMessage: true, })...

语音合成是什么?如何进行语音合成TTS数据采集?

我们在上一篇讲到语音数据采集分为常见的两种语音数据采集类型,一个是语音识别数据(ASR),另一个是语音合成(TTS)。这一期中,我们将介绍语音合成技术是什么,如何采集语音合成数据和制…...

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

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

Spring引入外部数据源

spring-dataSource.xml 数据源配置文件 <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema/beans"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xmlns:context"h…...

word里的页码问题

封面不需要页码怎么办 一份文档写完&#xff0c;如果需要页码&#xff0c;第一页是封面&#xff0c;封面不需要页码怎么办&#xff1f; 解决&#xff1a;打开页眉页脚&#xff0c;然后把首页不同勾选上&#xff0c;这一页就没有页码了。 目录页与正文页码格式不同怎么办 目录…...

​LeetCode解法汇总142. 环形链表 II

目录链接&#xff1a; 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目&#xff1a; https://github.com/September26/java-algorithms 原题链接&#xff1a; 力扣 描述&#xff1a; 给定一个链表的头节点 head &#xff0c;返回链表开始入环的第一个节点。 如…...

危化品行业防雷检测综合解决方案

危化品是指具有毒害、腐蚀、爆炸、燃烧、助燃等性质&#xff0c;能够对人体、设施或者环境造成危害的化学品。危化品的生产、储存、运输、使用等过程中&#xff0c;都存在着遭受雷击引发火灾或者爆炸事故的风险。因此&#xff0c;对危化品场所进行防雷检测&#xff0c;是保障危…...

刷题笔记:day 1

力扣 283 移动零 解法一&#xff1a;双指针 定义一个指针 cur 去遍历数组 &#xff1b; 定义一个指针 dest 去指向已处理区间中&#xff0c;非零的最后一个位置。 然后让 指针 cur 遇到 0 &#xff0c;就往后走 &#xff1b; 遇到的数不是 0 &#xff0c;就与 dest指针的下…...

Linux——平台设备及其驱动

目录 前言 一、平台设备 二、平台驱动 三、平台驱动简单实例 四、 电源管理 五、udev 和驱动的自动加载 六、使用平台设备的LED 驱动 七、自动创建设备节点 前言 要满足 Linux 设备模型&#xff0c;就必须有总线、设备和驱动。但是有的设备并没有对应的物理总线&#x…...

【C语言技巧】三种多组输入的写法

文章目录 第一种&#xff1a;直接与1判断第二种&#xff1a;与EOF判断第三种&#xff1a;巧用按位取反符号“~”写在最后 在代码的实际运用中&#xff0c;我们经常会遇到需要多组输入的情况&#xff0c;那么今天博主就带大家一起盘点三种常见的多组输入的写法 第一种&#xff1…...

DB2数据库巡检脚本

DB2数据库巡检脚本的示例&#xff1a; #!/bin/bash# 设置DB2登录凭证 DB2_USER"your_username" DB2_PASSWORD"your_password"# 设置巡检结果输出文件路径 OUTPUT_FILE"/path/to/output.log"# 获取DB2版本信息 version_info$(db2 connect to you…...

Eureka 学习笔记3:EurekaHttpClient

版本 awsVersion ‘1.11.277’ EurekaTransport 用于客户端和服务端之间进行通信&#xff0c;封装了以下接口的实现&#xff1a; ClosableResolver 接口实现TransportClientFactory 接口实现EurekaHttpClient 接口实现及其对应的 EurekaHttpClientFactory 接口实现 private …...

Android Framework 之 启动流程

Android 系统的启动流程 Android 系统的启动流程可以分为以下几个主要步骤&#xff1a; 引导加载器&#xff08;Bootloader&#xff09;启动&#xff1a;当你打开一个 Android 设备时&#xff0c;首先启动的是引导加载器。引导加载器负责启动 Android 的核心操作系统。 Linux…...

Qt、C/C++环境中内嵌LUA脚本、实现LUA函数的调用执行

Qt、C/C环境中内嵌LUA脚本、实现LUA函数的调用执行 Chapter1. Qt、C/C环境中内嵌LUA脚本、实现LUA函数的调用执行1、LUA简介2、LUA脚本的解释器和编译器3、C环境中内嵌LUA执行LUA函数调用4、Qt内嵌LUA执行LUA函数调用5、运行结果6、内嵌LUA脚本在实际项目中的案例应用 Chapter1…...

超详细 | 模拟退火算法及其MATLAB实现

模拟退火算法(simulated annealing&#xff0c;SA)是20世纪80年代初期发展起来的一种求解大规模组合优化问题的随机性方法。它以优化问题的求解与物理系统退火过程的相似性为基础&#xff0c;利用Metropolis算法并适当地控制温度的下降过程实现模拟退火&#xff0c;从而达到求解…...

在线餐饮油烟实时监测系统的设计与实现

安科瑞 华楠 摘 要&#xff1a;为了解决传统油烟检测方法中成本高、效率低、实时性差等问题&#xff0c;设计开发了一种在线油烟实时监测系统&#xff1b;系统由采集、通讯、服务器和用户交互四个模块组成&#xff1b;采集模块采集油烟数据&#xff0c;通过GPRS通讯技术将数据发…...

7-2 凯撒密码 (20分)

7-2 凯撒密码 (20分) 为了防止信息被别人轻易窃取&#xff0c;需要把电码明文通过加密方式变换成为密文。输入一个以回车符为结束标志的字符串&#xff08;少于80个字符&#xff09;&#xff0c;再输入一个整数offset&#xff0c;用凯撒密码将其加密后输出。恺撒密码是一种简单…...

Linux内核数据结构与算法深度解析

Linux内核中常用的数据结构和算法分析 1. 链表数据结构实现与应用 1.1 链表基础结构 链表是Linux内核中使用最广泛的数据结构之一&#xff0c;它解决了数组不能动态扩展的缺陷。链表元素可以动态创建、插入和删除&#xff0c;且不需要占用连续内存空间。每个链表节点由两部分…...

EtherCAT模块化实战:如何为你的设备设计可热插拔的IO模块(基于SSC与0x4711示例)

EtherCAT模块化实战&#xff1a;如何为你的设备设计可热插拔的IO模块 在工业自动化领域&#xff0c;设备的灵活性和可扩展性正变得越来越重要。想象一下&#xff0c;当你的客户需要在生产线上快速更换不同类型的传感器或执行器时&#xff0c;如果每次硬件变更都需要重新配置整个…...

CANdb++ Editor高效使用技巧:5个隐藏功能大幅提升dbc编辑效率

CANdb Editor高效使用技巧&#xff1a;5个隐藏功能大幅提升dbc编辑效率 在汽车电子开发领域&#xff0c;Vector的CANdb Editor堪称dbc文件编辑的行业标准工具。大多数工程师都能熟练使用其基础功能&#xff0c;但真正的高手往往掌握着那些鲜为人知的"秘密武器"。本文…...

多智能体协作四大架构模式:Subagents/Skills/Handoffs/Router完全指南

← 上一篇&#xff1a;AI大模型3月终局&#xff1a;商业化转向、智能体崛起与安全红线 → 下一篇&#xff1a;大模型推理加速2026&#xff1a;从500ms到80ms的完整优化路径 摘要 当单个 AI Agent 无法高效处理复杂任务时&#xff0c;多智能体系统&#xff08;Multi-Agent Sys…...

Llama-3.2V-11B-cot从零部署:Docker镜像运行与端口映射详解

Llama-3.2V-11B-cot从零部署&#xff1a;Docker镜像运行与端口映射详解 1. 项目概述 Llama-3.2V-11B-cot是基于Meta Llama-3.2V-11B-cot多模态大模型开发的高性能视觉推理工具。它针对双卡4090环境进行了深度优化&#xff0c;特别适合想要体验Llama多模态大模型但缺乏专业部署…...

手柄硬件校准与操控优化:从故障排查到竞技级设置的实战手册

手柄硬件校准与操控优化&#xff1a;从故障排查到竞技级设置的实战手册 【免费下载链接】DS4Windows Like those other ds4tools, but sexier 项目地址: https://gitcode.com/gh_mirrors/ds/DS4Windows 在《艾尔登法环》的 boss 战中&#xff0c;角色总是不受控制地缓慢…...

告别SIFT/ORB!用LoFTR+Transformer搞定低纹理场景的图片匹配(附Python实战代码)

低纹理场景图像匹配实战&#xff1a;LoFTR与Transformer的革新应用 在计算机视觉领域&#xff0c;图像特征匹配一直是三维重建、视觉定位等任务的基础环节。传统方法如SIFT、ORB依赖于特征检测器提取关键点&#xff0c;但在低纹理、重复图案或运动模糊场景中表现往往不尽如人意…...

Spring Framework测试框架完整指南:从单元测试到集成测试的10个最佳实践

Spring Framework测试框架完整指南&#xff1a;从单元测试到集成测试的10个最佳实践 【免费下载链接】spring-framework spring-projects/spring-framework: 一个基于 Java 的开源应用程序框架&#xff0c;用于构建企业级 Java 应用程序。适合用于构建各种企业级 Java 应用程序…...

python基于微信小程序的智慧社区娱乐服务管理平台

目录需求分析与规划技术架构设计功能模块开发实时交互实现数据可视化测试与部署安全与优化迭代计划项目技术支持源码获取详细视频演示 &#xff1a;文章底部获取博主联系方式&#xff01;同行可合作需求分析与规划 明确平台核心功能&#xff1a;居民活动报名、场地预约、社区公…...

开源编解码工具技术选型与实战指南:跨场景应用的H.264解决方案

开源编解码工具技术选型与实战指南&#xff1a;跨场景应用的H.264解决方案 【免费下载链接】openh264 Open Source H.264 Codec 项目地址: https://gitcode.com/gh_mirrors/op/openh264 一、价值定位&#xff1a;为什么开源编解码工具是技术选型的最优解 在视频技术快…...