【深度学习】宠物品种分类Pet Breeds Classifier
文章目录
- 宠物品种数据集
- 制作宠物品种标签
- 图像预处理Presizing
- 损失函数loss
- 观察模型的性能
- 提升模型的性能
- learning rate finder
- 使用CLR算法训练
- 选择学习率的策略
- 重新训练
- 迁移学习
- 微调fine_tune
- fit_one_cycle
- 有判别力的学习率
- 选择epoch的数量
- 更深的网络架构
宠物品种数据集
这里我们使用fastai深度学习库。
from fastai.vision.all import *
从fastai的官网下载Pets数据集,解压至本地文件夹内。
path = untar_data(URLs.PETS)
Path.BASE_PATH = path
path.ls()
制作宠物品种标签
annotations目录内的文件主要告诉了我们宠物在图像的具体位置,但我们今天要完成的任务是宠物分类。所以我们需要重新制作标签。
fname = (path/"images").ls()[0]
fname
这是一张图片的文件名,格式为“宠物名_编号.jpg”
我们的目的是提取出下划线前面的宠物名,这时候就需要用到正则表达式来提取字符串了。(正则表达式的讲解)
- (.+)可截取若干个任意字符,所以可以提取宠物品种名称
- _匹配下划线
- \d+匹配数字,在这里就是匹配了编号
- .jpg匹配后缀名
- $结束字符
re.findall(r'(.+)_\d+.jpg$', fname.name)
在fastai深度学习库中,我们有已经提前实现好的RegexLabeller类,同样实现了“根据正则表达式提取字符串”的功能,而且我们通常是在DataBlock代码块中使用。
pets = DataBlock(# Inputs类型:Image, Targets类型:Categoryblocks = (ImageBlock, CategoryBlock),# 从images目录下的子文件夹内获得数据get_items=get_image_files, splitter=RandomSplitter(seed=42),# 定义对targets所作的操作,然后得到yget_y=using_attr(RegexLabeller(r'(.+)_\d+.jpg$'), 'name'),# 裁剪图像item_tfms=Resize(460),# 数据增强batch_tfms=aug_transforms(size=224, min_scale=0.75))
dls = pets.dataloaders(path/"images")
图像预处理Presizing
接下来我们来研究一下这两行代码,
# 裁剪图像
item_tfms=Resize(460),
# 数据增强
batch_tfms=aug_transforms(size=224, min_scale=0.75))
为什么先裁剪图像然后数据增强呢?
因为在fastai深度学习库中,许多数据增强方法会让图像的质量下降,我们再裁剪的就是已经损坏的图像,那样对模型训练没有益处。
因此我们先将图像统一裁剪成460*460的大小,然后再进行数据增强。
如上图所示,Presize通常有两步:
1、把图像裁剪成相对较大的尺寸(比训练时的图像尺寸大)
2、把所有常见的数据增强增强操作变成一个组合操作,然后在GPU上执行组合操作
损失函数loss
我们使用的是交叉熵损失函数(cross-entropy loss),它适用于多目标分类。(cross-entropy loss讲解)
观察模型的性能
我们通常使用混淆矩阵confusion matrix来观察模型的表现。
如果图像的类别有n个,那么混淆矩阵的大小就是nxn,但是宠物的类别有37种,那混淆矩阵就太大了。
因此我们使用most_confused方法来查看在有着最多不正确的预测值的单元格(至少有5个)。
interp.most_confused(min_val=5)
根据研究,这两种情况下,即使是宠物专家也容易搞错,所以我们的模型效果还不错。
接下来就是考虑如何改进我们的模型了。
提升模型的性能
learning rate finder
learning rate finder的代码思想源自CLR(cyclical learning rates)算法
learning rate finder方法的主要步骤:
1、将训练集分成batch,每次循环训练一个batch
2、初始学习率(例如1e-6)较小,然后每次将学习率扩大(例如乘以2)后训练下一个batch
3、记录training loss,直到training loss不再变小反而变大停止
使用CLR算法训练
learn = vision_learner(dls, resnet34, metrics=error_rate)lr_min, lr_steep = learn.lr_find(suggest_funcs=(minimum, steep))
什么是minimum? 使training loss达到最小的点
什么是steep? 使training loss曲线下降坡度最大的点。
选择学习率的策略
print(f"Minimum/10: {lr_min:.2e}, steepest point: {lr_steep:.2e}")
根据loss-lr图,选择学习率的策略有以下2种:
1、使training loss达到最小的学习率,在这个数值上/10
2、最后一个使training loss明显下降的点附近
根据策略2,已经知道最陡的点是2.09e-3,我们在这里取最后一个使training loss明显下降的点大约为3e-3
重新训练
现在我们使用3e-3作为学习率,重新训练模型。
learn = vision_learner(dls, resnet34, metrics=error_rate)
learn.fine_tune(2, base_lr=3e-3)
观察结果,相较于使用1e-1,使用3e-3作为学习率训练模型,使error_rate从降低到0.073!
迁移学习
微调fine_tune
预训练模型是在Imagenet数据集上训练好的模型。
当我们做迁移学习的时候,我们去除网络架构的最后一层,然后加入新的全连接层,输出数量是数据集的标签类别个数。
fine_tune方法帮助我们实现了迁移学习,非常方便实用。
当我们调用fine_tune方法时,有以下2种策略:
1)训练新添加的层指定的epoch数量,其余的层全部都冻住
2)所有层都解冻,然后再重新训练指定的epoch数量
预训练网络模型的前面几层提取大多数图片的共有特征,如边框等,因此我们不想要重新训练前面几层的权重,所以只需要冻住freeze, 而最后几个新添加的层希望被用来学习新数据集的独有特征,因此我们想要训练新添加的层的权重,需要解冻unfreeze.
要想查看某个函数的源代码,只需在后面加上??即可。
这是fine_tune方法的源代码。
Signature:
learn.fine_tune(epochs,base_lr=0.002,freeze_epochs=1,lr_mult=100,pct_start=0.3,div=5.0,*,lr_max=None,div_final=100000.0,wd=None,moms=None,cbs=None,reset_opt=False,start_epoch=0,
)
Source:
@patch
@delegates(Learner.fit_one_cycle)
def fine_tune(self:Learner, epochs, base_lr=2e-3, freeze_epochs=1, lr_mult=100,pct_start=0.3, div=5.0, **kwargs):"Fine tune with `Learner.freeze` for `freeze_epochs`, then with `Learner.unfreeze` for `epochs`, using discriminative LR."self.freeze()self.fit_one_cycle(freeze_epochs, slice(base_lr), pct_start=0.99, **kwargs)base_lr /= 2self.unfreeze()self.fit_one_cycle(epochs, slice(base_lr/lr_mult, base_lr), pct_start=pct_start, div=div, **kwargs)
File: /usr/local/lib/python3.10/dist-packages/fastai/callback/schedule.py
Type: method
从上面可以看到,在源代码中使用了fit_one_cycle函数。
我们接下来自己手动模拟一个fine_tune函数。不过,在这之前,先来了解一下fit_one_cycle函数
fit_one_cycle
fit_one_cycle的作用是,先以较低的学习率开始训练,慢慢增加到指定最大学习率后,再逐渐减小学习率。
我们先训练模型3个epoch,创建好vision_learner以后,除新添加的层外,其余层默认是被冻住的。此时我们训练的就只有刚刚添加的层。
learn = vision_learner(dls, resnet34, metrics=error_rate)
learn.fit_one_cycle(3, lr_max=3e-3)
我们接下来查看学习率的变化曲线,以及损失的变化曲线
learn.recorder.plot_sched()
learn.recorder.plot_loss()
我们可以看出:
1)学习率一开始很小,loss比较大
2)学习率增大并逐渐到达最大值,loss变小
3)学习率又逐渐变小,loss也在变小
因此fit_one_cycle函数的代码实现了learning rate annealing算法,它也被称为学习率退火算法。
好了,话说回来,我们继续手动搭建自己的fine_tune函数,来训练我们的模型。
一开始我们训练了3个epoch,现在我们将模型所有的层都解冻。
learn.unfreeze()
我们需要重新再使用learning rate finder, 因为模型的权重已经发生了改变,所有我们要找到新的最佳的learning rate
learn.lr_find()
基于选择学习率的策略2,从上图中我们可以看出最后一个明显下降的点在1e-4附近,但我们选择略小一点的,所以是1e-5,接下来我们继续训练6个epoch
learn.fit_one_cycle(6, lr_max=1e-5)
从上图中可以看出,我们模型的error_rate已经从刚刚的0.074降低到0.059了!
有判别力的学习率
因为预训练的层已经能够识别边缘等,但对于具体任务的特征还需要训练,所以新添加的层就相较于预训练层使用大一点的学习率。
新论文中提出较早的层使用较小的学习率训练,新添加的层用较大的学习率训练。
Python中的slice(,)对象指明了学习率。
第一个参数,是用于训练第一层的学习率;第二个参数,是用于训练最后一层的学习率;中间的层的学习率是在这个范围内等距增加的。
先使用学习率3e-3训练3个epoch,然后将所有的网络参数解冻。然后再继续训练12个epoch,但不同的层学习率也不同,第一层为1e-6, 最后一层为1e-4, 中间的层等距增加。
learn = vision_learner(dls, resnet34, metrics=error_rate)
learn.fit_one_cycle(3, 3e-3)
learn.unfreeze()
learn.fit_one_cycle(12, lr_max=slice(1e-6,1e-4))
从上面的表格中我们可以发现,error_rate降低到了0.0541
我们来对比一下源代码,和我们基于自己模型创建的fine_tune方法
## 这是源代码
def fine_tune(self:Learner, epochs, base_lr=2e-3, freeze_epochs=1, lr_mult=100,pct_start=0.3, div=5.0, **kwargs):self.freeze()self.fit_one_cycle(freeze_epochs, slice(base_lr), pct_start=0.99, **kwargs)base_lr /= 2self.unfreeze()self.fit_one_cycle(epochs, slice(base_lr/lr_mult, base_lr), pct_start=pct_start, div=div, **kwargs)## 这是我们自己的版本
learn = vision_learner(dls, resnet34, metrics=error_rate)
learn.fit_one_cycle(3, 3e-3)
learn.unfreeze()
learn.fit_one_cycle(12, lr_max=slice(1e-6,1e-4))
有人可能会想问“为什么源代码中就有self.freeze()呢?”
因为在初始化vision_learner的时候,其源函数中有这样一行代码,if pretrained: learn.freeze(),所有创建好learner对象后,其实已经处于冻结状态了。
选择epoch的数量
- 选择你愿意等待的训练时间的epoch数量,开始训练
- 观察training loss和validation loss图,也要注意metrics,如果在最后的几个epoch中,loss和metrics仍然能变得更好,那说明我们训练的时间还不够长
- 在训练的最后几个epoch中,validation loss变得更差,而且metrics也变得更差,说明我们训练的时间太长了。
- 此外,如果过拟合了,重新训练你的模型,并且基于之前的结果,重新设定epoch数。
在one cycle策略出现之前,我们通常使用early stopping早停策略。也就是,在训练的每一个epoch结束后,
我们会把权重保存下来,最后从中选择一个最佳的模型。 但有时候early stopping策略并不能使我们获得最好的结果,在学习率达到很小的值(同时让模型表现最佳)之前,中间的那些epoch已经发生了。
因此,如果你发现已经过拟合了,你要做的是重新训练你的模型,并且基于之前的结果,重新设定epoch数。
如果你有更多的时间训练更多的epoch,那么我们也可以选择把这么多的时间用于训练更多的参数,即更深的网络架构。
更深的网络架构
- 好处:一般来说,更深的网络架构意味着更多的参数,这也使得我们的模型能学习更多与数据相关的特征,使得准确率更高。
- 坏处:大量参数意味着需要占用很大的gpu内存,也需要很长的训练时间
因此,有一种方法叫作“半精度训练”,即在训练的时候,使用“半精度浮点数”(fp16),使得训练速度大大加快,也减少了内存使用。在fastai深度学习库中,我们直接让learner对象调用to_fp16()方法。
from fastai.callback.fp16 import *
learn = vision_learner(dls, resnet50, metrics=error_rate).to_fp16()
learn.fine_tune(6, freeze_epochs=3)
这里我自己采用resnet152,并且使用单精度训练的方式,冻住预训练权重并训练2个epoch;然后解冻模型并训练5个epoch
from fastai.callback.fp16 import *
learn = vision_learner(dls, resnet152, metrics=error_rate).to_fp16()
learn.fine_tune(5, freeze_epochs=2)
从下图可以看出,我的模型的error_rate降低到了0.045!
如果大家有更好的方法,欢迎大家评论,我很想学习。
相关文章:
【深度学习】宠物品种分类Pet Breeds Classifier
文章目录 宠物品种数据集制作宠物品种标签图像预处理Presizing 损失函数loss观察模型的性能提升模型的性能learning rate finder使用CLR算法训练选择学习率的策略重新训练 迁移学习微调fine_tunefit_one_cycle有判别力的学习率 选择epoch的数量更深的网络架构 宠物品种数据集 …...
PyQt组件间的通信方式
PyQt组件间的通信方式 PyQt组件间的通信方式 1. 组件介绍 1.1 组件的定义1.2 组件的分类 2. 组件的通信方式 2.1 信号与槽(Signal & Slot) 1. 组件介绍 在 Qt 框架中,组件(Component)是构建图形用户界面&am…...
基于编译器特性浅析C++程序性能优化
最近在恶补计算机基础知识,学到CSAPP第五章的内容,在这里总结并且展开一下C程序性能优化相关的内容。 衡量程序性能的方式 一般而言,程序的性能可以用CPE(Cycles Per Element)来衡量,其指的是处理每个元素…...
在 Docker 中搭建GBase 8s主备集群环境
本文介绍了如何在同一台机器上使用 Docker 容器搭建GBase 8s主备集群环境。 拉取镜像 拉取GBase 8s的最新镜像 docker pull liaosnet/gbase8s或者docker pull liaosnet/gbase8s:v8.8_3513x25_csdk_x64注:在tag为v8.8_3513x25_csdk_x64及之后的版本中,…...
hadoop集群环境配置
目录 VMware虚拟机安装 Xshell安装 网络问题 centos7下载 ---------参考以下视频步骤进行生态搭建---------- 搭建好hadoop01 克隆出hadoop02、hadoop03 启动三台虚拟机 打开终端 输入 记录下各个ip 打开Xshell,新建会话 修改主机名 配置静态IP 主机名称…...
Hive-优化(参数优化篇)
map 数和reduce数 控制hive任务中的map数 合适的map数,会让资源分配的更平均,让我们的代码运行更快,通常情况下,作业会通过input的目录产生一个或者多个map任务。我们可以通过调整参数来控制运行过程中的map数。 Hive Map的数量…...
深度学习|MAE技术全景图:自监督学习的“掩码魔法“如何重塑AI基础
一、引言:深度学习的困境与自监督的曙光 深度学习(Deep Learning)无疑是当今人工智能领域基础中的基础。从图像识别到自然语言处理(NLP),它在无数任务中展现了卓越性能。例如,在安防监控中&…...
学习threejs,使用LineBasicMaterial基础线材质
👨⚕️ 主页: gis分享者 👨⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨⚕️ 收录于专栏:threejs gis工程师 文章目录 一、🍀前言1.1 ☘️THREE.LineBasicMaterial1.…...
第本章:go 切片
注意: 切片必须要初始化 才能使用 ,切片是引用类型 a :[]int{} // 这上叫始化 此时并没有申请内存 // 如果要追加值的话: append ints : append(a, 1, 2, 3)a : make([]int,5) // 声明切片类型var a []string //声明一…...
dify + ollama + deepseek-r1+ stable-diffusion 构建绘画智能体
故事背景 stable-diffusion 集成进 dify 后,我们搭建一个小智能体,验证下文生图功能 业务流程 #mermaid-svg-6nSwwp69eMizP6bt {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-6nSwwp69eMiz…...
Java基础面试题全集
1. Java语言基础 1.1 Java是什么? • Java是一种广泛使用的编程语言,最初由Sun Microsystems(现为Oracle公司的一部分)于1995年发布。它是一种面向对象的、基于类的、通用型的编程语言,旨在让应用程序“编写一次&…...
基于multisim的自动干手器设计与仿真
1 设计的任务与要求 设计一个输出 5V 的直流稳压电源。用开关的闭合模拟手挡住光线的功能。用灯的亮灭模拟烘干吹风功能。 2 方案论证与选择 2.1 自动干手器的系统方案 本设计由5V直流电源、红外发射电路、红外接收电路、灯模拟电路构成。 1. 5V直流电源系统 这一部分是整…...
three.js 在 webGL 添加纹理
在我们生成了3D设计之后,我们可以添加纹理使其更加吸引人。在 webGL 和 p5.js中,可以使用 gl.texImage2D() 和 texture() API来为形状应用纹理。 使用 webGL 在 webGL 中,gl.texImage2D() 函数用于从图像文件生成2D纹理。该函数接受许多参…...
Docker 部署 MongoDB 并持久化数据
Docker 部署 MongoDB 并持久化数据 在现代开发中,MongoDB 作为 NoSQL 数据库广泛应用,而 Docker 则提供了高效的容器化方案。本教程将介绍如何使用 Docker 快速部署 MongoDB,并实现数据持久化,确保数据不会因容器重启或删除而丢失…...
SpringBoot优雅关机,监听关机事件,docker配置
Spring Boot 提供了多种方法来实现优雅停机(Graceful Shutdown),这意味着在关闭应用程序之前,它会等待当前正在处理的请求完成,并且不再接受新的请求。 一、优雅停机的基本概念 优雅停机的主要步骤如下: …...
网络基础(一)【网络发展/认识协议/网络 VS 系统/以太网通信原理/重谈协议/网络中的地址管理】
网络基础(一) 1. 网络的发展2. 认识协议3. 网络 VS 系统4. 以太网通信原理5. 重谈协议6. 网络中的地址管理 1. 网络的发展 最开始时,计算机之间相互独立。 但是为了协作完成一些任务,就产生了计算机之间相互通讯的需求,…...
PostgreSQL、SQL Server和MySQL数据库性能调优与故障排除技术
通过结合具体技术特性与工具链的深度使用,可系统化提升数据库性能和稳定性。建议根据实际负载特征制定监控-分析-优化的闭环管理流程。 数据库技术: PostgreSQL 13:逻辑复制、分区表、并行查询、监控工具(如pg_stat_statements、…...
本地YARN集群部署
请先完成HDFS的前置部署,部署方式可查看:本地部署HDFS集群https://blog.csdn.net/m0_73641796/article/details/145998092?spm1001.2014.3001.5502 部署说明 组件配置文件启动进程备注Hadoop HDFS需修改 需启动: NameNode作为主节点 DataNode作为从节点 Secondary…...
Redis数据结构——list
目录 列表命令 lpush lrange lpushx rpush rpushx lpop rpop lindex linsert llen lrem ltrim lset blpop / brpop 命令总结 编码方式 list相当于数组或者顺序表,但并不是简单的数组,更接近于C中的"双端队列"(deque)。 最左侧的下标…...
World of Warcraft [CLASSIC] BigFoot BiaoGe
World of Warcraft [CLASSIC] BigFoot BiaoGe 金团表格插件 设置60秒拍卖装备时间 ALT 鼠标左键,点击装备,弹出对话框,填写 1)拍卖时间默认60秒,起拍价, 2)点击【开始拍卖】 团队所有安装了…...
CentOS Docker 安装指南
CentOS Docker 安装指南 引言 Docker 是一个开源的应用容器引擎,它允许开发者打包他们的应用以及应用的依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。Docker 容器是完全使用沙箱机制,相互之…...
PHP:phpstudy无法启动MySQL服务问题解决
文章目录 一、问题说明二、解决问题 一、问题说明 我的Windows10系统,之前安装过MySQL5.7的版本。 然后,用phpstudy安装MySQL8,并启动MySQL8。 发生无法启动的情况。 二、解决问题 1、删除本地MySQL7的服务 net stop MySQL //这里的服务名…...
【电控笔记z29】扰动估测器DOB估测惯量J-摩擦系数B
基本原理 扰动估测器的核心思想是通过向电机系统施加特定的扰动信号,观察系统响应的变化,然后利用系统的动态模型和控制理论来估计未知参数,如惯量和摩擦系数 。一般基于电机的运动方程建立数学模型,结合观测到的电机实际运行数据…...
STM32-I2C通信外设
目录 一:I2C外设简介 二:I2C外设数据收发 三:I2C的复用端口 四:主机发送和接收 五:硬件I2C读写MPU6050 相关函数: 1.I2C_ GenerateSTART 2.I2C_ GenerateSTOP 3.I2C_ AcknowledgeConfig 4.I2C…...
计算机二级MS之PPT
声明:跟着大猫和小黑学习随便记下一些笔记供大家参考,二级考试之前将持续更新,希望大家二级都能轻轻松松过啦,过了二级的大神也可以在评论区留言给点建议,感谢大家!! 文章目录 考题难点1cm25px…...
Spring Boot 3 整合 MinIO 实现分布式文件存储
引言 文件存储已成为一个做任何应用都不可回避的需求。传统的单机文件存储方案在面对大规模数据和高并发访问时往往力不从心,而分布式文件存储系统则提供了更好的解决方案。本篇文章我将基于Spring Boot 3 为大家讲解如何基于MinIO来实现分布式文件存储。 分布式存…...
C++ Primer 交换操作
欢迎阅读我的 【CPrimer】专栏 专栏简介:本专栏主要面向C初学者,解释C的一些基本概念和基础语言特性,涉及C标准库的用法,面向对象特性,泛型特性高级用法。通过使用标准库中定义的抽象设施,使你更加适应高级…...
分布式中间件:Redis介绍
目录 Redis 概述 Redis 的特点 高性能 丰富的数据结构 持久化 分布式特性 简单易用 Redis 的数据结构 字符串(String) 哈希(Hash) 列表(List) 集合(Set) 有序集合&…...
软件测试的基础入门(二)
文章目录 一、软件(开发)的生命周期什么是生命周期软件(开发)的生命周期需求分析计划设计编码测试运行维护 二、常见的开发模型瀑布模型流程优点缺点适应的场景 螺旋模型流程优点缺点适应的场景 增量模型和迭代模型流程适应的场景…...
学之思社区版考试系统docker-compose部署
参考 开源项目-Docker部署学之思管理系统 安装docker sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Bas…...
深度优先搜索(DFS)和广度优先搜索(BFS)——c#实现
一、深度优先搜索(DFS) 原理: 沿着分支尽可能深入,直到到达叶子节点,然后回溯探索其他分支 类似走迷宫时优先选择一条路走到黑,碰壁再回退 数据结构:栈(Stack)或递归实…...
什么是hive
Apache Hive 是一个基于 Hadoop 生态系统构建的数据仓库工具,主要用于处理和分析大规模的结构化数据。它允许用户通过类似 SQL 的查询语言(HiveQL)进行数据操作,而无需直接编写复杂的 MapReduce 程序。以下是 Hive 的核心特点和应…...
JVM详解
目录 一.JVM的概念 1. 什么是JVM? 2.JVM用来干什么? 二JVM运行流程 JVM执⾏流程 2.1类加载机制 2.2类加载机制带来了哪些好处? 2.3类加载的过程是什么? 2.3.1加载 2.3.2验证 2.3.3准备阶段 2.3.4解析阶段 符号引⽤ 直接引⽤ 2.3.5初始化阶段 2.4类加载器 什么…...
PCA(主成分分析)核心原理
一、PCA(主成分分析)核心原理 即主成分分析技术,又称主分量分析技术,旨在利用降维的思想,把多指标转化为少数几个综合指标。在统计学中,主成分分析PCA是一种简化数据集的技术。它是一个线性变换。这个变换…...
DeepSeek私有化部署6:openEuler 24.03-LTS-SP1安装Open WebUI
Open WebUI是一个 Open WebUI 是一个可扩展的、功能丰富、用户友好的自托管 AI 平台,专为完全离线运行而设计。 它支持多种 LLM 运行环境,包括 Ollama 和 OpenAI 兼容的 API,并内置了用于 RAG 的推理引擎,是一个强大的 AI 部署解决…...
【一文学会 HTML5】
目录 HTML概述基本概念HTML 发展历程HTML 基本结构 网页基本标签标题标签(<h1> - <h6>)段落标签(<p>)换行标签(<br>)水平线标签(<hr>)注释࿰…...
前端题目类型
HTMLCSS常见面试题 HTML标签有哪些行内元素 img、picture、span、input、textarea、select、label 说说你对元素语义化的理解 元素语义化就是用正确的元素做正确的事情。虽然理论上所有html元素都可通过css样式实现相同效果,但这样会使事情复杂化,所以需…...
nodejs学习——nodejs和npm安装与系统环境变量配置及国内加速
nodejs和npm安装与系统环境变量配置及国内加速 下载node-v22.14.0-x64.msi 建议修改为非C盘文件夹 其它步骤,下一步,下一步,完成。 打开CMD窗口查看安装详情 $ node -v v22.14.0 $ npm -v 10.9.2$ npm config list创建node_global和node_c…...
[视频编码]rkmpp 实现硬件编码
mpi_enc_test的命令参数描述说明 命令参数的描述说明如下: 命令参数 描述说明 -i 输入的图像文件。 -o 输出的码流文件。 -w 图像宽度,单位为像素。 -h 图像高度,单位为像素。 -hstride 垂直方向相邻两行之间的距离,单…...
Vue3实战学习(Vue3的基础语法学习与使用(超详细))(3)
目录 (1)Vue3工程环境准备、项目基础脚手架搭建详细教程。(博客链接) (2)Vue3的基础语法学习与使用。 (1)"{{}}"绑定数据。 <1>ref()函数定义变量——绑定数据。 <2>reactive({...})…...
基于multisim的花样彩灯循环控制电路设计与仿真
1 课程设计的任务与要求 (一)、设计内容: 设计一个8路移存型彩灯控制器,基本要求: 1. 8路彩灯能演示至少三种花型(花型自拟); 2. 彩灯用发光二极管LED模拟; 3. 选做…...
EasyRTC嵌入式视频通话SDK的跨平台适配,构建web浏览器、Linux、ARM、安卓等终端的低延迟音视频通信
1、技术背景 WebRTC是一项开源项目,旨在通过简单的API为浏览器和移动应用程序提供实时通信(RTC)功能。它允许在无需安装插件或软件的情况下,实现点对点的音频、视频和数据传输。 WebRTC由三个核心组件构成: GetUserM…...
【CSS】gap 属性详解
文章目录 一、什么是 gap 属性1. 定义2. 语法3. 默认值 二、gap 属性的基本用法1. 网格布局中的应用2. 弹性布局中的应用3. 单值和双值的区别 三、gap 属性的实际应用场景1. 表单布局优化2. 图片网格布局 四、gap 的注意事项1. 浏览器兼容性2. 替代 margin 的场景3. 不同布局的…...
【招聘精英】
我们公司是一个位于石家庄的一个科技型新型技术公司。主要做人力资源、用工、科技等方面。 有意向回石家庄的或者已经在石家庄的技术大咖、软件大牛、产品大佬、UI大神可以来了解一下。 现在招聘 高级前端开发 高级java开发 其他岗位也可以联系。 有意向的朋友可以私信我。 -…...
qt 操作多个sqlite文件
qt 操作多个sqlite文件 Chapter1 qt 操作多个sqlite文件1. 引入必要的头文件2. 创建并连接多个SQLite数据库3. 代码说明4. 注意事项 Chapter2 qt 多线程操作sqlite多文件1. 引入必要的头文件2. 创建数据库操作的工作线程类3. 在主线程中创建并启动多个工作线程4. 代码说明5. 运…...
【自学笔记】Numpy基础知识点总览-持续更新
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 Numpy基础知识点总览目录1. 简介Numpy是什么为什么使用Numpy 2. 数组对象(ndarray)创建数组数组的属性数组的形状操作 3. 数组的基本操作数组…...
DP 问题 -- LQR中的DP问题
深入地介绍线性二次调节问题(Linear Quadratic Regulator, LQR),并详细说明它作为动态规划(DP)的一个经典应用问题的求解过程。 📌 一、LQR问题定义(最优控制视角) LQR 问题是一种特…...
Win7重装不翻车!ISO镜像安全下载渠道+BIOS设置避雷手册
一、写在前面:为什么你需要这份教程? 当电脑频繁蓝屏、系统崩溃甚至无法开机时,重装系统可能是最后的救命稻草。但市面上的教程往往存在三大痛点: ⚠️ 镜像来源不明导致系统被植入后门 ⚠️ 启动盘制作失败反复折腾 ⚠️ 操作失…...
CEF在MFC上的示例工程
CEF 在 MFC 中的使用 工程配置 1、首先创建一个MFC对话框工程 创建完运行测试效果如下 2、MFC工程引入CEF库 将 CEF 目录下的 cef子目录下载解压后放到MFC工程中: 然后在VS中对工程右键 -> 属性 -> C/C -> 常规 -> 附加包含目录,添加“.\…...
#UVM# 关于 config_db 机制中的直线非直线设置和获取讲解
在 UVM 验证环境中,uvm_config_db 是一种强大的机制,用于在不同组件之间传递配置参数。实际应用中,我们经常使用直线和非直线的设置与获取。今天,着重回忆一下这些内容,希望实际中更加方便的使用。 UVM 树结构示例 假设 UVM 树结构如下: uvm_test_top ├── env │ …...