扩散模型 Diffusion Model 整体流程详解
🧠 Diffusion Model 思路、疑问和代码
文章目录
- 🧠 Diffusion Model 思路、疑问和代码
- 🔄 一、核心思想:从噪声到图像
- 📦 二、正向过程:加噪
- 🧠 三、反向过程:学习去噪
- 🔁 反向采样公式估计,引入 x 0 x_0 x0,用可解的 q ( x t − 1 ∣ x t , x 0 ) q(x_{t-1} \mid x_t, x_0) q(xt−1∣xt,x0)
- 🤔 常见问题解析
- 🏋️♀️ 模型训练
- 🎨 推理 / 采样阶段
- 🧩 Diffusion 模型模板代码
- 1. 初始化和必要的导入
- 2. 定义 Beta Schedule 和相关函数
- 3. 定义 Diffusion 模型(UNet)
- 4. 扩散过程和去噪过程
- 5. 损失函数(训练时)
- 6. 数据加载和预处理
- 7. 训练循环
- 8. 采样(生成图像)
- 9. 显示图像
🔄 一、核心思想:从噪声到图像
扩散模型是一种生成模型,目标是从纯高斯噪声一步步生成真实图像。
它包含两个阶段:
阶段 | 方向 | 名称 | 做了什么 |
---|---|---|---|
正向 | x 0 → x T x_0 \to x_T x0→xT | Forward / Diffusion | 不断加噪,让图像变成随机噪声 |
反向 | x T → x 0 x_T \to x_0 xT→x0 | Reverse / Denoising | 学习去噪,还原出原始图像 |
📦 二、正向过程:加噪
我们从原图 x 0 x_0 x0 出发,在每个时刻 t t t 加入一点噪声,最终得到 x T x_T xT,一个近似高斯噪声的图像:
x t = α ˉ t ⋅ x 0 + 1 − α ˉ t ⋅ ϵ , ϵ ∼ N ( 0 , I ) x_t = \sqrt{\bar{\alpha}_t} \cdot x_0 + \sqrt{1 - \bar{\alpha}_t} \cdot \epsilon, \quad \epsilon \sim \mathcal{N}(0, I) xt=αˉt⋅x0+1−αˉt⋅ϵ,ϵ∼N(0,I)
- α ˉ t = ∏ i = 1 t α i , \bar{\alpha}_{t}=\prod_{i=1}^{t} \alpha_{i}, αˉt=∏i=1tαi, 其中 α i = 1 − β i \alpha_{i}=1-\beta_{i} αi=1−βi ( β i β_i βi 是第 i i i 步加的噪声强度), 从第 1 步到第 t 步累计保留的图像信息量
- t = 0 → T t = 0 \to T t=0→T,图像越来越模糊;
- 这个过程是可闭式计算的,无需一步步执行,一次公式就能生成 x t x_t xt ✅
🧠 三、反向过程:学习去噪
🎯 目标
从 x T ∼ N ( 0 , I ) x_T \sim \mathcal{N}(0, I) xT∼N(0,I) 出发,逐步去噪还原出 x 0 x_0 x0。
🤖 学什么?
我们训练一个神经网络 ϵ θ ( x t , t ) \epsilon_\theta(x_t, t) ϵθ(xt,t) 来预测=预测加噪时用的 ϵ \epsilon ϵ。
🔁 Trick:从 x t x_t xt 推出 x 0 x_0 x0,再推出 x t − 1 x_{t-1} xt−1
从正向公式:
x t = α ˉ t x 0 + 1 − α ˉ t ⋅ ϵ x_t = \sqrt{\bar{\alpha}_t} x_0 + \sqrt{1 - \bar{\alpha}_t} \cdot \epsilon xt=αˉtx0+1−αˉt⋅ϵ
可以反解出:
x 0 = 1 α ˉ t ( x t − 1 − α ˉ t ⋅ ϵ θ ( x t , t ) ) x_0 = \frac{1}{\sqrt{\bar{\alpha}_t}} \left( x_t - \sqrt{1 - \bar{\alpha}_t} \cdot \epsilon_\theta(x_t, t) \right) x0=αˉt1(xt−1−αˉt⋅ϵθ(xt,t))
✅ 有了 ϵ θ \epsilon_\theta ϵθ,就能估计 x 0 x_0 x0,接着继续计算 x t − 1 x_{t-1} xt−1。
❓为什么不直接从 x t x_t xt 算 x t − 1 x_{t-1} xt−1?
虽然正向有:
x t = f ( x t − 1 ) + noise x_t = f(x_{t-1}) + \text{noise} xt=f(xt−1)+noise
但反向是概率分布,不是函数。因为:
- 多个 x t − 1 x_{t-1} xt−1 可能加上不同噪声后变成同一个 x t x_t xt
- 所以 q ( x t − 1 ∣ x t ) q(x_{t-1} | x_t) q(xt−1∣xt) 是个复杂分布,没法显式表示
我们没有办法得到 q ( x t − 1 ) q(x_{t-1}) q(xt−1)或 q ( x t ) q(x_t) q(xt)的明确表达式,因为它们涉及从 x 0 x_0 x0 积分过来的所有路径:
q ( x t ) = ∫ q ( x t ∣ x t − 1 ) q ( x t − 1 ) d x t − 1 q(x_t) = \int q(x_t \mid x_{t-1}) q(x_{t-1}) dx_{t-1} q(xt)=∫q(xt∣xt−1)q(xt−1)dxt−1
但 q ( x t − 1 ) q(x_{t-1}) q(xt−1)并不是一个简单的分布!因为它本身是从一系列有噪声扰动的步骤中一步步卷积出来的复杂分布,然后 q ( x t − 2 ) q(x_{t-2}) q(xt−2)还要再由 q ( x t − 3 ) q(x_{t-3}) q(xt−3) 推来……最终都依赖于 q ( x 0 ) q(x_0) q(x0),也就是原始数据分布。但!💥 我们根本不知道 q ( x 0 ) q(x_0) q(x0) 是什么!
因此,我们只能通过 x 0 x_0 x0估计它的均值和方差。
🔁 反向采样公式估计,引入 x 0 x_0 x0,用可解的 q ( x t − 1 ∣ x t , x 0 ) q(x_{t-1} \mid x_t, x_0) q(xt−1∣xt,x0)
利用贝叶斯公式:
p ( x t − 1 ∣ x t , x 0 ) = p ( x t ∣ x t − 1 ) p ( x t − 1 ∣ x 0 ) p ( x t ∣ x 0 ) p\left(\boldsymbol{x}_{t-1} \mid \boldsymbol{x}_{t}, x_{0}\right)=\frac{p\left(\boldsymbol{x}_{t} \mid \boldsymbol{x}_{t-1}\right) p\left(\boldsymbol{x}_{t-1} \mid x_{0}\right)}{p\left(\boldsymbol{x}_{t} \mid \boldsymbol{x}_{0}\right)} p(xt−1∣xt,x0)=p(xt∣x0)p(xt∣xt−1)p(xt−1∣x0)
式子中每一项都是可解的高斯分布,所以我们可以用条件高斯乘积公式,得到:
p θ ( x t − 1 ∣ x t ) = N ( μ θ ( x t , t ) , σ t 2 I ) p_\theta(x_{t-1} | x_t) = \mathcal{N}(\mu_\theta(x_t, t), \sigma_t^2 I) pθ(xt−1∣xt)=N(μθ(xt,t),σt2I)
其中:
均值:
μ θ = 1 α t ( x t − 1 − α t 1 − α ˉ t ⋅ ϵ θ ( x t , t ) ) \mu_\theta = \frac{1}{\sqrt{\alpha_t}} \left( x_t - \frac{1 - \alpha_t}{\sqrt{1 - \bar{\alpha}_t}} \cdot \epsilon_\theta(x_t, t) \right) μθ=αt1(xt−1−αˉt1−αt⋅ϵθ(xt,t))
方差:
- 选择:方差 σ t 2 \sigma_t^2 σt2设为常数(不训练),实验发现两种选择效果相似:
- σ t 2 = β t \sigma_t^2 = \beta_t σt2=βt(对应数据初始为高斯分布)
- σ t 2 = 1 − α ˉ t − 1 1 − α ˉ t ⋅ β t \sigma_t^2 = \frac{1 - \bar{\alpha}_{t-1}}{1 - \bar{\alpha}_t} \cdot \beta_t σt2=1−αˉt1−αˉt−1⋅βt(对应数据初始为单点分布)
🤔 常见问题解析
Q1:为啥不直接训练一个学 x t − 1 x_{t-1} xt−1的模型?
- 空间太大,不容易收敛;
- 没法直接监督 x t − 1 x_{t-1} xt−1,但能监督 ϵ \epsilon ϵ
Q2:为什么不直接用预测的 x 0 x_0 x0 当作最终的生成结果?
- 预测的 x 0 x_0 x0 是近似值;
- 多个 x t x_t xt 推出的 x 0 x_0 x0 不一致;
- 扩散模型本质是一步步净化,不能一步到位。
Q3:为什么用 UNet 预测噪声 ϵ,而不是直接预测真实反向均值?
- 因为噪声 ϵ 的分布固定,预测更容易,训练更稳定;
- 通过数学推导(式10),发现可以改写为预测噪声ϵ的形式,计算更简单
🏋️♀️ 模型训练
训练时优化:
L simple = E x 0 , t , ϵ [ ∥ ϵ − ϵ θ ( x t , t ) ∥ 2 ] \mathcal{L}_{\text{simple}} = \mathbb{E}_{x_0, t, \epsilon} \left[ \left\| \epsilon - \epsilon_\theta(x_t, t) \right\|^2 \right] Lsimple=Ex0,t,ϵ[∥ϵ−ϵθ(xt,t)∥2]
流程如下:
- 从真实图像 x 0 x_0 x0 采样 t t t,加噪得 x t x_t xt
- 用网络预测噪声 ϵ θ ( x t , t ) \epsilon_\theta(x_t, t) ϵθ(xt,t)
- 用MSE计算损失,与真实 ϵ \epsilon ϵ 对比
🎨 推理 / 采样阶段
从高斯噪声 x T x_T xT 开始,按如下公式逐步采样直到 x 0 x_0 x0:
x t − 1 = μ θ ( x t , t ) + σ t ⋅ z , z ∼ N ( 0 , I ) x_{t-1} = \mu_\theta(x_t, t) + \sigma_t \cdot z, \quad z \sim \mathcal{N}(0, I) xt−1=μθ(xt,t)+σt⋅z,z∼N(0,I)
每步逻辑:
- 先预测噪声 ϵ θ \epsilon_\theta ϵθ
- 再估计 x 0 x_0 x0,推导 μ θ \mu_\theta μθ
- 加入随机噪声 z z z 得到 x t − 1 x_{t-1} xt−1
- 不断重复,最终得到生成图像!
🧩 Diffusion 模型模板代码
参考pytorch代码:GitHub - chunyu-li/ddpm: 扩散模型的简易 PyTorch 实现
1. 初始化和必要的导入
import torch
import torch.nn as nn
import torch.nn.functional as F
import matplotlib.pyplot as plt
from torch.utils.data import DataLoader
import torchvision
from torchvision import transforms
import numpy as np
import random
2. 定义 Beta Schedule 和相关函数
# 线性 beta schedule(控制每步噪声的大小)
def linear_beta_schedule(timesteps, start=0.0001, end=0.02):return torch.linspace(start, end, timesteps)# 获取累积的 alpha 值
def get_alphas(betas):return 1.0 - betas# 获取累积 alpha 的乘积
def get_alphas_cumprod(alphas):return torch.cumprod(alphas, axis=0)# 计算反向噪声的标准差
def get_posterior_variance(alphas_cumprod, alphas_cumprod_prev, betas):return betas * (1.0 - alphas_cumprod_prev) / (1.0 - alphas_cumprod)
3. 定义 Diffusion 模型(UNet)
class SimpleUnet(nn.Module):def __init__(self):super(SimpleUnet, self).__init__()# 这里定义一个简单的卷积网络作为示例,可以替换成更复杂的UNetself.conv1 = nn.Conv2d(3, 64, kernel_size=3, stride=1, padding=1)self.conv2 = nn.Conv2d(64, 128, kernel_size=3, stride=1, padding=1)self.fc1 = nn.Linear(128 * 64 * 64, 256)self.fc2 = nn.Linear(256, 3 * 64 * 64)def forward(self, x, t):x = F.relu(self.conv1(x))x = F.relu(self.conv2(x))x = x.view(x.size(0), -1) # Flatten for fully connected layersx = F.relu(self.fc1(x))x = self.fc2(x)return x.view(x.size(0), 3, 64, 64) # Reshape back to image shape
4. 扩散过程和去噪过程
正向扩散过程:从 x 0 x_0 x0 到 x t x_t xt
def forward_diffusion_sample(x_0, t, betas, alphas_cumprod):noise = torch.randn_like(x_0)sqrt_alphas_cumprod_t = alphas_cumprod[t].view(-1, 1, 1, 1) # 广播至批次维度sqrt_one_minus_alphas_cumprod_t = torch.sqrt(1.0 - alphas_cumprod[t]).view(-1, 1, 1, 1)x_t = sqrt_alphas_cumprod_t * x_0 + sqrt_one_minus_alphas_cumprod_t * noisereturn x_t, noise
反向扩散过程:从 x T x_T xT 到 x 0 x_0 x0
def sample_timestep(x_t, t, model, alphas_cumprod, betas):# 模型预测噪声epsilon_pred = model(x_t, t)# 计算当前时刻的均值和标准差sqrt_alphas_cumprod_t = alphas_cumprod[t].view(-1, 1, 1, 1)sqrt_one_minus_alphas_cumprod_t = torch.sqrt(1.0 - alphas_cumprod[t]).view(-1, 1, 1, 1)posterior_variance_t = betas[t].view(-1, 1, 1, 1)# 计算预测的x_0x_0_pred = (x_t - sqrt_one_minus_alphas_cumprod_t * epsilon_pred) / sqrt_alphas_cumprod_t# 反向采样noise = torch.randn_like(x_t) if t > 0 else torch.zeros_like(x_t)x_t_minus_1 = sqrt_alphas_cumprod[t - 1] * x_0_pred + sqrt_one_minus_alphas_cumprod[t - 1] * noisereturn x_t_minus_1
5. 损失函数(训练时)
def get_loss(model, x_0, t, betas, alphas_cumprod):x_t, noise = forward_diffusion_sample(x_0, t, betas, alphas_cumprod)noise_pred = model(x_t, t)return F.mse_loss(noise, noise_pred) # MSE 损失
6. 数据加载和预处理
def load_transformed_dataset(img_size=64, batch_size=128):data_transforms = [transforms.Resize((img_size, img_size)),transforms.RandomHorizontalFlip(),transforms.ToTensor(),transforms.Lambda(lambda t: (t * 2) - 1), # [0,1] -> [-1,1]]data_transform = transforms.Compose(data_transforms)train = torchvision.datasets.ImageFolder(root="./stanford_cars/cars_train", transform=data_transform)test = torchvision.datasets.ImageFolder(root="./stanford_cars/cars_test", transform=data_transform)dataset = torch.utils.data.ConcatDataset([train, test])return DataLoader(dataset, batch_size=batch_size, shuffle=True, drop_last=True)
7. 训练循环
if __name__ == "__main__":# 初始化model = SimpleUnet()T = 300 # 扩散步数betas = linear_beta_schedule(T)alphas = get_alphas(betas)alphas_cumprod = get_alphas_cumprod(alphas)BATCH_SIZE = 128epochs = 100dataloader = load_transformed_dataset(batch_size=BATCH_SIZE)device = "cuda" if torch.cuda.is_available() else "cpu"model.to(device)optimizer = torch.optim.Adam(model.parameters(), lr=0.001)for epoch in range(epochs):for batch_idx, (batch, _) in enumerate(dataloader):optimizer.zero_grad()batch = batch.to(device)t = torch.randint(0, T, (BATCH_SIZE,), device=device).long()loss = get_loss(model, batch, t, betas, alphas_cumprod)loss.backward()optimizer.step()if batch_idx % 10 == 0:print(f"Epoch [{epoch+1}/{epochs}], Step [{batch_idx+1}/{len(dataloader)}], Loss: {loss.item()}")
8. 采样(生成图像)
def generate_samples(model, T=300):# 从噪声开始x_t = torch.randn((BATCH_SIZE, 3, 64, 64)).to(device)for t in reversed(range(T)):x_t = sample_timestep(x_t, t, model, alphas_cumprod, betas)return x_t
9. 显示图像
def show_tensor_image(image):image = image.squeeze().cpu().numpy().transpose(1, 2, 0)image = (image + 1.0) / 2.0 # [-1, 1] -> [0, 1]plt.imshow(image)plt.axis('off')plt.show()
x_t = sample_timestep(x_t, t, model, alphas_cumprod, betas)
return x_t
### 9. 显示图像```python
def show_tensor_image(image):image = image.squeeze().cpu().numpy().transpose(1, 2, 0)image = (image + 1.0) / 2.0 # [-1, 1] -> [0, 1]plt.imshow(image)plt.axis('off')plt.show()
相关文章:
扩散模型 Diffusion Model 整体流程详解
🧠 Diffusion Model 思路、疑问和代码 文章目录 🧠 Diffusion Model 思路、疑问和代码🔄 一、核心思想:从噪声到图像📦 二、正向过程:加噪🧠 三、反向过程:学习去噪🎯 目…...
[Spark]深入解密Spark SQL源码:Catalyst框架如何优雅地解析你的SQL
本文内容组织形式 总结具体例子执行语句解析层优化层物理计划层执行层 猜你喜欢PS 总结 先写个总结,接下来会分别产出各个部分的源码解析,Spark SQL主要分为以下五个执行部分。 具体例子 接下来举个具体的例子来说明 执行语句 SELECT name, age FR…...
【数据结构_7】栈和队列(上)
一、概念 栈和队列,也是基于顺序表和链表实现的 栈是一种特殊的线性表,其只允许在固定的一段进行插入和删除元素操作。 遵循后进先出的原则 此处所见到的栈,本质上就是一个顺序表/链表,但是,实在顺序表/链表的基础…...
Linux中的cat命令常见用法
在 Linux 中,cat 命令是 concatenate(连接)的缩写,意思是“连接”或“串联”。 基本功能 cat 命令的主要功能是用于查看、合并和创建文件。它会将一个或多个文件的内容输出到标准输出设备(通常是终端屏幕)…...
css - 实现三角形 div 容器,用css画一个三角形(提供示例源码)简单粗暴几行代码搞定!
效果图 如下图所示,让一个 div 变成三角形,并且可随意更改大小, 本文提供了可运行示例源码,直接复制即可。 实现源码 建议创建一个 demo.html 文件,一键复制代码运行。 <style> .div{width: 0px;height: 0px…...
springboot 项目 jmeter简单测试流程
测试内容为 主机地址随机数 package com.hainiu.example;import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotat…...
设计模式实践:模板方法、观察者与策略模式详解
目录 1 模板方法1.1 模板方法基本概念1.2 实验1.2.1 未使用模板方法实现代码1.2.2 使用模板方法的代码 2 观察者模式2.1 观察者模式基本概念2.2 实验 3 策略模式3.1 策略模式基本概念3.2 实验 1 模板方法 1.1 模板方法基本概念 定义:一个操作中的算法的骨架 &…...
Google的AI模型Gemini和Gemini网络协议
粉丝私信问我:gemini如何访问? "Gemini如何访问"需明确区分两种完全不同的技术体系:Google的AI模型Gemini和Gemini网络协议。以下是两者的访问方式详解: 一、访问Google的Gemini AI模型 1. 通过Web应用 地址…...
HTTP实现心跳模块
HTTP实现心跳模块 使用轻量级的cHTTP库cpp-httplib重现实现HTTP心跳模块 头文件HttplibHeartbeat.h #ifndef HTTPLIB_HEARTBEAT_H #define HTTPLIB_HEARTBEAT_H#include <string> #include <thread> #include <atomic> #include <chrono> #include …...
基于web的民宿信息系统(源码+lw+部署文档+讲解),源码可白嫖!
摘要 随着信息时代的来临,民宿过去的民宿信息方式的缺点逐渐暴露,对过去的民宿信息的缺点进行分析,采取计算机方式构建民宿信息系统。本文通过阅读相关文献,研究国内外相关技术,提出了一种民宿信息管理、民宿信息管理…...
使用OpenSceneGraph (osg)实现一个星系漫游
简介 使用OpenSceneGraph (osg)实现了一个太阳系漫游的程序,具有以下特点: 1.通过按键控制飞行器前进后退、空间姿态; 2.星系渲染; 3.背景星空渲染; 效果 提供了一张超大的星空背景图 代码示例 int main(int a…...
笔试专题(九)
文章目录 十字爆破(暴力)题解代码 比那名居的桃子(滑动窗口/前缀和)题解代码 分组(暴力枚举 优化二分)题解代码 十字爆破(暴力) 题目链接 题解 1. 暴力 预处理 2. 如果单纯的暴…...
sklearn决策树 待更新
注意:sklearn中所有的决策树模型包括回归决策树实现的是CART决策树算法,在官方文档中有介绍。sklearn中的决策树模型最终得到的树结构都是二叉树,因为CART算法生成的就是二叉树。 DecisionTreeClassifier类 如果待预测样本有多个类别具有相同…...
eino v0.3.21 重磅发布!节点中断控制+空值映射支持,AI应用开发再添神器!
CloudWeGo/eino v0.3.21 作为最新补丁版本,聚焦流程控制与数据映射两大核心场景,为AI应用与微服务开发者提供更灵活的调试能力与容错设计! 1. 节点中断控制(Feat: Node Interrupt) • 功能亮点:新增 node …...
力扣每日打卡 50. Pow(x, n) (中等)
[TOC](力扣 50. Pow(x, n) 中等) 前言 这是刷算法题的第十一天,用到的语言是JS 题目:力扣 50. Pow(x, n) (中等) 一、题目内容 实现 pow(x, n) ,即计算 x 的整数 n 次幂函数(即,xn )。 示例 1࿱…...
Mac M1管理多个Node.js版本
目录 1. 使用 nvm (Node Version Manager) 1.1.安装 nvm 1.2.安装Node.js版本 1.3.查看已安装的node版本列表 1.4.使用特定版本的Node.js 1.5.查看当前使用的版本 2. 使用 fnm (Fast Node Manager) 2.1.安装 fnm 2.2.安装Node.js版本 2.3.查看已安装的版本 2.4.使用…...
arm_math.h、arm_const_structs.h 和 arm_common_tables.h
在 FOC(Field-Oriented Control,磁场定向控制) 中,arm_math.h、arm_const_structs.h 和 arm_common_tables.h 是 CMSIS-DSP 库的核心组件,用于实现高效的数学运算、预定义结构和查表操作。以下是它们在 FOC 控…...
每天五分钟深度学习:非线性激活函数的导数
本文重点 本文探讨了神经网络中几种常见非线性激活函数(Sigmoid、Tanh、ReLU、Leaky ReLU、ELU、Softmax)的导数特性。通过对各激活函数导数的数学推导与实际应用分析,揭示了不同激活函数在梯度传播、收敛速度及模型表达能力方面的差异。研究发现,ReLU及其变体在计算效率与…...
OpenHarmony5.0.2 USB摄像头适配
开发环境 OpenHarmony5.0.2 RK3568 USB摄像头 遇到问题 编译后插上USB摄像头后打开相机无图像 解决思路 5.0.2版本是支持USB摄像头的,需要修改默认的板载相机配置即可。 修改代码 1、修改配配置 文件地址:vendor/hihope/rk3568/hdf_config/uhdf…...
vue: router基础用法
router基础用法 1.安装router2.配置router3.路由编程1.编程式导航2.声明式导航 1.安装router 在node环境下,直接运行 npm install router42.配置router 创建文件夹并命名为router 在router文件夹中创建index.js index.js示例配置如下: import { creat…...
IDE中使用Spring Data Redis
步骤一:导入Spring Data Redis的maven坐标 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency> 步骤二:配置Redis数据源 步骤三&…...
【计网】网络交换技术之报文交换(复习自用,了解,重要3)
复习自用的,处理得比较草率,复习的同学或者想看基础的同学可以看看,大佬的话可以不用浪费时间在我的水文上了 另外两种交换技术可以直接点击链接访问相关笔记: 电路交换 分组交换 一、报文交换的定义 报文交换(Me…...
GitLab 17.x 配置 https
文章目录 使用外部 nginx 参考:https://docs.gitlab.com/omnibus/settings/nginx.html 使用内置 nginx 参考:https://docs.gitlab.com/omnibus/settings/ssl/index.html#configure-https-manually // 使用自己手工申请证书 $ mkdir /etc/gitlab/ssl $ m…...
中间件--ClickHouse-1--基础介绍(列式存储,MPP架构,分布式计算,SQL支持,向量化执行,亿万级数据秒级查询)
1、概述 ClickHouse是一个用于联机分析(OLAP)的列式数据库管理系统(DBMS)。它由俄罗斯的互联网巨头Yandex为解决其内部数据分析需求而开发,并于2016年开源。专为大规模数据分析,实时数据分析和复杂查询设计,具有高性能、实时数据和可扩展性等…...
【编写Node接口;接口动态获取VUE文件并异步加载, 并渲染impoort插件使用】
编写Node接口;接口动态获取VUE文件并异步加载, 并渲染impoort插件使用; vue3-sfc-loader主要特征: 编写Node接口:Vue2项目使用:Vue3项目使用:(页面按需加载插件、图片等)主要使用&am…...
vue入门:template 和 JSX
temlplate 和 jsx 最终渲染时都是创建 dom 节点 template 和 JSX 混合使用 <template><div><span>Message: {{ msg }}</span><br/><VNodes :vnodes"getJSXSpan()"/><VNodes :vnodes"getAnchoredHeading(4)"/>…...
[Dify] Dify 本地部署及连接 Ollama 模型全流程指南
在构建私有化智能应用时,Dify 作为一款开源的大模型应用开发平台,具备强大的插件体系和可扩展能力。本文将详细介绍如何在本地环境中部署 Dify,并成功连接本地的 Ollama 模型,解决实际部署过程中常见的问题与错误。 一、本地部署 Dify 步骤详解 1. 安装 Docker 环境(以 W…...
基于PyQt5的Jupyter Notebook转Python工具
一、项目背景与核心价值 在数据科学领域,Jupyter Notebook因其交互特性广受欢迎,但在生产环境中通常需要将其转换为标准Python文件。本文介绍一款基于PyQt5开发的桌面级转换工具,具有以下核心价值: 可视化操作:提供友好的GUI界面,告别命令行操作 批量处理:支持目录递归…...
从自然语言到 JSON 数据交互:探索 MCP 协议的自动化任务实现
好的!以下是基于我们讨论的关于 MCP 协议、JSON 数据交互以及自然语言到 JSON 转换的实现过程的总结,格式化为一篇 CSDN 风格的博客记录。这篇文章将记录你的发现,适合分享给技术社区。 从自然语言到 JSON 数据交互:探索 MCP 协议…...
n8n 本地部署及实践应用,实现零成本自动化运营 Telegram 频道(保证好使)
n8n 本地部署及实践应用,实现零成本自动化运营 Telegram 频道(保证好使) 简介 n8n 介绍 一、高度可定制性 二、丰富的连接器生态 三、自托管部署(本地部署) 四、社区驱动 n8n 的部署 一、前期准备 二、部署步…...
嵌入式学习(37)-STM32串口发送中断的实现
一、概述 项目中需要用到发送中断,所以了解了发送中断的一些知识。 二、应用 状态寄存器USART_SR的复位值为0x00C0H, 也就是第七位TXE和第六位TC复位值为1,而TXE1,表明发送数据寄存器为空, TC1表明发送已完成。 USART_ITConfig(USART1, USA…...
Android envsetup与Python venv使用指南
Android envsetup 和 Python venv 是两种完全不同的环境配置工具,分别服务于不同的开发场景。以下是对它们的详细解释及使用方法: 1. Android envsetup 用途: Android envsetup 是 Android 源码开发中的环境配置脚本(envsetup.sh…...
安卓关机和重启源码流程
// systemui关机 frameworks/base/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsComponent.java Overridepublic void shutdown() {try {mBarService.shutdown();} catch (RemoteException e) {}}frameworks/base/services/core/java/com/android…...
解决单设备号双目摄像头调用难题:经验分享与总结
解决单设备号双目摄像头调用难题:经验分享与总结 在计算机视觉项目中,双目摄像头的调用是常见需求,但过程中往往会遇到各种挑战。最近,我就经历了一段曲折但最终成功解决问题的历程,现在将这段宝贵经验分享给大家。 一、问题背景 我手头的双目摄像头仅有一个设备号(设…...
【RL系列】DAPO: An Open-Source LLM Reinforcement Learning System at Scale
1. 简介 尽管RL对complex reasoning效果提升有重要作用,但是在openAI o1和DeepSeek R1 technical report上都没有详细的实验细节。本文主要提出了DAPO算法,提出了4个关键技术点并开源参数和代码。在AIME 2024验证了DAPO算法的有效性。 2. Tricks Exc…...
五子棋(测试报告)
文章目录 一、项目介绍二、测试用例三、自动化测试用例的部分展示注册登录游戏大厅游戏匹配 总结 一、项目介绍 本项目是一款基于Spring、SpringMVC、MyBatis、WebSocket的双人实时对战五子棋游戏,游戏操作便捷,功能清晰明了。 二、测试用例 三、自动化测试用例的…...
【小工具】定时任务执行器
定时任务执行器 背景版本代码JobJob执行机 背景 有时我们的项目内需要一个定时执行器来执行某些任务,就需要一个简单好用的定时任务机。 注意,这个定时任务机并不原生支持分布式,如果需要分布式的功能请自己实现。 版本 jdk21 代码 Job …...
LVGL源码(7):渲染
在LVGL源码(4):LVGL关于EVENT事件的响应逻辑_lvgl实现显示打车-CSDN博客这篇文章中,我们提到了LVGL的三大步骤:检测用户输入操作、调用我们编写的逻辑、在屏幕上显示对应的画面;而在学习完“样式”之后,我们或许可以将上述步骤说明…...
02_通过调用硅基流动平台deepseekapi按输入的标题生成文章
from openai import OpenAIclient OpenAI(base_urlhttps://api.siliconflow.cn/v1,api_keyyou api-key )# 定义关键词变量 keyword "人性的弱点都有哪些?"# 发送带有流式输出的请求 response client.chat.completions.create(model"deepseek-ai/D…...
三、Virtual Device Manager
一、创建AVD AVD是Android Virtual Device(安卓虚拟设备),我们可以启动Android Studio 选择 Virtual Device Manager 创建并启动一个模拟器。 二、设置屏幕大小 上面直接创建的镜像是不能设置屏幕大小的,启动后笔记本屏幕都放不下ÿ…...
MATLAB2022b安装
1 从百度网盘下载MATLAB2022b,下载完成后解压到某个文件夹; 链接: MATLAB2022b 提取码: 6666 2 打开解压后的文件夹,进入setup文件夹,双击打开“setup.exe”文件; 3 在弹出窗口中选择“高级选项”-->“我有文件安…...
计算机编码
计算机,不能直接存储文字,存储的是编码。 计算机只能处理二进制的数据,其它数据,比如:0-9、a-z、A-Z,这些字符,我们可以定义一套规则来表示。假如:A用110表示,B用111表示…...
Dell EMC Unity NAS 认证方式介绍
近日有个客户要配置EMC Unity的NAS访问,我们知道NAS有Linux环境下的NFS和Windows环境下的SMB(也叫做CIFS)。单独配置其中的一种访问协议相对简单,但是客户提出的要求是要对文件系统同时NFS和SMB访问,这就有些复杂&…...
SpringAi 会话记忆功能
在使用chatGPT,豆包等产品后,就会发现他们的会话有“记忆”功能。 那么我们用API接口的话,这个是怎么实现的呢? 属于比较粗暴的方式,把之前的内容与新的提示词一起再次发给大模型。让我们看到他们有记忆功能。 下面介绍…...
BUUCTF-web刷题篇(25)
34.the mystery of ip 给出链接,输入得到首页: 有三个按钮,flag点击后发现页面窃取客户端的IP地址,通过给出的github代码中的php文件发现可以通过XFF或Client-IP传入值。使用hackbar或BP 使用XSS,通过github给出的目录…...
Elasticsearch 性能优化:从原理到实践的全面指南
Elasticsearch(ES)作为一款基于 Lucene 的分布式搜索和分析引擎,广泛应用于日志分析、搜索引擎和实时数据处理等场景。然而,在高并发、大数据量环境下,Elasticsearch 的性能可能面临瓶颈,如查询延迟高、索引…...
UITableVIew性能优化概述
UITableVIew性能优化概述 文章目录 UITableVIew性能优化概述前言如何优化优化的本质卡顿的原因 CPU层级cell复用UITableVIew尽量采用复用 定义cell的种类尽量少,可以多用hidden缓存cell高度基础设置预先设置高度设置一个预先缓存 异步绘制滑动按照需加载尽量显示大小…...
【Linux网络与网络编程】09.传输层协议TCP
前言 TCP 即 传输控制协议 (Transmission Control Protocol),该协议要对数据的传输进行一个详细的控制(数据传输时什么时候传输,一次发多少,怎么发,出错了怎么办……) 本篇博客将从下面这张TCP协议格式图…...
08.unity 游戏开发-unity编辑器资源的导入导出分享
08.unity 游戏开发-unity编辑器资源的导入导出分享 提示:帮帮志会陆续更新非常多的IT技术知识,希望分享的内容对您有用。本章分享的是Python基础语法。前后每一小节的内容是存在的有:学习and理解的关联性,希望对您有用~ unity简介…...
Docker Swarm 集群
Docker Swarm 集群 本文档介绍了 Docker Swarm 集群的基本概念、工作原理以及相关命令使用示例,包括如何在服务调度中使用自定义标签。本文档适用于需要管理和扩展 Docker 容器化应用程序的生产环境场景。 1. 什么是 Docker Swarm Docker Swarm 是用于管理 Docker…...