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

【Dive Into Stable Diffusion v3.5】2:Stable Diffusion v3.5原理介绍

【Dive Into Stable Diffusion v3.5】系列博文:

  1. 第1篇:开源项目正式发布——深入探索SDv3.5模型全参/LoRA/RLHF训练
  2. 第2篇:Stable Diffusion v3.5原理介绍

目录

  • 1 前言
    • 1.1 扩散模型的原理
    • 1.2 损失函数
    • 1.3 加噪流程
    • 1.4 推理流程
    • 1.5 negative prompts
  • 2 SD3原理介绍
    • 2.1 整流模型介绍
    • 2.2 非均匀训练噪声采样
    • 2.3 网络整体架构
      • 2.3.1 多模态 DiT (MM-DiT)
      • 2.3.2 比例可变的位置编码
      • 2.3.3 训练数据预处理
  • 3 SD3.5原理介绍
    • 3.1 QK Normalization(查询-键归一化)
    • 3.2 双注意力层(Dual Attention Layers)
    • 3.3 模型变体与性能对比

1 前言

开源项目地址:https://github.com/Donvink/dive-into-stable-diffusion-v3-5
如果觉得有用,别忘了点个 ⭐️ 支持开源哦!

1.1 扩散模型的原理

首先,我们用最通俗易懂的语言介绍一下扩散模型的原理。

如下图所示,有一张图片,假如我们每次都往图片上增加一点噪声,例如图中的蓝色点,我们累计加了1000步噪声之后,整张图片就接近0-1分布的白噪声了。

加噪声

对于每一次增加噪声的时候,如果我们把增加噪声后的图片当做输入,把增加前的图片当做输出,这样就可以试着让模型去学习如何复原图片了。但是学习复原图片是一件非常难的事情,那么我们是否可以换一个角度,去预测噪声呢?

答案是肯定的,如下图所示,同样,我们把增加噪声后的图片当做输入,把增加前的图片当做输出,每次让模型去预测噪声,类似于ResNet,用模型去预测残差。

预测噪声

1.2 损失函数

Loss计算相对比较简单,只要计算加权后的L2-Loss即可。

# Predict the noise residual
model_pred = transformer(hidden_states=noisy_model_input,timestep=timesteps,encoder_hidden_states=prompt_embeds,pooled_projections=pooled_prompt_embeds,return_dict=False,
)[0]# Preconditioning of the model outputs.
if args.precondition_outputs:model_pred = model_pred * (-sigmas) + noisy_model_input# these weighting schemes use a uniform timestep sampling
# and instead post-weight the loss
weighting = compute_loss_weighting_for_sd3(weighting_scheme=args.weighting_scheme, sigmas=sigmas)# flow matching loss
if args.precondition_outputs:target = model_input
else:target = noise - model_input# Compute regular loss.
loss = torch.mean((weighting.float() * (model_pred.float() - target.float()) ** 2).reshape(target.shape[0], -1),1,
)
loss = loss.mean()

1.3 加噪流程

添加噪声的方法有很多,我们可以均匀地添加噪声,每一步添加的噪声强度都是固定大小sigma。也可以非均匀地添加噪声,例如刚开始的时候噪声弱一点,让模型先学一些细节,越往后噪声越强,让模型学一些轮廓。

上一节我们提到,每张图片需要迭代1000步之后,最终才会变成均值为0方差为1的白噪声,那我们在训练的时候是不是需要每个图片文本对都需要迭代1000步呢,这训练的耗时会有变多大?

实际上,在初始化的时候,我们就构建好从0 ~ 999步的噪声采样schedule,对于每个图片文本对,我们都随机地从schedule中取出一个时间步,获取该时间步对应的噪声强度,添加到模型输入中,forward和backward的流程和第一节中提到的一样。代码如下:

# Sample noise that we'll add to the latents
noise = torch.randn_like(model_input)
bsz = model_input.shape[0]# Sample a random timestep for each image
# for weighting schemes where we sample timesteps non-uniformly
u = compute_density_for_timestep_sampling(weighting_scheme=args.weighting_scheme,batch_size=bsz,logit_mean=args.logit_mean,logit_std=args.logit_std,mode_scale=args.mode_scale,
)
indices = (u * noise_scheduler_copy.config.num_train_timesteps).long()
timesteps = noise_scheduler_copy.timesteps[indices].to(device=model_input.device)# Add noise according to flow matching.
# zt = (1 - texp) * x + texp * z1
sigmas = get_sigmas(timesteps, n_dim=model_input.ndim, dtype=model_input.dtype)
noisy_model_input = (1.0 - sigmas) * model_input + sigmas * noise# Predict the noise residual
model_pred = transformer(hidden_states=noisy_model_input,timestep=timesteps,encoder_hidden_states=prompt_embeds,pooled_projections=pooled_prompt_embeds,return_dict=False,
)[0]

只要我们的训练集够大,迭代步数够多,那么我们就可以遍历了完整的0~999步加噪过程,同时,训练耗时也会大大降低。

1.4 推理流程

在推理的时候,我们只需要输入prompt,迭代一定步数,就能生成一张很好的图片。流程如下:

  • 首先将prompt输入到text encoder中获取对应的文本编码Embedding;

  • 然后生成一个随机的潜空间张量,latents = randn_tensor(shape, generator=generator, device=device, dtype=dtype)

  • 再将文本Embedding和latents一起输入到unet / ViT block中,迭代n步,上一步迭代生成的latents去噪后是下一次迭代的输入;

for i, t in enumerate(timesteps):if self.interrupt:continue# expand the latents if we are doing classifier free guidancelatent_model_input = torch.cat([latents] * 2) if self.do_classifier_free_guidance else latents# broadcast to batch dimension in a way that's compatible with ONNX/Core MLtimestep = t.expand(latent_model_input.shape[0])noise_pred = self.transformer(hidden_states=latent_model_input,timestep=timestep,encoder_hidden_states=prompt_embeds,pooled_projections=pooled_prompt_embeds,joint_attention_kwargs=self.joint_attention_kwargs,return_dict=False,)[0]# compute the previous noisy sample x_t -> x_t-1latents_dtype = latents.dtypelatents = self.scheduler.step(noise_pred, t, latents, return_dict=False)[0]
  • 最后,将latents经过vae的解码器,即可生成最终的图片。
latents = (latents / self.vae.config.scaling_factor) + self.vae.config.shift_factorimage = self.vae.decode(latents, return_dict=False)[0]
image = self.image_processor.postprocess(image, output_type=output_type)

1.5 negative prompts

有时候我们不仅会输入positive prompts,也会输入negative prompts,目的是不让生成的图片中包含negative prompts的相关信息。如何实现呢?

假设我们不想让图片中的人物有胡子,那么我们将【胡子】作为negative prompts输入到模型中,【胡子】在潜空间的特征分布是固定的,我们只需要将positive prompts生成的Latents减去negative prompts生成的Latents,就能去掉【胡子】的特征了,最终生成的图片中人物是没有胡子的。

# perform guidance
if self.do_classifier_free_guidance:noise_pred_uncond, noise_pred_text = noise_pred.chunk(2)noise_pred = noise_pred_uncond + self.guidance_scale * (noise_pred_text - noise_pred_uncond)

严格上来讲,Stable Diffusion通过条件嵌入与非条件嵌入的差值实现引导,而非直接对潜空间特征做减法。正向提示词(positive prompts)和反向提示词(negative prompts)的文本会被分别编码为条件嵌入向量(text_embeddings)和无条件嵌入向量(uncond_embeddings)。

  • 反向提示词并非直接修改潜空间(Latents),而是通过调整条件概率分布影响去噪过程。例如,输入"胡子"作为反向提示词,模型会降低生成图像中出现胡子的概率分布权重。
  • ​动态调整而非固定减法:潜空间的特征分布是动态变化的,反向提示词的作用是通过梯度更新方向抑制特定特征,而非固定数值的减法。

2 SD3原理介绍

Stable Diffusion 3 (SD3) 的文章标题为 Scaling Rectified Flow Transformers for High-Resolution Image Synthesis。

这篇文章的内容很简明,就是:用整流 (rectified flow) 生成模型、Transformer 神经网络做了模型参数扩增实验,以实现高质量文生图大模型。 文章的核心贡献如下:

  1. 从方法设计上
  • 首次在大型文生图模型上使用了整流模型。
  • 用一种新颖的 Diffusion Transformer (DiT) 神经网络来更好地融合文本信息。
  • 使用了各种小设计来提升模型的能力。如使用二维位置编码来实现任意分辨率的图像生成。
  1. 从实验上
  • 开展了一场大规模、系统性的实验,以验证哪种扩散模型/整流模型的学习目标最优。
  • 开展了扩增模型参数的实验 (scaling study),以证明提升参数量能提升模型的效果。

2.1 整流模型介绍

所谓图像生成,其实就是让神经网络模型学习一个图像数据集所表示的分布,之后从分布里随机采样。为了直观理解,我们可以用二维点来表示一张图像的数据。比如在下图中我们希望学习红点表示的分布,即我们希望随机生成点,生成的点都落在红点处,而不是落在灰点处。

原图

我们可以用一种巧妙的方法间接学习图像生成路线,知道了预定义的数据到噪声的路线后,我们其实就知道了数据在路线上每一位置的速度(红箭头)。那么,我们可以以每一位置的反向速度(蓝箭头)为真值,学习噪声到真实数据的速度场,这样的学习目标被称为流匹配。

流匹配

对于不同的扩散模型及流匹配模型,其本质区别在于图像到噪声的路线的定义方式。在扩散模型中,图像到噪声的路线是由一个复杂的公式表示的。而整流模型将图像到噪声的路线定义为了直线。根据论文的介绍,整流中 t 时刻数据 zt 由真实图像 x0 变换成纯噪声 ϵ \mathbf{\epsilon} ϵ 的位置为:

流匹配

由于整流最后学习出来的生成路线近乎是直线,这种模型在设计上就支持少步数生成。

2.2 非均匀训练噪声采样

在学习这样一种生成模型时,会先随机采样一个时刻 t ∈ [0, 1],根据公式获取此时刻对应位置在生成路线上的速度,再让神经网络学习这个速度。刚开始和快到终点的路线很好学,而路线的中间处比较难学,因此在采样时刻 t 时,SD3 使用了一种非均匀采样分布。

如下图所示,SD3 主要考虑了两种公式: mode(左)和 logit-norm (右)。二者的共同点是中间多,两边少。mode 相比 logit-norm,在开始和结束时概率不会过分接近 0。

噪声采样

2.3 网络整体架构

和之前版本的 SD 一样,SD3 主要基于隐扩散模型(latent diffusion model, LDM),是一个两阶段的生成方法:

  • 先用一个 LDM 生成隐空间低分辨率的图像,
  • 再用一个自编码器把图像解码回真实图像。

LDM 会使用一个神经网络模型来对噪声图像去噪,SD3 的主要改进是把去噪模型的结构从 U-Net 变成了 DiT。

2.3.1 多模态 DiT (MM-DiT)

SD3 的去噪模型是一个 Diffusion Transformer (DiT),如果去噪模型只有带噪图像这一种输入的话,DiT 则会是一个结构非常简单的模型,和标准 ViT 一样,但是,扩散模型中的去噪网络一定得支持带约束生成,因为扩散模型约束于去噪时刻 t 。此外,作为文生图模型,SD3 还得支持文本约束。DiT 及本文的 MM-DiT 把模型设计的重点都放在了处理额外约束上。

模型总览图

  1. 时间约束

如下图所示,SD3 的模块保留了 DiT 的设计,用自适应 LayerNorm (Adaptive LayerNorm, AdaLN) 来引入额外约束。具体来说,过了 LayerNorm 后,数据的均值、方差会根据时刻约束做调整。另外,过完 Attention 层或 FF 层后,数据也会乘上一个和约束相关的系数。

时间约束

  1. 文本约束

文本约束以两种方式输入进模型:与时刻编码拼接、在注意力层中融合。具体数据关联细节可参见下图。如图所示,为了提高 SD3 的文本理解能力,描述文本 (“Caption”) 经由三种编码器编码,得到两组数据。一组较短的数据会经由 MLP 与文本编码加到一起;另一组数据会经过线性层,输入进 Transformer 的主模块中。

文本约束

  1. DiT 的子模块

SD3 的 DiT 的子模块结构图如下所示,和标准 DiT 子模块一样,时刻编码 y 通过修改 LayerNorm 后数据的均值、方差及部分层后的数据大小来实现约束。输入的图像编码 x 和文本编码 c 以相同的方式做了 DiT 里的 LayerNorm, FFN 等操作,但此模块用了一种特殊的融合注意力层。具体来说,在过注意力层之前,x 和 c 对应的 Q, K, V 会分别拼接到一起,而不是像之前的模型一样,Q 来自图像,K 和 V 来自文本。过完注意力层,输出的数据会再次拆开,回到原本的独立分支里。由于 Transformer 同时处理了文本、图像的多模态信息,所以作者将模型取名为 MM-DiT (Multimodal DiT)。

dit

2.3.2 比例可变的位置编码

大部分论文在使用ViT 架构时,都会把图像的图块从左上到右下编号,把二维图块拆成一维序列,再用这种一维位置编码来对待图块,这样做有一个很大的缺点:生成的图像的分辨率是无法修改的。

解决此问题的方法很简单,只需要将一维的编码改为二维编码,这样 Transformer 就不会搞混二维图块间的关系了。

位置编码

SD3 的 MM-DiT 一开始是在 256 × 256 固定分辨率上训练的,之后在高分辨率图像上训练时,开发者用了一些巧妙的位置编码设置技巧,让不同比例的高分辨率图像也能共享之前学到的这套位置编码。

2.3.3 训练数据预处理

在大规模训练前,作者用三个方式过滤了数据:

  • 用了一个 NSFW 过滤器过滤图片,似乎主要是为了过滤色情内容;
  • 用美学打分器过滤了美学分数太低的图片;
  • 移除了看上去语义差不多的图片。

在训练 LDM 时,自编码器和文本编码器是不变的,因此可以提前处理好所有训练数据的图像编码和文本编码。

参考资料:https://zhouyifan.net/2024/07/14/20240703-SD3/

3 SD3.5原理介绍

对于 SD3.5-large 使用的 transformer 模型,其结构基本和 SD3-medium 里的相同,但有以下更改:

  • QK normalization: 对于训练大型的 Transformer 模型,使用 QK normalization 已经成为标准做法,所以 SD3.5-large 也不例外。
  • 双注意力层: 在 MMDiT 结构中,文本和图像两个模态都在使用同一个注意力层;而 SD3.5-large 则使用了两个注意力层。

除此之外,文本编码器 (text encoder)、图像的变分自编码器 (VAE) 以及噪声调度器 (noise scheduler) 均和 SD3-medium 保持一致。

3.1 QK Normalization(查询-键归一化)

在Transformer的自注意力机制中,查询(Query, Q)和键(Key, K)矩阵的点积计算决定了不同位置之间的相关性权重。原始的缩放点积注意力通过除以dk来缓解点积值过大的问题,但这一操作在大型模型中可能仍不足以保证数值稳定性。

常见方法包括:

  1. L2归一化:对Q和K的每个向量进行L2归一化,使点积结果转化为余弦相似度(范围在[-1, 1]),避免数值过大。
  2. 层归一化(LayerNorm):在计算点积前,对Q和K矩阵分别应用层归一化,稳定分布。
  3. 缩放因子调整:结合归一化与可学习的缩放参数,增强模型灵活性。

优势:

  • 训练稳定性:防止梯度爆炸/消失,尤其对深层或参数量大的模型(如SD3.5-large)至关重要。
  • 收敛速度:归一化后的注意力分数分布更均匀,加速模型收敛。
  • 鲁棒性:减少输入尺度变化对注意力机制的影响,提升泛化能力。

3.2 双注意力层(Dual Attention Layers)

在原始MMDiT(多模态扩散Transformer)中,文本和图像特征共享同一个注意力层。这种设计可能导致以下问题:

  1. 模态特性冲突:文本(序列数据)与图像(空间数据)的结构差异大,共享参数可能抑制模态特异性特征的学习。
  2. 容量限制:单一注意力层需同时适配两种模态,可能限制模型表达能力。

SD3.5-large的改进在于为文本和图像分别提供独立的注意力层:

  1. 文本注意力层:专注于序列内词与词的关系(如语法、语义依赖),采用自注意力机制。
  2. 图像注意力层:针对空间特征(如局部纹理、全局构图),可能结合空间注意力或窗口注意力机制。

实现方式:

  • 并行处理:文本和图像特征分别输入各自的注意力层,输出后融合(如拼接或相加)。
  • 交叉交互:在独立处理模态内特征后,通过交叉注意力层实现跨模态交互(如文本引导图像生成)。

优势:

  • 模态特异性优化:独立参数允许模型捕捉文本和图像的独特模式。
  • 增强表达能力:双分支结构提升多模态融合的精细度,改善生成质量(如更准确的图文对齐)。
  • 训练效率:减少模态间干扰,加速收敛。

3.3 模型变体与性能对比

SD3.5提供三种版本,技术参数对比如下:

版本参数量分辨率范围生成步数硬件需求(显存)
SD3.5 Large8.1B256px-2Mpx25步≥16GB(A100)
SD3.5 Large Turbo蒸馏优化512px-1Mpx4步12GB(RTX 4090)
SD3.5 Medium2.5B256px-0.5Mpx20步8GB(RTX 3060)

相关文章:

【Dive Into Stable Diffusion v3.5】2:Stable Diffusion v3.5原理介绍

【Dive Into Stable Diffusion v3.5】系列博文: 第1篇:开源项目正式发布——深入探索SDv3.5模型全参/LoRA/RLHF训练第2篇:Stable Diffusion v3.5原理介绍 目录 1 前言1.1 扩散模型的原理1.2 损失函数1.3 加噪流程1.4 推理流程1.5 negative pr…...

WPF 布局舍入(WPF 边框模糊 或 像素错位 的问题)

1. 什么是 WPF 布局舍入? 在 WPF 开发过程中,可能会遇到界面模糊、边框错位、文本渲染不清晰等问题。这些现象通常是由于 WPF 采用 设备无关像素(DIP, Device Independent Pixels),在不同 DPI 设置下,UI 元…...

前端-选中pdf中的文字并使用,显示一个悬浮的翻译按钮(本地pdfjs+iframe)不适用textlayer

使用pdfjs移步– vue2使用pdfjs-dist实现pdf预览(iframe形式,不修改pdfjs原来的ui和控件,dom层可以用display去掉一部分组件) 方案1:获取选择文本内容的最前面的字符坐标的位置(这种写法会导致如果选择超出…...

Mongodb分片模式部署

MongoDB 分片集群部署教程 1. 概述 MongoDB 分片是一种用于处理大规模数据集的集群技术。通过分片,MongoDB 可以将数据分布在多个服务器上,从而提高存储容量和读写性能。本教程将详细介绍如何从零开始部署 MongoDB 分片集群。 介绍 分片集群中主要由三…...

「一起学后端」Nest.js + MySQL 查询方法教学文档

Nest.js MySQL 查询方法教学文档 文章目录 Nest.js MySQL 查询方法教学文档1. 基础 CRUD 操作1.1 创建记录1.2 查询记录1.3 更新记录1.4 删除记录 2. 复杂查询2.1 分页与排序2.2 关联查询(JOIN)2.3 聚合查询2.4 子查询 3. 高级操作3.1 事务处理3.2 Typ…...

基于Spring Boot的企业内管信息化系统的设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…...

【学习笔记】LLM推理与部署

文章目录 1 [LLMs inference] quantization 量化整体介绍(bitsandbytes、GPTQ、GGUF、AWQ)2 [LLMs inference] quantization 量化整体介绍(bitsandbytes、GPTQ、GGUF、AWQ)3 [LLMs serving] openrouter & vllm host LLM 推理服…...

leetcode-134.加油站

油箱容积无限,要求能环岛,说明总共加起来的油是不少于消耗量的,这是唯一一个决定能否环岛的变量,只要油量够,那么必定有一段路是攒油的路,它供给后续的消耗,使得油箱总是不空。 如果油量足够&am…...

companion object和object 从kotlin转java分析

说明 companion object 中 companion类中的方法是普通的方法 在外部类中生成静态变量,静态companion 对象 object MyClass2 中 类中方法是普通方法 在MyClass2中生成静态变量,静态MyClass2对象, 一 companion object 使用 kotlin转java pa…...

检索增强生成(2)本地PDF 本地嵌入模型

from langchain_community.document_loaders import PyPDFLoader from pathlib import Pathdef load_local_pdf(file_path):if not Path(file_path).exists():raise FileNotFoundError(f"文件 {file_path} 不存在!")loader PyPDFLoader(file_path)try:do…...

关于TVS管漏电流的问题?

问题描述: 在量产的带电池故事机生产中,工厂产线测试电流时,有1台机器电流比正常机器大10mA左右。 原因分析: 1、分析电路原理图,去除可能出现问题的电压或器件(不影响系统),发现…...

2025前端面试题记录

vue项目目录的执行顺序是怎么样的? 1、package.json   在执行npm run dev时,会在当前目录寻找package.json文件,此文件包含了项目的名称版本、项目依赖等相关信息。 2、webpack.config.js(会被vue-cli脚手架隐藏) 3、vue.config.js   对…...

Linux系统docker部署Ollama本地大模型及部署Hugging Face开源模型,ollama相关注意点,非ollama模型创建,模型量化,显存建议

本文主要描述在Linux系统使用docker部署ollama自有模型以及Hugging Face开源模型,也涉及到一些相关注意点,欢迎沟通讨论~ 拉取镜像 拉取ollama最新镜像:docker pull ollama/ollama:latest 运行ollama 执行:docker run -d --res…...

.NET 9 彻底改变了 API 文档:从 Swashbuckle(Swagger) 到 Scalar

示例代码下载:https://download.csdn.net/download/hefeng_aspnet/90404652 摘要 API 文档是现代软件开发的支柱。随着 .NET 9 从 Swashbuckle 转向 Microsoft.AspNetCore.OpenApi,开发人员需要新的策略来保持高效。本文探讨了这些变化,并介…...

C++——权限初识

权限初识 C中的访问权限主要分为三种: public 、 private 和 protected 。这些权限决定了类成员(包括数据成员和成员函数)的可访问性。以下是一个总结表格,说明了在不同情况下这些权限如何应用: 使用权限(…...

如何让自动驾驶汽车“看清”世界?坐标映射与数据融合概述

在自动驾驶领域,多传感器融合技术是实现车辆环境感知和决策控制的关键。其中,坐标系映射和对应是多传感器融合的重要环节,它涉及到不同传感器数据在统一坐标系下的转换和匹配,以实现对车辆周围环境的准确感知。本文将介绍多传感器融合中坐标系映射和对应的数学基础和实际应…...

如何在 Linux 系统中部署 FTP 服务器:从基础配置到安全优化

一、为什么选择 Linux 部署 FTP 服务器? FTP(文件传输协议)作为互联网最早的文件传输标准,至今仍在企业内部文件共享、镜像站点同步等场景中广泛应用。Linux 系统凭借其稳定性、开源特性及丰富的工具链,成为搭建 FTP 服…...

C++——引用

目录 举个例子: 引用的基本特性 引用的定义语法如下: 1. 引用必须初始化: 2. 引用是别名: 3. 引用不能为空: 4. 引用不能重新绑定: 引用的使用场景 函数参数传递: 函数返回值&#xf…...

unity开发效率提升笔记

本文将记录提升Unity开发效率的若干细节,持续更新 一.VSCode文件标签多行显示 1.File->Preference->Settings (快捷键Ctrl 逗号) 2.搜索workbench.editor.wrapTabs 3.勾选上这个单选开关 若依然不是多行 4.搜索workbench.editor.tabSizing,选择fi…...

VScode页面错误,可以编译C++20版本,但页面显示有错误的解决方案

问题回顾 学习信号量时使用到了C20版本的一些变量,可以正常编译和运行,但在编辑器上显示存在错误,如图所示 显示结果,提示命名空间std没有成员变量counting_semaphore,如图所示 解决办法 1、确保自己安装了C/C插件…...

[WEB开发] JDBC

一. JDBC基础 JDBC (Java DataBase Connectivity): 就是使用 java 语言操作数据库的一套API. JDBC本质: 一套标准接口, 规范各个数据库厂商实现这套接口, 提供驱动使用接口, 真正执行的是实现类 二. 实战 2.1 非预编译sql // 1. 注册数据库驱动Class.forName("com.my…...

Linux shell脚本2-test条件测试语句:文件类型、字符串是否相等、数字大小比较、多重条件判断,测试语句验证

目录 1.条件测试语句 2.文件表达式测试 2.1测试文件状态的条件表达式 2.2程序验证 2.2.1 单个文件验证 2.2.3.两个文件验证 3.字符串表达式测试 4.数字表达式测试 5.复合表达式测试 1.条件测试语句 在写shell脚本时,经常遇到的问题就是判断字符串是否相等&…...

linux_git使用

1. git的历史 git是开源的 2. git的理解 版本控制 只进行管理源文件 3. git的使用 3.1. git命令安装 sudo yum install git sudo apt install -y git 查看是否安装成功 $git --version 3.2. git使用注意事项 首次使用git需要输入用户名和邮件 gitignore&#xff1…...

Linux网络相关概念和重要知识(2)(UDP套接字编程、聊天室的实现、观察者模式)

目录 1.UDP套接字编程 (1)socket编程 (2)UDP的使用 ①socket ②bind ③recvfrom ④sendto 2.聊天室的实现 (1)整体逻辑 (2)对sockaddr_in的封装 (3&#xff09…...

2025年03月18日柯莱特(外包宁德)一面前端面试

目录 自我介绍你怎么从0到1搭建项目的webpack 的构建流程手写webpack插件你有什么想问我的吗 2. 你怎么从 0 到 1 搭建项目的 在面试中回答从 0 到 1 搭建前端项目,可按以下详细步骤阐述: 1. 项目前期准备 需求理解与分析 和产品经理、客户等相关人…...

汇川EASY系列之以太网通讯(MODBUS_TCP做主站)

汇川Easy系列以太网通讯中(MODBUSTCP,plc做主站),终于可以不用使用指令就可以完成了,全程通过简单的配置就可通讯。本文将通过EASY系列PLC与调试助手之间完成此操作。具体演示如下; 关于主站和从站的介绍 A/请求:即主动方 向被动方发送的一个要求的信息。 B/主站:发…...

uni-app jyf-parser将字符串转化为html 和 rich-text

uni-app jyf-parser将字符串转化为html-CSDN博客 方法二: rich-text | uni-app...

PyTorch中Batch Normalization1d的实现与手动验证

PyTorch中Batch Normalization1d的实现与手动验证 一、介绍 Batch Normalization(批归一化)是深度学习中常用的技术,用于加速训练并减少对初始化的敏感性。本文将通过PyTorch内置函数和手动实现两种方式,展示如何对三维输入张量…...

LoRA中黑塞矩阵、Fisher信息矩阵是什么

LoRA中黑塞矩阵、Fisher信息矩阵是什么 1. 三者的核心概念 黑塞矩阵(Hessian) 二阶导数矩阵,用于优化问题中判断函数的凸性(如牛顿法),或计算参数更新方向(如拟牛顿法)。 Fisher信息矩阵(Fisher Information Matrix, FIM) 统计学中衡量参数估计的不确定性,反映数据…...

Transformer中,Fisher矩阵与权重之间关系

Transformer中,Fisher矩阵与权重之间关系 目录 Transformer中,Fisher矩阵与权重之间关系一、Fisher矩阵与Transformer权重的关系二、Fisher矩阵的更新方式三、举例说明给出案例:Transformer权重矩阵,Fisher矩阵,说明对应关系和怎么更新二阶导数计算需要大量算力有什么方法…...

本地安装deepseek大模型,并使用 python 调用

首先进入 ollama 官网 https://ollama.com/点击下载 下载完成后所有都是下一步,就可以 点击搜索 Models : https://ollama.com/search然后点击下载: 选择后复制: ollama run deepseek-r1:32b例如: 让它安装完成后&#xff1…...

asp.net mvc 向前端响应json数据。用到jquery

最近在给客户开发提醒软件时&#xff0c;用asp.net mvc 开发。该框架已经集成了bootstrap,直接贴asp.net mvc 端代码&#xff1a; {Layout null; }<!DOCTYPE html><html> <head><meta name"viewport" content"widthdevice-width" /…...

《基于深度学习的指纹识别智能门禁系统》开题报告

个人主页&#xff1a;大数据蟒行探索者 1研究背景 1.1开发目的和意义 指纹识别作为生物特征识别领域的一项重要技术&#xff0c;在安全认证、犯罪侦查和个人身份验证等方面具有广泛应用前景。随着深度学习技术的迅猛发展&#xff0c;基于深度学习的指纹识别系统成为了当前研究…...

数据预处理流程与关键步骤解析

数据预处理流程图&#xff08;Markdown格式&#xff09;&#xff1a; #mermaid-svg-b3mhJcpFWaJ9qMZ8 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-b3mhJcpFWaJ9qMZ8 .error-icon{fill:#552222;}#mermaid-svg-b3m…...

单片机开发资源分析实战——以STM32F103ZET6为例子,分析我们的单片机

目录 第一件事情&#xff1a;为什么叫STM32F103ZET6 分析我们的资源手册 第二件事情&#xff0c;关心我们的GPIO引脚输出 第三件事情&#xff1a;去找对应外设的说明部分 本文章隶属于项目&#xff1a; Charliechen114514/BetterATK: This is a repo that helps rewrite ST…...

uv命令介绍(高性能Python包管理工具,旨在替代pip、pip-tools和virtualenv等传统工具)

文章目录 **主要功能**1. **快速安装和管理 Python 包**2. **生成和管理锁文件 (requirements.lock)**3. **创建虚拟环境**4. **与 poetry 兼容** **核心优势**1. **极快的速度**&#xff1a;基于 Rust 实现&#xff0c;利用多线程和缓存大幅加速依赖解析。2. **轻量且独立**&a…...

React Native进阶(六十):webview实现屏蔽所嵌套web页面异常弹窗

文章目录 一、前言二、解决方案三、注意事项四、拓展阅读 一、前言 在React Native项目集成web页面时&#xff0c;webview嵌套方式是常用方式。如果所嵌套的web页面由于某种不可控因素导致出现错误弹窗信息&#xff0c;webview作为web嵌套方式应该对其行为可控。 React Nativ…...

IS-IS原理与配置

一、IS-IS概述 IS-IS&#xff08;Intermediate System to Intermediate System&#xff0c;中间系统到中间系统&#xff09;是ISO&#xff08;International Organization for Standardization&#xff0c;国际标准化组织&#xff09;为它的CLNP&#xff08;ConnectionLessNet…...

响应式CMS架构优化SEO与用户体验

内容概要 在数字化内容生态中&#xff0c;响应式CMS架构已成为平衡搜索引擎可见性与终端用户体验的核心载体。该系统通过多终端适配技术&#xff0c;确保PC、移动端及平板等设备的内容渲染一致性&#xff0c;直接降低页面跳出率并延长用户停留时长。与此同时&#xff0c;智能S…...

mysql 主从配置

核心概念&#xff1a; 主服务器&#xff08;Master&#xff09;&#xff1a;负责处理客户端的写操作&#xff0c;并将数据更改记录到二进制日志&#xff08;binlog&#xff09;中。从服务器&#xff08;Slave&#xff09;&#xff1a;负责读取主服务器的二进制日志&#xff0c;…...

Windows下编译安装Qt5.15.0指南

1. 系统要求 操作系统: Windows 7 或更高版本&#xff08;推荐 Windows 10/11&#xff09;。 磁盘空间: 至少 20-30 GB&#xff08;编译过程会生成大量中间文件&#xff09;。 内存: 建议 8GB 或更高。 编译器: 需要安装 Visual Studio&#xff08;推荐 MSVC 2017 或 MSVC 2…...

001-JMeter的安装与配置

1.前期准备 下载好JMeter : https://jmeter.apache.org/download_jmeter.cgi 下载好JDK : :Java Downloads | Oracle 中国 下载图中圈蓝的JMeter和JDK就行&#xff0c;让它边下载&#xff0c;我们边往下看 2.为什么要下载并安装JDK ? JMeter 是基于 Java 开发的工具&#…...

kube-score K8S Yaml静态代码分析工具详解

kube-score 是一款专注于 Kubernetes 配置文件的静态代码分析工具&#xff0c;旨在通过自动化检查帮助用户识别资源配置中的潜在问题&#xff0c;并遵循最佳实践以提升集群的安全性、稳定性和性能。以下是其核心功能、使用方法和应用场景的详细解析&#xff1a; 一、核心功能与…...

【Go】Go语言结构体笔记

整体介绍 虽然 Go 语言不是传统意义上的面向对象语言&#xff0c;但它提供了结构体&#xff08;struct&#xff09;来组织数据&#xff0c;并且可以为结构体绑定方法&#xff0c;从而达到面向对象的部分效果。 关键知识点包括&#xff1a; 结构体定义与实例化 定义结构体时使用…...

Oracle数据库性能优化全攻略:十大关键方向深度解析与实践指南

文章目录 一、SQL查询优化二、索引优化三、内存管理四、I/O优化五、分区表与分区索引六、并行处理七、统计信息管理八、锁与并发控制九、数据库参数调优十、应用设计优化结论 在当今数据驱动的时代&#xff0c;数据库的性能优化成为了确保企业应用高效运行的关键。Oracle作为业…...

Modern C++面试题及参考答案

目录 解释右值引用的定义及其与左值引用的核心区别 std::move 的实现原理是什么?为什么它本身不执行移动操作? 移动构造函数与拷贝构造函数的调用场景有何不同? 实现一个支持移动语义的类需要遵循哪些原则? 完美转发(Perfect Forwarding)的实现原理及 std::forward 的…...

【单片机通信技术应用——学习笔记三】液晶屏显示技术,取模软件的应用

一、液晶显示技术简介 1.RGB信号线 RGB是一种色彩模式&#xff0c;是工业界的一种颜色标准&#xff0c;是通过红&#xff08;R&#xff09;、绿&#xff08;G&#xff09;、蓝&#xff08;B&#xff09;三个颜色通道的变化&#xff0c;以及它们相互之间的叠加来得到各式各样的…...

Git push后撤销提交

一、介绍 当某次更改完工程后&#xff0c;push了本地仓库到云端&#xff0c;但是发现有地方改错了&#xff0c;想撤销这次推送&#xff0c;或者某次提交就更改了很小一部分&#xff0c;想和本地这次修改的合并为一次推送&#xff0c;省的在云端显示特别多次提交&#xff0c;显得…...

React多层级对象改变值--immer

reduxjs/toolkit底层就是immer&#xff0c;&#xff0c;&#xff0c;所以在使用redux的时候&#xff0c;直接赋值&#xff0c;就会响应式的数据 如果不使用reduxjs/toolkit,可以自己使用immer来实现 安装immer npm install immer引入produce函数&#xff0c;&#xff0c;prod…...

17153. 班级活动(蓝桥杯-python)

代码写法 import os import sys# 请在此输入您的代码n int(input()) a list(map(int,input().split()))da {} flag1 0 flag2 0for i in a:da[i] da.get(i,0)1for i,j in da.items():if j 1:flag1 1if j > 2:flag2 j-2if flag2 > flag1:print(flag2) else:print(…...