PyTorch生成式人工智能实战:从零打造创意引擎
PyTorch生成式人工智能实战:从零打造创意引擎
- 0. 前言
- 1. 生成式人工智能
- 1.1 生成式人工智能简介
- 1.2 生成式人工智能技术
- 2. Python 与 PyTorch
- 2.1 Python 编程语言
- 2.2 PyTorch 深度学习库
- 3. 生成对抗网络
- 3.1 生成对抗网络概述
- 3.2 生成对抗网络应用
- 4. Transformer
- 4.1 注意力机制
- 4.2 Transformer 架构
- 4.3 多模态 Transformer 和预训练大语言模型
- 5. 专栏目标
- 小结
0. 前言
生成式人工智能 (Generative AI
, GAI
) 自 ChatGPT
问世以来,引发了广泛关注,并成为了技术领域的焦点。生成式人工智能技术极大的改变了我们日常生活的多个方面,开启了技术的新纪元,并激发了大量研究人员探索各种生成模型所提供的广泛可能性。
例如,Midjourney
已经实现了从简短的文本输入生成高分辨率、逼真图像的技术。类似地,软件公司 Freshworks
通过 ChatGPT
的强大功能,显著加速了应用程序开发,将原本需要 10
周时间的开发周期缩短到仅仅几天。生成式人工智能技术进步的影响远不止于此,如今,生成式人工智能技术能够生成与人类写作相媲美的文章,创作出类似经典音乐作品的乐曲,快速生成复杂的文本文件,这些任务通常需要大量的人工精力和时间。
本专栏深入探讨了生成式人工智能,这项技术通过其高效和快速的内容创作能力,正在重塑众多行业。具体来说,将学习如何使用生成式模型来创建各种形式的内容:数字、图像、文本和音频。此外,还将学习从零开始构建这些模型,以便深入理解生成式 AI
的内部工作原理,我们将使用 Python
和 PyTorch
来构建、训练和使用这些模型。
1. 生成式人工智能
本节解释了什么是生成式人工智能 (Generative AI
, GAI
),以及它与非生成式人工智能(判别模型)的不同之处。GAI
具有创造多种形式新内容的非凡能力,包括文本、图像、音频、视频、代码以及复杂的模式。GAI
能够创造出新颖的内容世界,ChatGPT
是一个典型例子。与此相对,判别模型主要关注识别和分类已存在的内容。
1.1 生成式人工智能简介
生成式人工智能是一种通过学习现有数据的模式来创建新内容的人工智能类型,如文本、图像或音乐。与判别模型不同,后者专注于识别不同数据实例之间的差异,并学习不同类别之间的边界。下图展示了这两种建模方法之间的区别。例如,当面对一组包含狗和猫的图像时,判别模型通过捕捉一些关键特征(例如,猫有小鼻子和尖耳朵)来判断每张图片是狗还是猫。判别模型将数据作为输入,并输出不同标签的概率,这些概率分别表示为 Prob(dog)
和 Prob(cat)
。然后,可以根据最高的预测概率来标记输入数据。
相比之下,生成模型具有能够生成全新数据实例的独特能力。在关于狗与猫示的例中,生成模型通过深入理解这些图像的定义特征,来合成表示狗和猫的新图像。生成模型将任务描述(例如在潜空间中变化的值,这些变化会导致生成不同特征的图像)作为输入,产生新的狗和猫图像。
从统计学的角度来看,当给定具有特征X的数据实例和相应标签 Y
时,判别模型的任务是预测条件概率 prob(Y|X)
。相反,生成模型试图学习输入特征 X
和目标变量 Y
的联合概率分布 prob(X, Y)
,然后从该分布中采样,生成新的 X
实例。
1.2 生成式人工智能技术
根据想要创建的内容的具体形式,生成模型有不同的类型。在本专栏中,主要聚焦于两种典型技术:生成对抗网络 (Generative Adversarial Network
, GAN
) 和 Transformer
,但也会涵盖变分自编码器、能量模型和扩散模型等。GAN
中的“对抗”一词指的是两个神经网络在零和博弈框架下相互竞争:生成网络试图创建无法与真实样本区分的数据实例,而判别网络则试图识别生成样本与真实样本的区别。两个网络之间的竞争推动了双方的共同改进,最终使得生成网络能够创造出高度逼真的数据。Transformer
是深度神经网络,能够高效地解决序列到序列的预测任务。
GAN
因其易于实现和多功能性而广受欢迎,这些多功能的模型能够创造出各种各样的内容,从几何形状和复杂图案,再到高质量的彩色图像,如人脸图像,此外,GAN
还具备转换图像内容的能力,可以无缝地将一张拥有金发的人脸图像变为黑发人脸图像。GAN
还能够将其创作能力扩展到音乐生成领域,创作出逼真的音乐作品。
与几何形状、数字或图像生成不同,文本生成面临着巨大的挑战,主要是因为文本信息的顺序性特征,其中单个字符和单词的的顺序和排列具有重要意义。为了解决这种复杂性,我们引入了 Transformer
,一种旨在高效地解决序列到序列的预测任务的深度神经网络。与循环神经网络或卷积神经网络不同,Transformer
在捕捉输入和输出序列中复杂的长程依赖关系方面表现卓越。需要注意的是,Transformer
具备并行训练能力(能够在多个设备上同时进行训练),显著缩短了训练时间,使我们能够在海量数据上训练 Transformer
模型。
Transformer
架构是大语言模型( Large language model
, LLM
,指具有大量参数并在大规模数据集上训练的深度神经网络)的基础,包括 ChatGPT
、BERT
、DALL-E
和 T5
等。Transformer
架构为 AI
领域的飞跃性进展奠定了基础,并推动了 ChatGPT
以及其他生成式预训练 Transformer
(Generative Pretrained Transformer
, GPT
) 模型的出现。
2. Python 与 PyTorch
2.1 Python 编程语言
自 2018
年以来,Python
已成为广泛应用的编程语言。Python
不仅允许用户创建和修改库,而且拥有一个庞大的生态系统,因此可以轻松获取资源。而且可以导入现成的库,避免重新发明轮子,同时也能将自己的代码与 Python
社区共享。
Python
是一个跨平台语言,无论使用的是 Windows
、Mac
还是 Linux
,虽然根据操作系统的不同,安装软件和库的过程可能会有所不同,但 Python
代码在不同系统上的表现是一样的。
Python
是一种富有表现力的语言,适用于通用应用开发,语法易于掌握,能够轻松理解和使用。Python
提供了大量的库,使得相较于其他语言(如 C++
或 R
),创建生成模型更加容易。
2.2 PyTorch 深度学习库
在 Python
中,最受欢迎的 AI
框架是 PyTorch
和 TensorFlow
。在本专栏中,我们选择 PyTorch
而非 TensorFlow
,主要是因为它更易于使用。
PyTorch
是由 Meta
的 AI
研究实验室开发的开源机器学习库。它建立在 Python
编程语言和 Torch
库之上,旨在为创建和训练深度学习模型提供一个灵活且直观的平台,PyTorch
的设计目标是满足研究人员和开发人员的需求,提供一个更加用户友好且可扩展的深度学习框架。
计算图是深度学习中的一个基础概念,它在高效计算复杂数学运算方面起着关键作用,尤其是涉及多维数组或张量的运算。计算图是一个有向图,其中节点表示数学操作,边表示这些操作之间流动的数据。计算图的一个关键用途是在实现反向传播和梯度下降算法时计算偏导数。图结构使得在训练过程中更新模型参数时,能够高效地计算所需的梯度。PyTorch
会实时创建和修改计算图,即所谓的动态计算图。这使得 PyTorch
能够更好地适应不同的模型架构,并简化调试过程。PyTorch
通过 GPU
加速计算,显著减少了相较于 CPU
训练所需的时间。
PyTorch
的设计与 Python
编程语言非常契合。其语法简洁易懂,使得初学者和经验丰富的开发人员都能轻松上手。得益于其动态计算图和简洁的接口,使得快速实验新想法成为可能。这种灵活性在生成式 AI
等快速发展的领域尤为重要。PyTorch
还拥有一个迅速发展的社区,形成了一个丰富的生态系统,包括库、工具和资源,供开发者使用。PyTorch
与其他 Python
库(如 NumPy
和 Matplotlib
)兼容。这种互操作性使得用户能够无缝地将 PyTorch
集成到现有的工作流中,从而提高生产力。
由于深度学习中模型的训练需要大量时间,因此通常使用 GPU
加速计算,在安装 PyTorch
之前需要根据选用的 PyTorch 版本和显卡安装 CUDA
和 cudnn
,关于 CUDA
和 cudnn
的安装和配置可以参考官方文档,建议在安装之前根据自己的操作系统认真查看官方的安装文档,可以避免踩不必要的坑。如果计算机中含有 NVIDIA
显卡作为硬件组件,建议安装 CUDA
驱动程序,该驱动程序可将深度学习训练速度提高几个数量级。
然后,在 PyTorch 官方网页,根据自己实际的环境,进行相应的选择,在 Run this Command
栏中将给出安装 PyTorch
的命令:
在此,我们以 Linux
、pip
、Python
和 CUDA10.2
为例,复制并在终端执行安装命令:
pip3 install torch torchvision torchaudio
为了确认 PyTorch
已正确安装,可以在 Python shell
中运行以下代码:
>>> import torch
>>> test = torch.empty(2,2)
>>> print(test)
tensor([[2.9685e-26, 4.5722e-41],[2.9685e-26, 4.5722e-41]])
如果能够正确调用 PyTorch
相关函数,表明 PyTorch
已正确安装。需要注意的是,以上代码中,使用 torch.emty()
中创建了一个尺寸为 2 x 2
的张量,它是一个空矩阵,这里的“空”并不意味着所有元素的值都为 Null
,而是使用一些被认为是占位符的无意义浮点数,需要在之后进行赋值,这与 NumPy
中的空数组类似。
3. 生成对抗网络
本节首先介绍生成对抗网络 (Generative Adversarial Network
, GAN
) 工作原理。然后,使用动漫面部图像生成作为示例,展示 GAN
的内部工作原理。最后,讨论 GAN
的实际应用。
3.1 生成对抗网络概述
生成对抗网络 (Generative Adversarial Network
, GAN
) 是一类生成模型,因为 GAN
易于构建和训练,且能够生成各种各样的内容而变得及其流行。GAN
的核心是双网络架构,包含一个生成器和一个判别器。生成器负责捕捉数据的潜分布以生成内容,而判别器则用于估计给定样本是来自真实训练数据集(视为“真实”)或来自生成器所生成的伪造样本(视为“虚假”)。模型的主要目标是生成与训练数据集中的实例相似的新数据,GANs生成的数据特性取决于训练数据集的构成。例如,如果训练数据由灰度图像的服装组成,则生成的图像将与这些服装高度相似,而如果训练数据集包含的是人脸的彩色图像,那么生成的图像也将类似于人脸。
GAN
的架构及其组件如下图所示。为了训练模型,训练数据集中的真实样本和由生成器生成的虚假样本一起提供给判别器。生成器的主要目标是创建与训练数据集中实例几乎无法区分的数据实例。相反,判别器则致力于区分由生成器生成的虚假样本与真实样本。这两个网络通过竞争过程不断进行博弈,试图通过迭代超越对方。
GAN
模型的训练需要通过多个迭代。在每次迭代中,生成器首先接收某种形式的任务描述,并利用该任务描述生成伪造图像;将这些伪造图像与来自训练集的真实图像一起提供给判别器,判别器尝试将每个样本分类为真实或虚假。接着,判别器将分类结果与实际标签(真实标签)进行比较,生成器和判别器根据分类结果获得反馈,并通过反馈改进各自的能力:判别器通过不断调整来提高识别虚假样本的能力,而生成器则学习如何生成更具迷惑性的样本以骗过判别器。随着训练的进行,两个网络最终达到一个平衡点,这时两个网络都无法进一步改进,此时生成器能够生成与真实样本几乎无法区分的数据样本。
3.2 生成对抗网络应用
GAN
易于实现且用途广泛,可以用于生成几何形状、复杂图案、高分辨率图像,以及逼真的音乐。GAN
的实际应用不仅限于生成逼真的数据,还可以将一个图像域中的属性转化为另一个图像域,例如,训练 CycleGAN
模型,将人脸图像中的金发转变为黑发,或反之将黑发转为金发。
GAN
同样具有广泛的实用场景。假设,一个服装店,在生产之前允许用户进行定制,网站展示了大量独特的设计供客户选择,但问题是:只会在有人下单后才开始制作这些衣服。而制作这些衣服的高质量图像较为昂贵,因为必须先生产出衣服,然后再拍摄照片。而使用 GAN
将极大的简化此过程,无需拥有大量生产出来的服装和照片,可以使用 CycleGAN
将一组图像中的特征转化为另一组图像,从而创造出全新的风格。这只是使用 GAN
的一个简单示例,利用 GAN
模型的多功能性能够创建无穷的可能性。
4. Transformer
Transformer
是一种擅长处理序列到序列预测问题的深度神经网络,例如接受输入句子并预测最可能的下一个词汇。本节将介绍 Transformer
的关键创新点:自注意力机制。然后我们将讨论 Transformer
架构和不同类型的 Transformer
。最后,我们将讨论 Transformer
的一些最新进展,例如多模态模型(输入不仅包括文本,还包括音频和图像等其他数据类型)和预训练大语言模型(基于大规模文本数据进行训练的模型,能够执行各种下游任务)。
在 Transformer
架构提出之前,自然语言处理 (Natural Language Processing
, NLP
) 和其他序列到序列的预测任务主要是通过循环神经网络 (Recurrent Neural Network
, RNN
) 进行处理。然而,RNN
在保留序列中早期元素的信息方面存在困难,这限制了它们捕捉长期依赖关系的能力。即使是能够处理更长依赖关系的高级 RNN
变体,如长短期记忆网络 (Long Short-Term Memory Network
, LSTM
),在面对极长的依赖关系时依然表现不佳。
更重要的是,RNN
(包括 LSTM
等变体)是按顺序处理输入的,这意味着这些模型一次只能处理一个元素,按顺序处理,而不是同时查看整个序列。RNN
沿着输入和输出序列的顺序进行计算,导致其无法进行并行训练,使得训练过程变得缓慢。因此,也导致其无法在大规模的数据集上进行训练。
Transformer
的关键创新是自注意力机制,自注意力机制非常擅长捕捉序列中的长期依赖关系。此外,由于输入在模型中不是按顺序处理的,Transformer
可以进行并行训练,从而大大缩短训练时间。更重要的是,并行训练使得模型在大型数据集上训练成为可能,这使得大语言模型 (Large language model
, LLM
) 更智能且学习能力更强,能够用于处理和生成文本,理解上下文并执行各种语言任务。这促成了 ChatGPT
等 LLM
的崛起,并推动了 AI
应用的热潮。
4.1 注意力机制
注意力机制为序列中每个元素与所有其他元素(包括其自身)之间的关系分配权重。权重越高,两个元素之间的关系就越紧密,这些权重在训练过程中从大量的训练数据中学习得到。因此, 如 ChatGPT
,DeepSeek
等训练好的 LLM
能够理解句子中任意两个词之间的关系,从而理解自然语言。
那么注意力机制是如何为序列中的元素分配权重,以捕捉长期依赖关系的?注意力权重是通过首先将输入通过三个神经网络层,得到查询 Q
(Query
)、键 K
(Key
) 和值 V
(Value
) 来计算的。使用查询、键和值来计算注意力的方法来源于检索系统。例如,在图书馆搜索一本书,可以在图书馆的搜索引擎中输入“PyTorch 生成式人工智能
”之类的关键词。在这种情况下,查询 Q
就是“PyTorch 生成式人工智能
”,键 K
则是书名、书籍描述等内容。图书馆的检索系统会根据查询和键之间的相似性推荐一系列书籍(值 V
)。自然地,书名或描述中包含“PyTorch
”或“生成式人工智能
”或同时包含两者的书籍会排在前面,而那些标题或描述中没有这些关键词的书籍则会排在列表底部,因为这些书籍会被分配较低的匹配分数。
4.2 Transformer 架构
Transformer
最初是为了构建机器语言翻译模型,例如,英语翻译为法语。下图展示了 Transformer
架构。左侧是编码器 (Encoder
),右侧是解码器 (Decoder
)。
Transformer
中的编码器“学习”输入序列的含义(例如,英语短语“How are you?
”),并将其转换为代表这一含义的向量,再将这些向量传递给解码器。解码器基于序列中先前的单词和编码器的输出,逐个预测下一单词,从而构建输出(例如,英语短语的法语翻译)。训练好的模型能够将常见的英语短语翻译为法语。
Transformer
有三种类型:仅编码器 Transformer
、仅解码器 Transformer
和编码器-解码器 Transformer
。仅编码器 Transformer
没有解码器,能够将一个序列转换为一个抽象表示,供下游任务使用,如情感分析、命名实体识别和文本生成。例如,BERT
就是一个仅编码器的 Transformer
。仅解码器 Transformer
没有编码器,只有解码器,适用于文本生成、语言建模和创意写作。例如,GPT-2
和 ChatGPT
都是仅解码器 Transformer
。
编码器-解码器 Transformer
适用于处理复杂任务,如多模态模型,能够处理文本到图像生成或语音识别等任务。编码器-解码器 Transformer
结合了编码器和解码器的优点。编码器擅长处理和理解输入数据,而解码器则擅长生成输出。这个结合使得模型能够有效理解复杂的输入(如文本或语音)并生成复杂的输出(如图像或转录文本)。
4.3 多模态 Transformer 和预训练大语言模型
多模态模型模型不仅可以处理文本,还能够处理其他类型的数据,如音频和图像。例如,文本到图像 Transformer
,包括 DALL-E 2
、Imagen
和 Stable Diffusion
都是文本到图像的模型,能够根据文本提示生成高分辨率图像。文本到图像 Transformer
融入了扩散模型的原理,扩散模型涉及一系列的变换,逐渐增加数据的复杂性。因此,在讨论文本到图像 Transformer
之前,首先需要理解扩散模型。
假设通过使用基于扩散的模型生成高分辨率的花卉图像。首先需要一个高质量的花卉图像训练集。然后,模型逐步向这些花卉图像添加噪声(即所谓的扩散过程),直到它们变成完全的随机噪声。接着,训练模型逐步去除这些噪声,从而生成新的数据样本。扩散过程如下图所示。左列包含原始的花卉图像,向右移动的过程中,每一步都向图像中添加噪声,直到最右列时,图像完全变成随机噪声。
文本到图像 Transformer
以文本提示作为输入,生成与该文本描述相对应的图像。文本提示作为一种条件输入,模型通过一系列神经网络层将文本描述转化为图像。与扩散模型类似,文本到图像 Transformer
采用分层架构,每一层逐步为生成的图像添加更多细节。扩散模型和文本到图像 Transformer
的核心概念——逐步细化输出——在两者之间是相似的。扩散模型因其能够提供稳定的训练并生成高质量的图像,已变得越来越流行,并且在生成效果上超过了其他生成模型,如 GAN
和变分自编码器。
5. 专栏目标
本专栏的目标是学习如何从零开始构建和训练生成模型。通过这种方式,对这些模型的内部工作机制有一个全面的了解,从而能够更好地利用它们,从零开始创建深度学习模型是理解这些模型的最佳方式。从这个角度来看,本专栏并不将生成式人工智能模型当作黑盒模型,而是深入详细地介绍这些模型的内部工作原理。目标是我们对生成模型有更深刻的理解,构建更好的生成式人工智能,总体而言:
- 系统进阶:内容层层递进,从
GAN
生成手写数字起步,直至构建Transformer
翻译模型、扩散模型生成花卉图像,手把手打通生成式人工智能全链路 - 前沿实战:解锁
CycleGAN
实现图像跨域转换、用500
万参数GPT
复刻海明威文风、打造AI
助手等硬核项目,代码即战力 - 多模态创意:横跨图像、文本、音乐三大领域,揭秘
MuseGAN
作曲、DALL-E
底层技术,成为跨界内容创作者 - 使用技巧:涵盖
PyTorch
核心API
、Hugging Face
模型调优、扩散模型采样策略,无缝衔接开源生态
小结
生成式人工智能是一种具备生成多种新内容形式(如文本、图像、代码、音乐、音频和视频)的技术,判别模型专注于分配标签,而生成模型则生成新的数据实例。PyTorch
凭借其动态计算图和支持 GPU
训练的能力,非常适合用于深度学习和生成建模。《PyTorch生成式人工智能实战》从神经网络基础到 Stable Diffusion
实战,从零开始实现工业级项目,让创造力突破想象边界,用代码点燃生成式人工智能的无限可能!
相关文章:
PyTorch生成式人工智能实战:从零打造创意引擎
PyTorch生成式人工智能实战:从零打造创意引擎 0. 前言1. 生成式人工智能1.1 生成式人工智能简介1.2 生成式人工智能技术 2. Python 与 PyTorch2.1 Python 编程语言2.2 PyTorch 深度学习库 3. 生成对抗网络3.1 生成对抗网络概述3.2 生成对抗网络应用 4. Transformer4…...
蓝桥杯高频考点——二分(含C++源码)
二分 基本框架整数查找(序列二分的模版题 建议先做)满分代码及思路solution 子串简写满分代码及思路solution 1(暴力 模拟双指针70分)solution 2(二分 AC) 管道满分代码及思路样例解释与思路分析solution 最…...
VUE3项目VITE打包优化
VUE3项目VITE打包优化 代码加密依赖配置效果对比图 自动导入依赖配置 代码压缩依赖配置效果对比图 图片压缩依赖配置效果对比图 字体压缩总结与实践运用效果 代码加密 依赖 npm install -D vite-plugin-bundle-obfuscator配置 import vitePluginBundleObfuscator from "…...
IP 分片重组与 TCP 会话重组
1. IP 分片重组(IP Fragmentation & Reassembly) (1)分片原因 当 IP 数据包长度超过 MTU(Maximum Transmission Unit)(如以太网默认 1500 字节)时,路由器或发送端会…...
《Python实战进阶》No34:卷积神经网络(CNN)图像分类实战
第34集:卷积神经网络(CNN)图像分类实战 摘要 卷积神经网络(CNN)是计算机视觉领域的核心技术,特别擅长处理图像分类任务。本集将深入讲解 CNN 的核心组件(卷积层、池化层、全连接层)…...
【Django】教程-1-安装+创建项目+目录结构介绍
欢迎关注我!后续会更新django教程。一周2-3更,欢迎跟进,本周会更新第一个Demo的单独一个模块的增删改查【Django】教程-4-一个增删改查的Demo【Django】教程-2-前端-目录结构介绍【Django】教程-3-数据库相关介绍 1.项目创建 1.1 安装 Djan…...
力扣DAY29 | 热100 | 删除链表的倒数第N个结点
前言 中等 √ 链表心得:考虑好边界情况。 题目 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。 示例 1: 输入:head [1,2,3,4,5], n 2 输出:[1,2,3,5]示例 2: 输入&#…...
渗透测试过-关于学习Token、JWT、Cookie等验证授权方式的总结
关于学习Token、JWT、Cookie等验证授权方式的总结 目录 一、为什么Cookie无法防止CSRF攻击,而Token可以? 二、为什么无论采用Cookie-session的方式,还是Token(JWT)的方式,在一个浏览器里,同一个…...
C#从入门到精通(3)
目录 第九章 窗体 (1)From窗体 (2)MDI窗体 (3)继承窗体 第十章 控件 (1)控件常用操作 (2)Label控件 (3)Button控件 &…...
greenhill编译出现:3201原因错误
ecom800: 21Mar25 16:26:45.609351: No licenses available for ecom800 Reason: ecom800 (3201): The License Manager cannot be contacted. 解决方式:重新加载lincese驱动。 检查是否安装正确: 检查驱动是否正确识别: 以上检查都正常,…...
Docker 快速入门指南
Docker 快速入门指南 1. Docker 常用指令 Docker 是一个轻量级的容器化平台,可以帮助开发者快速构建、测试和部署应用程序。以下是一些常用的 Docker 命令。 1.1 镜像管理 # 搜索镜像 docker search <image_name># 拉取镜像 docker pull <image_name>…...
RISC-V AIA学习2---IMSIC
我在学习文档这章时,对技术术语不太理解,所以用比较恰当的比喻来让自己更好的理解。 比较通俗的理解: 将 RISC-V 系统比作一个工厂: hart → 工厂的一条独立生产线IMSIC → 每条生产线配备的「订单接收员」MSI 中断 → 客户通过…...
C#基础学习(五)函数中的ref和out
1. 引言:为什么需要ref和out? 问题背景:函数参数默认按值传递,值类型在函数内修改不影响外部变量;引用类型重新赋值时外部对象不变。核心作用:允许函数内部修改外部变量的值,实现“双向传参…...
【每日算法】Day 9-1:贪心算法精讲——区间调度与最优选择(C++实现)
掌握高效决策的核心思想!今日深入解析贪心算法的底层逻辑,聚焦区间调度与最优选择两大高频场景,结合大厂真题与严谨证明,彻底掌握“局部最优即全局最优”的算法哲学。 一、贪心算法核心思想 贪心算法(Greedy Algorit…...
Netty源码—8.编解码原理二
大纲 1.读数据入口 2.拆包原理 3.ByteToMessageDecoder解码步骤 4.解码器抽象的解码过程总结 5.Netty里常见的开箱即用的解码器 6.writeAndFlush()方法的大体步骤 7.MessageToByteEncoder的编码步骤 8.unsafe.write()写队列 9.unsafe.flush()刷新写队列 10.如何把对象…...
【踩坑系列】使用httpclient调用第三方接口返回javax.net.ssl.SSLHandshakeException异常
1. 踩坑经历 最近做了个需求,需要调用第三方接口获取数据,在联调时一直失败,代码抛出javax.net.ssl.SSLHandshakeException异常, 具体错误信息如下所示: javax.net.ssl.SSLHandshakeException: sun.security.validat…...
双目云台摄像头全方位监控方案
双目云台摄像头是一种具有两个镜头的摄像头设备,通常配备云台功能,能够实现水平和垂直方向的旋转,从而提供全方位的监控视角: 一、工作原理与特点 工作原理 :双目云台摄像头利用仿生学原理,通过两个标定后的…...
测谎仪策略思路
来源:【东吴金工 金工专题】“高频价量相关性拥抱CTA”系列研究(四):CPV因子期货版3.0—CPV测谎机 原创 高子剑 量化邻距离 2024年09月20日 14:37 该报告主要介绍了“高频价量相关性拥抱CTA”系列研究中CPV因子期货版的相关内容,…...
2025年移动端开发性能优化实践与趋势分析
启动速度优化 本质:缩短首次可见帧渲染时间。 方法: iOS:利用Core ML本地模型轻量化部署,减少云端等待。Android:强制启用SplashScreen API,通过setKeepOnScreenCondition控制动画时长。冷启动需将耗时操…...
VScode-i18n-ally-Vue
参考这篇文章,做Vue项目的国际化配置,本篇文章主要解释,下载了i18n之后,该如何对Vscode进行配置 https://juejin.cn/post/7271964525998309428 i18n Ally全局配置项 Vscode中安装i18n Ally插件,并设置其配置项&#…...
vue vue3 走马灯Carousel
背景: 在项目中需要展示多张图片,但在页面上只有一张图片的有限位置,此时考虑使用轮播图实现多张图片的展示。element组件官网有走马灯Carousel的组件详细介绍。 实现效果: 官网链接:点击跳转 核心代码: …...
Android设计模式之Builder模式
一、定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 二、核心思想: 分离构造与表示:将对象的构建过程(如参数组合、校验逻辑)与对象本身分离。 链式调用:通…...
【时时三省】(C语言基础)关系运算符和关系表达式
山不在高,有仙则名。水不在深,有龙则灵。 ----CSDN 时时三省 在if语句中对关系表达式disc > 0进行判断。其中的“>”是一个比较符,用来对两个数值进行比较。在C语言中,比较符(或称比较运算符)称为关…...
运算放大器(二)运算放大器的选型与应用
1.运算放大器的工艺决定Vos和Ib 2.TI放大器的命名规律 3.TI精密放大器家族 4.精密运放的选型指南 5.高共模抑制比放大器 6.TI其他的精密放大器 7.选型时需考虑的问题 8.TI精密运放选型实例 先确定供电电压 9.确定放大器的步骤 参考: 注:本文出自对b…...
vulhub靶场jangow-01-1.0.1
启动靶机时点shift停在这个界面 点e进入编辑页面,把ro改成rw signie init/bin/bash Ctrlx保存,ip a查看网卡信息 vim /etc/network/interfaces 把enp0s17改为ens33,保存退出 重启靶机,nmap扫ip ip为192.168.93.179 nmap扫端口 扫…...
android 一步完成 aab 安装到手机
家人们谁懂!在 Android 系统安装 aab 应用超麻烦。满心期待快速体验,却发现 aab 无法直装,得先转为 apks 格式,这过程复杂易错。好不容易转好,还得安装 apks,一番折腾,时间与耐心全耗尽。别愁&a…...
mysqlworkbench导入.sql文件
1、MySQL Workbench 新建数据库 或者 在左侧导航栏的 Schemas 区域右键选择 Create Schema...输入数据库名称(例如 mydatabase),点击 Apply确认创建,点击 Finish 2、选择目标数据库 在左侧导航栏的 Schemas 列表中&a…...
pyqt 信号与槽
PySide6 信号与槽机制详解 引言 PySide6 是 Qt for Python 的官方绑定库,为 Python 提供了强大的 GUI 开发能力。其中,信号与槽(Signals and Slots) 机制是 Qt 事件处理系统的核心,它允许对象之间进行松耦合的通信&a…...
深入探索C++:从基础到实践
目录 引言 一、C 基础语法与特性 (一)命名空间(Namespace) 单独使用 嵌套使用 调用形式 (二)输入输出流(I/O Streams) (三)变量作用域 二、C 的…...
从零开始完成冒泡排序(0基础)——C语言版
文章目录 前言一、冒泡排序的基本思想二、冒泡排序的执行过程(一)第一轮排序(二)第二轮排序(三)第三轮排序(四)第四轮排序 三、冒泡排序的代码实现(C语言)&am…...
Echars插入的柱状图条形图,鼠标放在图上显示坐标值
只需要将axiosPointer改为cross axisPointer.type支持类型及作用: line:默认直线型指向线shadow:显示坐标轴方向的阴影区域cross:交叉线(横向纵向双线)none:不显示指向器inside:结合…...
机械臂如何稳稳上桌?Mujoco场景修改实操
视频讲解: 机械臂如何稳稳上桌?Mujoco场景修改实操 前面《常见机械臂模型不用找!Mujoco这儿都有!》中介绍的mujoco-menagerie中机械臂大多都是base_link放在地上的,这些场景往往和真实的场景对应不上,比如机…...
金融级密码管理器——抗内存扫描的密钥保险箱
目录 金融级密码管理器 —— 抗内存扫描的密钥保险箱一、模块概述与设计背景二、技术原理与设计目标2.1 关键安全原理2.2 设计目标三、系统架构设计3.1 系统架构图(Mermaid示意图)四、关键技术与安全策略4.1 密钥分割与加密存储4.2 动态内存随机化技术4.3 内存扫描检测与自动…...
如何查看 SQL Server 的兼容性级别
在 SQL Server 中,兼容性级别是一个非常重要的设置,它决定了数据库在特定版本的 SQL Server 中运行时所使用的行为和功能。不同版本的 SQL Server 可能会在 SQL 查询优化、索引、语法、错误处理等方面有差异,因此,设置正确的兼容性…...
AI for CFD入门指南(传承版)
AI for CFD入门指南 前言适用对象核心目标基础准备传承机制 AI for CFDLibtorch的介绍与使用方法PytorchAutogluon MakefileVscodeOpenFOAMParaviewGambit 前言 适用对象 新加入课题组的硕士/博士研究生对AICFD交叉领域感兴趣的本科生实习生需要快速上手组内研究工具的合作研…...
人工智能与网络安全
目录 1、人工智能的安全和安全的人工智能各有什么含义,如何解决 2、当人工智能技术应用于某一安全领域,会对该领域的攻守双方带来哪些机遇与挑战 3、ChatGPT原理 、ChatGPT的缺陷 ChatGPT的缺陷 4、人工智能与算力,风险挑战 应对 5、人…...
GPIO输出实验,控制LED灯
1.实验工具:FSMP1A开发板 核心板: 拓展板: 2.实验要求:编写汇编程序,实现三盏灯流水 程序代码: .text .global _start _start: 将RCC_MP_AHB4ENSET寄存器第4位设置为1,使能GPIO外设时钟 …...
小区团购管理设计与实现(代码+数据库+LW)
摘 要 传统办法管理信息首先需要花费的时间比较多,其次数据出错率比较高,而且对错误的数据进行更改也比较困难,最后,检索数据费事费力。因此,在计算机上安装小区团购管理软件来发挥其高效地信息处理的作用࿰…...
How to use pgbench to test performance for PostgreSQL?
pgbench 是一个用于测试 PostgreSQL 数据库性能的基准测试工具。通过模拟多个客户端并发执行 SQL 查询,它可以帮助你评估数据库的性能。以下是使用 pgbench 的基本步骤: 安装 pgbench pgbench 是 PostgreSQL 的一部分,因此在安装 PostgreSQ…...
dbeaver连接mongodb 插入日期变成了字符串
dbeaver插入mongodb数据 日期默认使用ISODate处理,但是插入数据以后实际上是ISODate(2025-03-03T03:25:19.640Z)字符串 INSERT INTO xxx.aaa (_id, chatId, buddyId, pId, lastChatId, inspiration, createTime, modelType, version, selectedInspiration, _class)…...
wgcloud怎么实现服务器或者主机的远程关机、重启操作吗
可以,WGCLOUD的指令下发模块可以实现远程关机和重启 使用指令下发模块,重启主机,远程关机,重启agent程序- WGCLOUD...
PrimeTime生成.lib竟暗藏PG添加Bug
在primeTime里生成lib,如何能带上相关的pg信息? 这是一位群友的发问,就这个问题总结了下可能的原因和解决步骤: 概念 PrimeTime是Synopsys的静态时序分析工具,通常用于在设计的各个阶段进行时序验证。 1)…...
电话号码的字母组合组合总和II 回溯注意事项(Java)
电话号码的字母组合 思路:多个循环可以考虑回溯。 首先明确: 循环的宽度是多少,即从哪些区间取数(本题目中每个数字都是3个字母,都是从三个字母中取一个数,所以可以确定循环宽度就是每个数字对应的字符串…...
【软件工程】填空题
真题 2024-10 16.数据字典是用来定义_____中各个成分的具体含义的。 17.模块设计的基本原则是_____。 18.接口是操作的一个集合,其中每个操作描述了类、构件或子系统的一个_____。 19.耦合是指不同模块之间_____的度量。 20.RUP的突出特点是,它是一种以用况为驱动的、…...
回归——数学公式推导全过程
文章目录 一、案例引入 二、如何求出正确参数 1. 最速下降法 1)多项式回归 2)多重回归 2. 随机梯度下降法 一、案例引入 以Web广告和点击量的关系为例来学习回归,假设投入的广告费和点击量呈现下图对应关系。 思考:如果花了…...
线程池详解:在SpringBoot中的最佳实践
线程池详解:在SpringBoot中的最佳实践 引言 在Java并发编程中,线程池是一种非常重要的资源管理工具,它允许我们在应用程序中有效地管理和重用线程,从而提高性能并降低资源消耗。特别是在SpringBoot等企业级应用中,正…...
.NET开源的智能体相关项目推荐
一、AntSK 由AIDotNet团队开发的人工智能知识库与智能体框架,支持多模型集成和离线部署能力。 核心能力: • 支持OpenAI、Azure OpenAI、星火、阿里灵积等主流大模型,以及20余种国产数据库(如达梦) • 内置语义内核&a…...
spring-security原理与应用系列:ignoredRequests
目录 WebSecurityConfig 何时调用 configure(WebSecurity) AbstractConfiguredSecurityBuilder 如何赋值ignoredRequests 紧接上一篇文章,这一篇我们来看看核心过滤器FilterChainProxy的构造参数对象ignoredRequests是如何被赋值的? 点击WebSecurity…...
(windows)conda虚拟环境下open-webui安装与启动
一、创建conda环境 重点强调下,如果用python pip安装,一定要选择python3.11系列版本,我选的3.11.9。 如果你的版本不是这个系列,将会出现一些未知的问题。 conda create -n open-webui python3.11 -y如下就创建好了 二、安装o…...
CentOS系统下安装tesseract-ocr5.x版本
CentOS系统下安装tesseract-ocr5.x版本 安装依赖包: yum update -y yum install autoconf automake libtool libjpeg-devel libpng-devel libtiff-devel zlib-devel yum install automake libtool bzip2 -y手动编译安装GCC(因系统默认安装的GCC版本比较…...