大模型,多模态大模型面试【LoRA,分类,动静态数据类型,DDPM,ControlNet,IP-Adapter, Stable Diffusion】

大模型,多模态大模型面试【LoRA,分类,动静态数据类型,DDPM,ControlNet,IP-Adapter, Stable Diffusion】

  • 问题一:LoRA是用在节省资源的场景下,那么LoRA具体是节省了内存带宽还是显存呢?
  • 问题二:假如用pytorch完成一个分类任务,那么具体的流程是怎么样的?
  • 问题三:详细介绍一下DDPM
      • [**1. 概述**](#1. 概述)
      • [**2. 背景**](#2. 背景)
      • [**3. 模型原理**](#3. 模型原理)
        • [**3.1 正向扩散过程**](#3.1 正向扩散过程)
        • [**3.2 反向去噪过程**](#3.2 反向去噪过程)
      • [**4. 训练过程**](#4. 训练过程)
      • [**5. 采样过程**](#5. 采样过程)
      • [**6. 模型优势**](#6. 模型优势)
      • [**7. 应用场景**](#7. 应用场景)
      • [**8. 近期发展**](#8. 近期发展)
      • [**9. 数学细节**](#9. 数学细节)
      • [**10. 总结**](#10. 总结)
      • [**11. 参考文献**](#11. 参考文献)
  • 问题四:python的动态和静态数据类型分别有哪些?
  • 问题五:介绍一下ControlNet原理
      • **目录**
      • [**1. 概述**](#1. 概述)
      • [**2. 背景**](#2. 背景)
      • [**3. ControlNet的核心原理**](#3. ControlNet的核心原理)
        • [**3.1 扩散模型简介**](#3.1 扩散模型简介)
        • [**3.2 控制信号的引入**](#3.2 控制信号的引入)
      • [**4. 网络结构**](#4. 网络结构)
        • [**4.1 主干网络(Backbone)**](#4.1 主干网络(Backbone))
        • [**4.2 控制网络(Control Network)**](#4.2 控制网络(Control Network))
        • [**4.3 零卷积层(Zero Convolution)**](#4.3 零卷积层(Zero Convolution))
      • [**5. 训练方法**](#5. 训练方法)
        • [**5.1 冻结预训练模型**](#5.1 冻结预训练模型)
        • [**5.2 训练控制分支**](#5.2 训练控制分支)
      • [**6. 应用场景**](#6. 应用场景)
        • [**6.1 边缘检测控制**](#6.1 边缘检测控制)
        • [**6.2 姿态估计控制**](#6.2 姿态估计控制)
        • [**6.3 深度图控制**](#6.3 深度图控制)
      • [**7. 优势与特点**](#7. 优势与特点)
      • [**8. 总结**](#8. 总结)
      • [**9. 参考文献**](#9. 参考文献)
  • [问题六:对大模型推理时的参数有什么了解吗?top_k, temperature, beam_search, grid_Search](#问题六:对大模型推理时的参数有什么了解吗?top_k, temperature, beam_search, grid_Search)
      • [**1. Temperature(温度)**](#1. Temperature(温度))
      • [**2. Top-k 采样**](#2. Top-k 采样)
      • [**3. Beam Search(束搜索)**](#3. Beam Search(束搜索))
      • [**4. Grid Search(网格搜索)**](#4. Grid Search(网格搜索))
      • [**5. 总结与对比**](#5. 总结与对比)
      • [**6. 实际应用建议**](#6. 实际应用建议)
      • [**7. 其他相关参数和方法**](#7. 其他相关参数和方法)
  • 问题七:介绍一下IP-Adapter原理
      • **目录**
      • [**1. 概述**](#1. 概述)
      • [**2. 背景**](#2. 背景)
      • [**3. IP-Adapter 的核心原理**](#3. IP-Adapter 的核心原理)
        • [**3.1 模型结构**](#3.1 模型结构)
        • [**3.2 特征适配与控制**](#3.2 特征适配与控制)
      • [**4. 训练方法**](#4. 训练方法)
        • [**4.1 预训练阶段**](#4.1 预训练阶段)
        • [**4.2 微调阶段**](#4.2 微调阶段)
      • [**5. 应用场景**](#5. 应用场景)
        • [**5.1 图像生成与编辑**](#5.1 图像生成与编辑)
        • [**5.2 图像风格迁移**](#5.2 图像风格迁移)
      • [**6. 优势与特点**](#6. 优势与特点)
      • [**7. 相关技术**](#7. 相关技术)
      • [**8. 总结**](#8. 总结)
      • [**9. 参考资料**](#9. 参考资料)
  • [问题八:Stable Diffusion的条件生成原理](#问题八:Stable Diffusion的条件生成原理)
      • [1. 扩散模型概述](#1. 扩散模型概述)
      • [2. 条件生成的核心思想](#2. 条件生成的核心思想)
      • [3. 文本条件生成(Text-to-Image Generation)](#3. 文本条件生成(Text-to-Image Generation))
        • [1. 文本编码](#1. 文本编码)
        • [2. 扩散模型中的条件注入](#2. 扩散模型中的条件注入)
        • [3. 去噪过程中的条件控制](#3. 去噪过程中的条件控制)
      • [4. 图像条件生成(Image-to-Image Generation)](#4. 图像条件生成(Image-to-Image Generation))
        • [1. 条件图像编码](#1. 条件图像编码)
        • [2. 去噪引导生成](#2. 去噪引导生成)
      • [5. 条件生成的优点与应用](#5. 条件生成的优点与应用)
      • [6. 总结](#6. 总结)
  • [问题九:说一下什么时候用Stable Diffusion的条件生成,什么时候用IP-Adapter,什么时候用ControlNet。](#问题九:说一下什么时候用Stable Diffusion的条件生成,什么时候用IP-Adapter,什么时候用ControlNet。)
      • [1. Stable Diffusion 的条件生成](#1. Stable Diffusion 的条件生成)
      • [2. IP-Adapter](#2. IP-Adapter)
      • [3. ControlNet](#3. ControlNet)
      • 结论

问题一:LoRA是用在节省资源的场景下,那么LoRA具体是节省了内存带宽还是显存呢?

LoRA(Low-Rank Adaptation)主要是通过减少需要训练的参数数量来节省资源,因此它主要节省的是显存(VRAM) 。在大型模型的微调过程中,显存的占用主要来自于需要训练的参数以及它们的梯度和优化器状态。LoRA通过在预训练模型的权重矩阵上添加低秩的适应性层,极大地减少了需要更新的参数数量。这意味着在训练过程中,显存占用会显著降低,因为需要存储和计算的参数和梯度变少了。

虽然LoRA也可以间接地减少一些内存带宽的消耗(因为需要传输的数据量减少了),但相比之下,显存的节省更加显著。因此,在资源受限的环境下,如显存较小的GPU上,LoRA可以让您有效地微调大型模型,而不需要完整地加载和更新所有模型参数。

问题二:假如用pytorch完成一个分类任务,那么具体的流程是怎么样的?

要使用PyTorch完成一个分类任务,可以按照以下步骤进行:

  1. 导入必要的库
python 复制代码
import torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import DataLoader, Dataset
from torchvision import datasets, transforms
  1. 准备数据集

    • 数据加载和预处理

      使用torchvision.datasets加载内置数据集,或自定义数据集。应用transforms进行数据预处理,如调整大小、归一化等。

    • 划分数据集

      将数据集划分为训练集、验证集和测试集。

    • 创建数据加载器

python 复制代码
transform = transforms.Compose([
    transforms.Resize((224, 224)),
    transforms.ToTensor(),
    # 如果需要,可添加归一化或其他数据增强操作
])

train_dataset = datasets.ImageFolder(root='path_to_train_data', transform=transform)
train_loader = DataLoader(train_dataset, batch_size=32, shuffle=True)

val_dataset = datasets.ImageFolder(root='path_to_val_data', transform=transform)
val_loader = DataLoader(val_dataset, batch_size=32, shuffle=False)

test_dataset = datasets.ImageFolder(root='path_to_test_data', transform=transform)
test_loader = DataLoader(test_dataset, batch_size=32, shuffle=False)
  1. 定义模型架构

    • 自定义模型

      可以根据任务需求自定义神经网络模型。

python 复制代码
class SimpleNet(nn.Module):
    def __init__(self, num_classes):
        super(SimpleNet, self).__init__()
        self.layer1 = nn.Sequential(
            nn.Conv2d(3, 16, kernel_size=5, stride=1, padding=2),
            nn.ReLU(),
            nn.MaxPool2d(kernel_size=2, stride=2))
        # 可以添加更多层
        self.fc = nn.Linear(16 * 112 * 112, num_classes)

    def forward(self, x):
        out = self.layer1(x)
        # 根据网络结构调整展平尺寸
        out = out.view(out.size(0), -1)
        out = self.fc(out)
        return out

model = SimpleNet(num_classes=10)  # 假设分类数为10
  • 使用预训练模型

    也可以使用torchvision.models中的预训练模型,并根据需要进行微调。

python 复制代码
from torchvision import models

model = models.resnet18(pretrained=True)
# 冻结卷积层参数
for param in model.parameters():
    param.requires_grad = False
# 修改全连接层
model.fc = nn.Linear(model.fc.in_features, num_classes)
  1. 定义损失函数和优化器
python 复制代码
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)
  1. 训练模型
python 复制代码
num_epochs = 10
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
model.to(device)

for epoch in range(num_epochs):
    model.train()
    running_loss = 0.0
    for images, labels in train_loader:
        images = images.to(device)
        labels = labels.to(device)

        optimizer.zero_grad()
        outputs = model(images)
        loss = criterion(outputs, labels)
        loss.backward()
        optimizer.step()

        running_loss += loss.item()
    average_loss = running_loss / len(train_loader)
    print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {average_loss:.4f}')
  1. 验证模型
python 复制代码
model.eval()
with torch.no_grad():
    correct = 0
    total = 0
    for images, labels in val_loader:
        images = images.to(device)
        labels = labels.to(device)
        outputs = model(images)
        _, predicted = torch.max(outputs.data, 1)
        total += labels.size(0)
        correct += (predicted == labels).sum().item()
    accuracy = 100 * correct / total
    print(f'Validation Accuracy: {accuracy:.2f}%')
  1. 测试模型
python 复制代码
model.eval()
with torch.no_grad():
    correct = 0
    total = 0
    for images, labels in test_loader:
        images = images.to(device)
        labels = labels.to(device)
        outputs = model(images)
        _, predicted = torch.max(outputs.data, 1)
        total += labels.size(0)
        correct += (predicted == labels).sum().item()
    accuracy = 100 * correct / total
    print(f'Test Accuracy: {accuracy:.2f}%')
  1. 保存和加载模型

    • 保存模型
python 复制代码
torch.save(model.state_dict(), 'model.pth')
  • 加载模型
python 复制代码
model = SimpleNet(num_classes=10)
model.load_state_dict(torch.load('model.pth'))
model.to(device)
model.eval()
  1. 性能评估

    • 混淆矩阵、精确率、召回率等

      可以使用sklearn.metrics中的函数对模型进行更深入的评估。

python 复制代码
from sklearn.metrics import classification_report, confusion_matrix

# 收集所有预测和真实标签
all_preds = []
all_labels = []

with torch.no_grad():
    for images, labels in test_loader:
        images = images.to(device)
        outputs = model(images)
        _, predicted = torch.max(outputs.data, 1)
        all_preds.extend(predicted.cpu().numpy())
        all_labels.extend(labels.numpy())

print(classification_report(all_labels, all_preds))

注意事项:

  • 使用GPU加速

    确保将模型和数据移动到GPU,以加快训练和推理速度。

  • 数据增强

    transforms中添加数据增强操作,如随机翻转、随机裁剪等,提升模型的泛化能力。

python 复制代码
transform = transforms.Compose([
    transforms.RandomResizedCrop(224),
    transforms.RandomHorizontalFlip(),
    transforms.ToTensor(),
    # 添加归一化
])
  • 调整超参数

    根据模型表现,调整学习率、批量大小、优化器等超参数。

  • 早停和学习率调度

    引入早停机制和学习率调度器,防止过拟合并加速收敛。

python 复制代码
scheduler = optim.lr_scheduler.StepLR(optimizer, step_size=7, gamma=0.1)
  • 日志记录

    使用TensorBoard或其他日志工具,实时监控训练过程中的损失和准确率。

python 复制代码
from torch.utils.tensorboard import SummaryWriter

writer = SummaryWriter('runs/exp1')

通过以上步骤,您可以使用PyTorch完成一个基本的分类任务。根据具体需求,可能需要对模型和训练过程进行更细致的调整。

问题三:详细介绍一下DDPM

扩散去噪概率模型(Denoising Diffusion Probabilistic Models,DDPM)详细介绍


目录

  1. 概述
  2. 背景
  3. 模型原理
    • 正向扩散过程
    • 反向去噪过程
  4. 训练过程
  5. 采样过程
  6. 模型优势
  7. 应用场景
  8. 近期发展
  9. 数学细节
  10. 总结
  11. 参考文献

1. 概述

扩散去噪概率模型(DDPM)是一类生成模型,利用马尔可夫链逐步添加和去除噪声来生成数据。它在图像生成、音频生成等领域表现出色,生成质量与生成对抗网络(GAN)相当甚至更好,同时训练更加稳定。


2. 背景

生成模型的目标是学习数据的概率分布,以生成新的、类似于训练数据的样本。传统生成模型如GAN和变分自编码器(VAE)在训练稳定性和生成质量上存在一定的挑战。DDPM通过引入扩散过程,提供了一种新的生成框架,克服了这些挑战。


3. 模型原理

3.1 正向扩散过程

正向过程(Forward Diffusion Process)将数据逐步添加噪声,使其接近标准正态分布。具体来说,对于原始数据 x 0 x_0 x0,在每个时间步 t t t添加少量高斯噪声:

q ( x t ∣ x t − 1 ) = N ( x t ; 1 − β t x t − 1 , β t I ) q(x_t | x_{t-1}) = \mathcal{N}(x_t; \sqrt{1 - \beta_t} x_{t-1}, \beta_t \mathbf{I}) q(xt∣xt−1)=N(xt;1−βt xt−1,βtI)

  • x t x_t xt:第 t t t步的带噪声数据。
  • β t \beta_t βt:预设的噪声调度参数,通常在 ( 0 , 1 ) (0, 1) (0,1)之间。

通过多次迭代,数据逐渐被完全噪声化,最终 x T x_T xT近似于标准正态分布。

3.2 反向去噪过程

反向过程(Reverse Denoising Process)试图从纯噪声 x T x_T xT开始,逐步去除噪声,重建原始数据 x 0 x_0 x0。由于真实的反向分布 q ( x t − 1 ∣ x t ) q(x_{t-1} | x_t) q(xt−1∣xt)不可知,我们使用神经网络 p θ ( x t − 1 ∣ x t ) p_\theta(x_{t-1} | x_t) pθ(xt−1∣xt)进行近似:

p θ ( x t − 1 ∣ x t ) = N ( x t − 1 ; μ θ ( x t , t ) , Σ θ ( x t , t ) ) p_\theta(x_{t-1} | x_t) = \mathcal{N}(x_{t-1}; \mu_\theta(x_t, t), \Sigma_\theta(x_t, t)) pθ(xt−1∣xt)=N(xt−1;μθ(xt,t),Σθ(xt,t))

  • μ θ \mu_\theta μθ和 Σ θ \Sigma_\theta Σθ:由神经网络参数化的均值和方差函数。

4. 训练过程

训练的目标是让模型 p θ p_\theta pθ尽可能贴近真实的反向分布 q q q。为了实现这一点,定义了变分下界(Variational Lower Bound, VLB)损失函数。但Ho等人发现,优化一个简化的损失函数效果更好:

L simple = E x 0 , ϵ , t [ ∥ ϵ − ϵ θ ( x t , t ) ∥ 2 ] L_{\text{simple}} = \mathbb{E}{x_0, \epsilon, t} \left[ \| \epsilon - \epsilon\theta(x_t, t) \|^2 \right] Lsimple=Ex0,ϵ,t[∥ϵ−ϵθ(xt,t)∥2]

  • ϵ \epsilon ϵ:添加的噪声。
  • ϵ θ \epsilon_\theta ϵθ:模型预测的噪声。

训练步骤:

  1. 从数据分布 q ( x 0 ) q(x_0) q(x0)采样 x 0 x_0 x0。
  2. 采样时间步 t ∼ Uniform ( 1 , T ) t \sim \text{Uniform}(1, T) t∼Uniform(1,T)。
  3. 采样噪声 ϵ ∼ N ( 0 , I ) \epsilon \sim \mathcal{N}(0, \mathbf{I}) ϵ∼N(0,I)。
  4. 生成带噪声的数据 x t = α ˉ t x 0 + 1 − α ˉ t ϵ x_t = \sqrt{\bar{\alpha}_t} x_0 + \sqrt{1 - \bar{\alpha}_t} \epsilon xt=αˉt x0+1−αˉt ϵ。
  5. 最小化 L simple L_{\text{simple}} Lsimple,更新模型参数 θ \theta θ。

5. 采样过程

在训练完成后,采样过程如下:

  1. 从标准正态分布采样 x T ∼ N ( 0 , I ) x_T \sim \mathcal{N}(0, \mathbf{I}) xT∼N(0,I)。
  2. 对 t t t从 T T T到 1 1 1迭代:
    • 使用模型预测噪声 ϵ θ ( x t , t ) \epsilon_\theta(x_t, t) ϵθ(xt,t)。
    • 计算 μ θ ( x t , t ) \mu_\theta(x_t, t) μθ(xt,t):
      μ θ ( x t , t ) = 1 α t ( x t − β t 1 − α ˉ t ϵ θ ( x t , t ) ) \mu_\theta(x_t, t) = \frac{1}{\sqrt{\alpha_t}} \left( x_t - \frac{\beta_t}{\sqrt{1 - \bar{\alpha}t}} \epsilon\theta(x_t, t) \right) μθ(xt,t)=αt 1(xt−1−αˉt βtϵθ(xt,t))
    • 从 p θ ( x t − 1 ∣ x t ) p_\theta(x_{t-1} | x_t) pθ(xt−1∣xt)中采样 x t − 1 x_{t-1} xt−1:
      x t − 1 = μ θ ( x t , t ) + σ t z , z ∼ N ( 0 , I ) x_{t-1} = \mu_\theta(x_t, t) + \sigma_t z, \quad z \sim \mathcal{N}(0, \mathbf{I}) xt−1=μθ(xt,t)+σtz,z∼N(0,I)
  3. 最终得到 x 0 x_0 x0,即生成的样本。

6. 模型优势

  • 高质量生成:生成的样本清晰且多样性高。
  • 训练稳定:没有GAN中的模式崩溃问题。
  • 灵活性:易于与条件信息结合,进行条件生成。

7. 应用场景

  • 图像生成:生成高分辨率、逼真的图像。
  • 图像编辑:图像修复、超分辨率、风格迁移等。
  • 音频生成:语音合成、音乐生成。
  • 文本生成:自然语言处理中的文本生成任务。

8. 近期发展

  • 速度优化:如DDIM(Denoising Diffusion Implicit Models)通过减少采样步骤,提高生成速度。
  • 条件扩散模型:结合文本、标签等条件信息,实现条件生成,如文本到图像的生成。
  • 改进的网络结构:引入Transformer、自注意力机制等,提升模型性能。

9. 数学细节

  • 噪声调度参数 : β t \beta_t βt通常采用线性或余弦调度,以控制每个时间步添加的噪声量。
  • 累积系数 : α t = 1 − β t \alpha_t = 1 - \beta_t αt=1−βt, α ˉ t = ∏ s = 1 t α s \bar{\alpha}t = \prod{s=1}^t \alpha_s αˉt=∏s=1tαs,用于简化公式。
  • 模型架构:通常使用U-Net结构,结合多尺度特征和跳跃连接,提升对高分辨率图像的生成能力。

10. 总结

DDPM通过模拟数据的正向噪声添加和反向去噪过程,实现了从噪声到数据的生成。其训练稳定、生成质量高,已经成为生成模型领域的重要方向。随着研究的深入,扩散模型的应用范围和性能都在不断提升。


11. 参考文献

  1. Ho, J., Jain, A., & Abbeel, P. (2020) . Denoising Diffusion Probabilistic Models. arXiv preprint arXiv:2006.11239.
  2. Song, Y., & Ermon, S. (2019) . Generative Modeling by Estimating Gradients of the Data Distribution. arXiv preprint arXiv:1907.05600.
  3. Nichol, A. Q., & Dhariwal, P. (2021) . Improved Denoising Diffusion Probabilistic Models. arXiv preprint arXiv:2102.09672.

注意事项

  • 计算复杂度:DDPM需要多次迭代,计算量较大,可通过优化采样步骤来提升效率。
  • 模型参数选择:噪声调度、网络结构等参数的选择对模型性能有重要影响。
  • 实际应用:在实际应用中,需要结合任务需求,对模型进行定制和优化。

希望以上内容对您深入理解DDPM有所帮助。如有疑问,欢迎继续提问!

问题四:python的动态和静态数据类型分别有哪些?

Python中的动态和静态数据类型


在Python中,动态和静态数据类型并不是官方或标准的术语。然而,Python是一种**动态类型(dynamically typed)**的语言,这意味着变量的类型是在运行时确定的,变量可以被重新赋值为不同类型的对象。

尽管如此,我们可以从可变性(mutability)的角度来理解数据类型的分类,即 可变类型(mutable)不可变类型(immutable)。这可能是您指的"动态"和"静态"数据类型。

以下是Python中的可变和不可变数据类型:


不可变数据类型(类似于"静态")

不可变对象在创建后其状态(内容)不能被更改。如果尝试修改,会创建一个新的对象。

  • 数字类型(Numbers)
    • int(整数)
    • float(浮点数)
    • complex(复数)
  • 字符串(String)
    • str
  • 元组(Tuple)
    • tuple
  • 冻结集合(Frozen Set)
    • frozenset
  • 字节(Bytes)
    • bytes

示例:

python 复制代码
a = 10
print(id(a))  # 输出对象的内存地址,例如:140705874211072

a = a + 5
print(id(a))  # 输出新的内存地址,例如:140705874211232

# 由于整数是不可变的,执行a + 5时会创建一个新对象,而不是修改原对象

可变数据类型(类似于"动态")

可变对象在创建后其状态(内容)可以被更改,而无需创建新的对象。

  • 列表(List)
    • list
  • 字典(Dictionary)
    • dict
  • 集合(Set)
    • set
  • 字节数组(Bytearray)
    • bytearray

示例:

python 复制代码
my_list = [1, 2, 3]
print(id(my_list))  # 输出对象的内存地址,例如:2215633564992

my_list.append(4)
print(id(my_list))  # 内存地址不变,仍然是2215633564992

# 列表是可变的,对其进行修改不会创建新对象

详细解释

不可变数据类型
  • 数字类型
    • 包括整数、浮点数和复数。一旦创建,数值本身不可更改。
  • 字符串
    • 字符串中的字符不可修改,任何修改操作都会生成一个新的字符串对象。
  • 元组
    • 元组是不可变的序列,元素值不能修改。
  • 冻结集合
    • 类似于集合,但不可变,元素添加或删除操作不可用。
  • 字节
    • 不可变的字节序列。
可变数据类型
  • 列表
    • 可变的序列,支持添加、删除和修改元素。
  • 字典
    • 键值对的集合,键必须是不可变类型,值可以是任意类型。支持添加、删除和修改键值对。
  • 集合
    • 无序且不重复的元素集合,支持添加和删除元素。
  • 字节数组
    • 可变的字节序列。

为什么可变性重要?

  • 性能
    • 修改可变对象无需创建新对象,效率更高。
  • 函数参数传递
    • 当可变对象作为参数传递给函数时,函数内的修改会影响到原对象。
  • 哈希性(Hashability)
    • 不可变对象是可哈希的,可作为字典的键和集合的元素。可变对象通常不可哈希。

变量类型的动态性

Python中的变量实际上是对对象的引用,变量名可以在程序的不同阶段指向不同类型的对象。这体现了Python的动态类型特性。

示例:

python 复制代码
x = 10      # x是整数
x = "Hello" # 现在x是字符串
x = [1, 2]  # 现在x是列表

注意事项

  • 自定义对象
    • 类的实例(对象)可以根据类的定义被设计为可变或不可变。
  • 不可变但内容可变的对象
    • 某些不可变对象可能包含可变的元素,例如元组包含列表,这种情况下元组本身不可变,但其包含的列表可以改变。

总结

  • 动态类型
    • 变量在运行时可以指向不同类型的对象,类型检查和绑定发生在运行时。
  • 可变性
    • 根据对象是否可以在创建后被修改,Python数据类型分为可变和不可变类型。

如果您指的是其他概念,例如Python的类型检查机制、动态类型和静态类型语言的区别,或者其他方面,请进一步说明,以便我提供更准确的回答。


希望以上内容对您有所帮助!如有其他问题,欢迎继续提问。

问题五:介绍一下ControlNet原理

ControlNet原理详解


目录

  1. 概述
  2. 背景
  3. ControlNet的核心原理
    • 扩散模型简介
    • 控制信号的引入
  4. 网络结构
    • 主干网络(Backbone)
    • 控制网络(Control Network)
    • 零卷积层(Zero Convolution)
  5. 训练方法
    • 冻结预训练模型
    • 训练控制分支
  6. 应用场景
    • 边缘检测控制
    • 姿态估计控制
    • 深度图控制
  7. 优势与特点
  8. 总结
  9. 参考文献

1. 概述

ControlNet是一种用于控制扩散模型生成过程的神经网络结构。它允许在预训练的大型扩散模型中引入额外的条件输入,从而精确地操纵生成结果。这在图像生成任务中尤为有用,例如根据边缘图、姿态图或深度图生成对应的高质量图像。


2. 背景

扩散模型(Diffusion Models)近年来在生成任务中表现出色。然而,传统的扩散模型通常缺乏对生成结果的精细控制。为了解决这一问题,ControlNet应运而生,它可以在不影响预训练模型能力的前提下,加入额外的控制信号,实现对生成过程的精确操纵。


3. ControlNet的核心原理

3.1 扩散模型简介

扩散模型是一类生成模型,通过模拟数据的逐步噪声添加和去除过程,实现从噪声到数据的生成。在训练过程中,模型学习如何从带噪声的数据中恢复原始数据。

3.2 控制信号的引入

ControlNet的核心思想是为扩散模型添加额外的控制条件,例如边缘图、姿态图等。这些控制信号可以指导生成过程,使得生成的图像与控制条件相一致。


4. 网络结构

ControlNet的网络结构主要包括两个部分:主干网络控制网络

4.1 主干网络(Backbone)

主干网络通常是预训练的扩散模型,例如Stable Diffusion。该部分负责基本的图像生成能力,在ControlNet中通常被冻结,不参与训练。

4.2 控制网络(Control Network)

控制网络是一个与主干网络结构相似的网络,用于处理控制信号。它接收控制条件,并将其特征提取后融合到主干网络中。

4.3 零卷积层(Zero Convolution)

为了确保在初始状态下,控制网络对主干网络的影响最小,ControlNet在控制网络的每个卷积层后面添加了零卷积层。零卷积层的初始权重为零,确保在训练开始时,控制网络的输出为零,不干扰主干网络的功能。


5. 训练方法

5.1 冻结预训练模型

在训练过程中,主干网络的参数被冻结,只训练控制网络的参数。这使得模型可以在保持原有生成能力的同时,学习如何利用控制信号。

5.2 训练控制分支

通过对控制网络的训练,模型逐渐学会如何将控制信号融合到生成过程中。训练目标是最小化生成图像与目标图像之间的差异,同时满足控制条件。


6. 应用场景

ControlNet可以应用于多种场景,通过不同的控制信号,实现对生成图像的精确控制。

6.1 边缘检测控制

使用边缘图作为控制信号,可以生成与给定轮廓相匹配的图像。

6.2 姿态估计控制

通过人体姿态图,生成符合特定姿态的人物图像。

6.3 深度图控制

利用深度图信息,生成具有特定三维结构的图像。


7. 优势与特点

  • 精确控制生成结果:能够根据给定的控制信号,生成符合期望的图像。
  • 充分利用预训练模型:通过冻结主干网络,保持了预训练模型的强大生成能力。
  • 灵活性高:可以适用于多种类型的控制信号,扩展性强。

8. 总结

ControlNet通过在预训练的扩散模型中引入控制网络,实现了对生成过程的精确控制。其核心在于在保持原有模型能力的同时,利用额外的控制信号指导生成过程。这为图像生成任务提供了新的思路和工具,在实际应用中具有广泛的前景。


9. 参考文献

  1. ControlNet论文 :Lvmin Zhang, Maneesh Agrawala. Adding Conditional Control to Text-to-Image Diffusion Models. 2023.
  2. 扩散模型简介 :Ho, J., Jain, A., & Abbeel, P. Denoising Diffusion Probabilistic Models. 2020.

:以上内容旨在提供对ControlNet原理的全面介绍,帮助读者理解其核心思想和应用方式。

了解模型推理时的参数:Top-k、Temperature、Beam Search、Grid Search


在自然语言处理(NLP)和生成式模型的推理过程中,为了控制生成结果的质量和多样性,常常会使用一些参数和策略。这些参数包括Top-kTemperatureBeam SearchGrid Search等。下面我将详细介绍这些概念及其在模型推理中的作用。


1. Temperature(温度)

概念:

  • Temperature是一个用于调整模型输出概率分布的参数,控制生成文本的随机性和多样性。

原理:

  • 在模型生成下一个词时,使用softmax函数将模型的原始输出(logits)转换为概率分布:

    P i = exp ⁡ ( z i T ) ∑ j exp ⁡ ( z j T ) P_i = \frac{\exp\left(\frac{z_i}{T}\right)}{\sum_j \exp\left(\frac{z_j}{T}\right)} Pi=∑jexp(Tzj)exp(Tzi)

    • z i z_i zi:模型对词汇表中第 i i i个词的logit值。
    • T T T:温度参数, T > 0 T > 0 T>0。
  • 影响:

    • T = 1 T = 1 T=1:原始概率分布,不做修改。
    • T < 1 T < 1 T<1:使概率分布更尖锐,模型更倾向于选择高概率的词,生成结果更确定,但可能缺乏多样性。
    • T > 1 T > 1 T>1:使概率分布更平滑,增加低概率词的选择机会,生成结果更随机,更有创造性。

示例:

  • 低温度( T = 0.7 T=0.7 T=0.7):

    • 生成文本更加保守,连贯性强,较少出现意外的词语。
  • 高温度( T = 1.5 T=1.5 T=1.5):

    • 生成文本更具多样性,但可能出现不连贯或不合理的词语。

2. Top-k 采样

概念:

  • Top-k采样 是在生成下一个词时,只考虑概率最高的前 k k k个词,将其他词的概率置零,然后重新归一化概率分布,从中进行随机采样。

原理:

  • 通过限制候选词的数量,避免长尾低概率词的影响,保证生成结果的质量。

步骤:

  1. 获取模型对所有词的概率分布 P P P。
  2. 选取概率最高的前 k k k个词,其余词的概率置零。
  3. 对剩余的 k k k个词的概率重新归一化,使其总和为1。
  4. 从新的概率分布中随机采样下一个词。

影响:

  • 较小的 k k k值(如 k = 5 k=5 k=5):

    • 生成结果更加确定,重复性可能增加,可能缺乏多样性。
  • 较大的 k k k值(如 k = 50 k=50 k=50):

    • 提供更多候选词,增加生成结果的多样性,但可能引入不合理的词语。

3. Beam Search(束搜索)

概念:

  • Beam Search 是一种广泛用于序列生成任务的搜索算法,它在每个时间步保留概率最高的 k k k个部分序列(称为beam),以找到总体概率最高的生成序列。

原理:

  • 步骤:

    1. 初始化:开始时,beam中只包含起始序列(通常是开始标记)。
    2. 扩展:在每个时间步,对beam中的每个部分序列,计算下一个可能的词,得到扩展后的新序列。
    3. 截断 :根据新序列的累积概率,对所有新序列进行排序,保留概率最高的 k k k个序列作为新的beam。
    4. 终止条件:达到最大序列长度或所有序列都生成了终止标记。
  • 优点:

    • 能够在可接受的计算成本下近似地找到全局最优序列。
  • 限制:

    • 可能导致生成的序列缺乏多样性,容易重复。
    • 无法很好地捕捉到全局的多样性,可能会错过概率较高但在早期被剪枝的序列。

改进:

  • 多样性束搜索(Diverse Beam Search):在Beam Search中引入多样性惩罚,鼓励生成不同的序列。

4. Grid Search(网格搜索)

概念:

  • Grid Search是一种用于超参数优化的搜索方法,通过穷举所有可能的参数组合,找到模型性能最优的参数配置。

原理:

  • 步骤:

    1. 定义需要优化的超参数以及它们的可能取值范围。
    2. 构建一个参数组合的网格,涵盖所有可能的参数值组合。
    3. 对于每个参数组合,训练模型并评估其性能(如验证集上的准确率)。
    4. 选择性能最佳的参数组合作为最终配置。

应用:

  • 模型训练阶段:用于寻找最佳的模型超参数,如学习率、正则化系数、网络结构等。

  • 推理阶段:在推理时,Grid Search较少使用,因为推理参数(如Temperature、Top-k)通常需要根据实际需求进行调整,且不会涉及大量的训练。

限制:

  • 计算成本高:当参数数量多、每个参数的取值多时,组合数会爆炸式增长。

替代方法:

  • 随机搜索(Random Search):随机采样参数组合,通常在相同的计算预算下,能获得与Grid Search相当甚至更好的结果。

  • 贝叶斯优化(Bayesian Optimization):通过构建代理模型,智能地选择下一个评估的参数组合,提升搜索效率。


5. 总结与对比

  • Temperature

    • 调整模型输出概率分布的平滑度,控制生成结果的随机性。
    • 适用于需要控制生成多样性和创造性的场景。
  • Top-k采样

    • 限制候选词的数量,防止长尾词的干扰,保证生成质量。
    • 适用于需要在质量和多样性之间取得平衡的场景。
  • Beam Search

    • 通过保留多个候选序列,近似寻找最优序列。
    • 常用于机器翻译、摘要生成等需要高质量、连贯性的序列生成任务。
  • Grid Search

    • 超参数优化方法,通过穷举所有可能的参数组合。
    • 适用于模型训练阶段的参数调优,计算成本较高。

6. 实际应用建议

  • 生成文本的随机性和创造性

    • 调整Temperature:根据需求选择合适的温度值,低温度生成更确定的文本,高温度生成更随机的文本。
  • 控制生成质量

    • 使用Top-k或Top-p(核采样):限制候选词的数量或累积概率,平衡质量和多样性。
  • 高质量序列生成

    • 采用Beam Search:在机器翻译等任务中,使用Beam Search来获得高质量、连贯的输出。
  • 超参数优化

    • Grid Search:在训练模型时,可以使用Grid Search优化超参数,但要注意计算成本。

7. 其他相关参数和方法

  • Top-p采样(核采样)

    • 与Top-k类似,但不是固定候选词数量,而是选择累积概率超过 p p p的词。
  • 温度和Top-k组合使用

    • 可以同时调整Temperature和Top-k,以更精细地控制生成过程。
  • 多样性惩罚

    • 在生成过程中,对重复的词或n-gram进行惩罚,避免生成重复内容。

希望以上内容能帮助您了解模型推理时的参数及其作用。如有其他问题,欢迎继续提问!

问题七:介绍一下IP-Adapter原理

IP-Adapter 原理详解


目录

  1. 概述
  2. 背景
  3. IP-Adapter 的核心原理
    • 模型结构
    • 特征适配与控制
  4. 训练方法
    • 预训练阶段
    • 微调阶段
  5. 应用场景
    • 图像生成与编辑
    • 图像风格迁移
  6. 优势与特点
  7. 相关技术
  8. 总结
  9. 参考资料

1. 概述

IP-Adapter(Image Prompt Adapter)是一种用于增强扩散模型(如 Stable Diffusion)能力的模型结构。它通过引入适配器模块,能够将图像提示(Image Prompt)或其他视觉信息与文本提示相结合,精确控制图像生成过程。IP-Adapter 可以在不大幅增加模型参数的情况下,实现高效的条件图像生成和编辑。


2. 背景

扩散模型在图像生成领域取得了显著的成果,例如通过文本描述生成高质量的图像。然而,纯文本提示有时难以精确控制生成结果的细节,如布局、风格等。为了解决这一问题,研究者们提出了在模型中引入额外的视觉信息,如图像提示,以增强控制能力。IP-Adapter 就是在这一背景下提出的,旨在高效地融合图像和文本信息。


3. IP-Adapter 的核心原理

3.1 模型结构

IP-Adapter 的核心是在预训练的扩散模型中添加轻量级的适配器模块。具体来说,适配器模块被插入到模型的各个层中,用于接收并处理额外的图像提示或控制信号。

  • 适配器模块:通常由一系列的卷积层或全连接层组成,参数量较小。
  • 融合机制:适配器模块的输出与主干网络的特征进行融合,可以采用加法、乘法或注意力机制等方式。
3.2 特征适配与控制

适配器模块负责将输入的图像提示映射为与主干网络特征相匹配的表示。这些表示被融合到模型中,使得生成过程受到图像提示的指导。

  • 图像提示处理:对输入的图像进行编码,提取特征。
  • 特征融合:将图像特征与文本特征、噪声向量等进行融合,影响生成结果。

4. 训练方法

4.1 预训练阶段
  • 冻结主干网络:通常情况下,预训练的扩散模型(如 Stable Diffusion)的参数被冻结。
  • 训练适配器模块:仅训练适配器模块,使其学会如何将图像提示融入到生成过程中。
4.2 微调阶段
  • 数据准备:使用包含图像提示和对应生成目标的配对数据集。
  • 损失函数:通常使用重构损失,如均方误差(MSE),或感知损失(Perceptual Loss),确保生成结果与目标一致。

5. 应用场景

5.1 图像生成与编辑
  • 精确控制生成内容:通过图像提示,可以指定生成图像的布局、结构等细节。
  • 图像编辑:在已有图像的基础上,进行特定的修改,如添加元素、改变风格。
5.2 图像风格迁移
  • 多模态融合:结合图像和文本提示,实现更丰富的风格迁移效果。
  • 定制化生成:根据用户提供的参考图像,生成符合特定风格的图像。

6. 优势与特点

  • 参数高效:适配器模块参数量小,训练成本低。
  • 灵活性强:支持多种类型的图像提示,如草图、分割图、深度图等。
  • 兼容性好:可以与各种预训练的扩散模型结合,提升其控制能力。

7. 相关技术

  • ControlNet:也是一种在预训练扩散模型中引入控制信号的技术,IP-Adapter 与其有相似之处。
  • LoRA(Low-Rank Adaptation):一种通过低秩矩阵分解来高效微调大型模型的方法,可与 IP-Adapter 结合使用。

8. 总结

IP-Adapter 提供了一种高效、灵活的方式,将额外的图像提示融入到扩散模型的生成过程中。通过引入适配器模块,模型可以在不显著增加参数量的情况下,大幅提升对生成结果的控制能力。这对于需要精确控制生成细节的应用场景,具有重要意义。


9. 参考资料

  1. 论文或博客文章
    • 如果 IP-Adapter 有相关的论文发表,建议查阅原始论文以获取更详细的信息。
  2. 开源项目
    • 在 GitHub 等平台搜索 IP-Adapter 的开源实现,查看代码和使用文档。

:由于知识截止日期的限制,以上内容基于截至 2023 年 10 月的公开信息。如果 IP-Adapter 是近期发布的技术,或者详细信息尚未公开,建议参考最新的官方资料或论文以获取准确的信息。

问题八:Stable Diffusion的条件生成原理

Stable Diffusion 的条件生成原理主要基于扩散模型(Diffusion Model)和条件生成机制的结合。在条件生成的过程中,通过将文本、图像或其他信息作为条件输入到扩散模型中,指导生成符合特定要求的图像。下面是其核心原理的详细介绍:

1. 扩散模型概述

Stable Diffusion 基于扩散模型,这类模型的工作原理是逐步加噪音并去噪。其生成过程分为两个阶段:

  • 正向过程(Forward Process): 将数据逐步添加噪声,直到数据接近纯噪声。
  • 反向过程(Reverse Process): 学习如何逐步去除噪声,重构数据。

在图像生成中,扩散模型通过学习将噪声逐步去除的过程,最终生成清晰的图像。这个去噪过程是通过深度神经网络进行建模的。

2. 条件生成的核心思想

条件生成的目标是引导扩散模型根据给定的条件(如文本描述、参考图像)生成符合要求的图像。在 Stable Diffusion 中,条件生成的核心是通过条件输入来调整扩散模型在每个去噪步骤中的生成过程。

常见的条件生成方式有:

  • 文本条件生成: 利用文本作为条件输入,生成与文本描述相符的图像。
  • 图像条件生成: 通过已有图像来引导模型生成与该图像相关的结果(如图像修复、图像编辑)。

Stable Diffusion 通过以下两种主要方式来实现条件生成:

3. 文本条件生成(Text-to-Image Generation)

Stable Diffusion 的文本生成过程使用了 CLIP(Contrastive Language-Image Pre-training)模型,结合扩散模型实现文本到图像的生成。主要步骤如下:

1. 文本编码
  • 文本首先通过 CLIP 模型的文本编码器进行编码,转化为向量嵌入(embedding)。这些嵌入向量表示了文本的语义信息,模型通过这些嵌入了解用户希望生成的图像内容。
2. 扩散模型中的条件注入
  • 在扩散过程中的每一个去噪步骤中,模型将文本嵌入向量作为条件信息加入。具体来说,扩散模型将这类条件输入通过交叉注意力机制注入到 U-Net 网络中,指导模型生成符合条件的图像。

    注意力机制帮助模型在图像生成过程中集中于文本描述的某些关键部分(例如"天空"或"森林"),从而生成与描述相符的图像。

3. 去噪过程中的条件控制
  • 扩散模型通过反向去噪过程,从随机噪声逐步去除噪音,并生成符合输入文本描述的图像。这一过程中的每一步都由条件(文本嵌入)来指导和影响模型的生成结果。

4. 图像条件生成(Image-to-Image Generation)

Stable Diffusion 还支持基于已有图像进行生成(如图像编辑、修复)。其工作原理与文本生成类似,但输入条件是图像或其特征。

1. 条件图像编码
  • 在图像生成任务中,输入的图像首先会通过特定的编码器(如 CLIP 的图像编码器)转换为嵌入向量,或者提取出图像的特征向量,这些特征向量作为条件输入到扩散模型。
2. 去噪引导生成
  • 类似于文本生成,扩散模型会将这些图像条件注入到去噪过程中的每个步骤,指导模型生成与输入图像相关的内容。例如,在图像修复任务中,模型会根据条件图像的局部特征,填补缺失部分或修复图像。

5. 条件生成的优点与应用

Stable Diffusion 的条件生成方法非常灵活,使得它能够处理多种任务,如:

  • 文本到图像生成(Text-to-Image Generation):给定文本描述,生成符合描述的图像。
  • 图像到图像生成(Image-to-Image Generation):从参考图像生成新的图像或对图像进行修复、编辑。
  • 超分辨率生成(Super-Resolution):根据低分辨率图像生成高分辨率版本。

6. 总结

Stable Diffusion 的条件生成过程通过将输入的条件信息(如文本、图像等)与扩散模型结合,利用注意力机制和条件注入在去噪过程中的每个步骤影响生成结果。这一原理使得模型能够根据用户的需求,生成符合预期的图像。

这种方法的优势在于:

  • 生成过程可控,可以根据不同条件生成多样化的结果。
  • 在去噪过程的每个阶段都注入条件信息,生成更加精准的结果。

问题九:说一下什么时候用Stable Diffusion的条件生成,什么时候用IP-Adapter,什么时候用ControlNet。

建议阅读相关论文!!!!

在不同的图像生成任务中,使用 Stable Diffusion 的条件生成IP-Adapter 、或 ControlNet 取决于你所需要的生成精度、灵活性以及条件的复杂性。以下是每种方法的适用场景及它们之间的区别:

1. Stable Diffusion 的条件生成

适用场景

  • 文本到图像生成(Text-to-Image Generation):你有一段文本描述,想要生成与其匹配的图像。例如,输入"a futuristic cityscape with flying cars",生成符合该描述的图像。
  • 简单的条件生成任务:条件输入相对简单,比如基于图像生成一个与输入风格或内容相关的结果,或在已有的噪声基础上生成新的图像。
  • 图像到图像生成(Image-to-Image Generation):你有一张初始图像,并希望生成与该图像内容相关联的其他图像,或者进行风格转换。

使用特点

  • 基础模型 :Stable Diffusion 的条件生成通过 CLIP 等编码器获取文本或图像的条件嵌入,并在去噪过程的每一步指导生成,适用于较为通用的图像生成任务。
  • 灵活性:能够生成高质量的图像,条件越具体,生成结果越符合条件描述。

何时选择

  • 当你主要基于文本描述生成图像。
  • 当生成任务较为简单,如从简单条件生成新图像或风格化图像时。

2. IP-Adapter

适用场景

  • 图像风格适配(Image Style Adaption):你有一张图像,并希望生成与该图像风格类似的新图像。IP-Adapter 可以用来调整生成图像的风格,使其符合输入图像的特定风格特征。
  • 特征精细控制:你需要对生成结果进行更加细腻的风格控制,特别是需要在不同的风格和条件下生成相似内容的场景。

使用特点

  • 图像风格迁移:IP-Adapter 在提供输入图像的情况下,可以对生成图像的风格进行细微调整。
  • 特征注入:IP-Adapter 会对输入图像进行特征提取,并根据这些特征适配生成的图像。适用于需要保留图像特定风格或细节的场景。

何时选择

  • 当你需要对生成的图像进行特定风格的微调,或生成与输入图像风格匹配的图像。
  • 当你需要细致的控制图像内容与风格之间的平衡,尤其在复杂图像条件下。

3. ControlNet

适用场景

  • 精确控制生成结果 :你希望对图像生成过程进行精确引导,例如给定姿态、草图、深度图等条件生成图像。ControlNet 允许你以非常高的精度控制生成过程。
  • 姿态、草图或轮廓生成:你有输入图像的某些先验信息,如人体姿态图、物体的轮廓图、深度图、边缘检测图等,ControlNet 能根据这些输入生成符合先验信息的图像。
  • 需要生成与条件图像一致的精细结果:如通过骨架图生成姿势精准的图像、通过深度图生成符合物体结构的图像,或通过线条草图生成符合形状的成品图像。

使用特点

  • 复杂条件输入:ControlNet 可以处理多种复杂的条件输入,除了文本和图像,还支持姿态、深度图等精确控制。
  • 精细化控制:它将扩散模型的去噪过程与特定条件(如姿态、边缘)进行高度结合,生成结果与输入的先验信息具有高度一致性。

何时选择

  • 当你需要通过**复杂的图像条件(如姿态、轮廓、草图等)**来精确控制生成的图像。
  • 当你希望对生成过程进行非常具体的指导,例如生成与给定骨架、深度图一致的图像。
  • 当任务需要在生成过程中保持特定的结构性和细节时。

结论

  1. Stable Diffusion 的条件生成:适合文本到图像、简单条件生成场景。它广泛用于通用图像生成任务,具有较高的灵活性,但对于复杂的条件(如姿态、草图等)的控制力较弱。

  2. IP-Adapter:适用于图像风格调整或生成任务,需要根据输入图像的风格和特征调整输出的图像。适合需要在生成过程中保持特定风格的场景。

  3. ControlNet:适合复杂条件的精细控制任务,如姿态、草图、深度图等。它能够根据输入的详细条件信息(如轮廓、深度等)生成与输入一致的图像,是精细控制生成结果的最佳选择。

简而言之

  • Stable Diffusion 的条件生成 做文本到图像的生成,适用于一般场景。
  • IP-Adapter 进行风格控制和图像调整。
  • ControlNet 做精确的图像生成,特别是对复杂条件的控制,如姿态或深度图。

创作不易,观众老爷们请留步... 动起可爱的小手,点个赞再走呗 (๑◕ܫ←๑)

src="https://img-blog.csdnimg.cn/20210222185528265.png">
欢迎大家关注笔者,你的关注是我持续更博的最大动力

原创文章,转载告知,盗版必究




♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠

相关推荐
Swift社区2 小时前
LeetCode - #139 单词拆分
算法·leetcode·职场和发展
Kent_J_Truman3 小时前
greater<>() 、less<>()及运算符 < 重载在排序和堆中的使用
算法
IT 青年3 小时前
数据结构 (1)基本概念和术语
数据结构·算法
Dong雨4 小时前
力扣hot100-->栈/单调栈
算法·leetcode·职场和发展
SoraLuna4 小时前
「Mac玩转仓颉内测版24」基础篇4 - 浮点类型详解
开发语言·算法·macos·cangjie
liujjjiyun4 小时前
小R的随机播放顺序
数据结构·c++·算法
周三有雨4 小时前
【面试题系列Vue07】Vuex是什么?使用Vuex的好处有哪些?
前端·vue.js·面试·typescript
¥ 多多¥4 小时前
c++中mystring运算符重载
开发语言·c++·算法
爱米的前端小笔记5 小时前
前端八股自学笔记分享—页面布局(二)
前端·笔记·学习·面试·求职招聘
好学近乎知o5 小时前
解决sql字符串
面试