当前位置: 首页 > 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;用凯撒密码将其加密后输出。恺撒密码是一种简单…...

idea大量爆红问题解决

问题描述 在学习和工作中&#xff0c;idea是程序员不可缺少的一个工具&#xff0c;但是突然在有些时候就会出现大量爆红的问题&#xff0c;发现无法跳转&#xff0c;无论是关机重启或者是替换root都无法解决 就是如上所展示的问题&#xff0c;但是程序依然可以启动。 问题解决…...

基于Flask实现的医疗保险欺诈识别监测模型

基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施&#xff0c;由雇主和个人按一定比例缴纳保险费&#xff0c;建立社会医疗保险基金&#xff0c;支付雇员医疗费用的一种医疗保险制度&#xff0c; 它是促进社会文明和进步的…...

转转集团旗下首家二手多品类循环仓店“超级转转”开业

6月9日&#xff0c;国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解&#xff0c;“超级…...

【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】

1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件&#xff08;System Property Definition File&#xff09;&#xff0c;用于声明和管理 Bluetooth 模块相…...

Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!

一、引言 在数据驱动的背景下&#xff0c;知识图谱凭借其高效的信息组织能力&#xff0c;正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合&#xff0c;探讨知识图谱开发的实现细节&#xff0c;帮助读者掌握该技术栈在实际项目中的落地方法。 …...

爬虫基础学习day2

# 爬虫设计领域 工商&#xff1a;企查查、天眼查短视频&#xff1a;抖音、快手、西瓜 ---> 飞瓜电商&#xff1a;京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空&#xff1a;抓取所有航空公司价格 ---> 去哪儿自媒体&#xff1a;采集自媒体数据进…...

Spring数据访问模块设计

前面我们已经完成了IoC和web模块的设计&#xff0c;聪明的码友立马就知道了&#xff0c;该到数据访问模块了&#xff0c;要不就这俩玩个6啊&#xff0c;查库势在必行&#xff0c;至此&#xff0c;它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据&#xff08;数据库、No…...

基于SpringBoot在线拍卖系统的设计和实现

摘 要 随着社会的发展&#xff0c;社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统&#xff0c;主要的模块包括管理员&#xff1b;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...

【LeetCode】3309. 连接二进制表示可形成的最大数值(递归|回溯|位运算)

LeetCode 3309. 连接二进制表示可形成的最大数值&#xff08;中等&#xff09; 题目描述解题思路Java代码 题目描述 题目链接&#xff1a;LeetCode 3309. 连接二进制表示可形成的最大数值&#xff08;中等&#xff09; 给你一个长度为 3 的整数数组 nums。 现以某种顺序 连接…...

HubSpot推出与ChatGPT的深度集成引发兴奋与担忧

上周三&#xff0c;HubSpot宣布已构建与ChatGPT的深度集成&#xff0c;这一消息在HubSpot用户和营销技术观察者中引发了极大的兴奋&#xff0c;但同时也存在一些关于数据安全的担忧。 许多网络声音声称&#xff0c;这对SaaS应用程序和人工智能而言是一场范式转变。 但向任何技…...