【计算机视觉中的 GAN 】 - 生成学习简介(1)

一、说明

        在阅读本文之前,强烈建议先阅读预备知识,否则缺乏必要的推理基础。本文是相同理论GAN原理的具体化范例,阅读后有两个好处:1 巩固了已经建立的GAN基本概念 2 对具体应用的过程和套路进行常识学习,这种练习题一般的项目,是需要反复几个才能成为行家。好了,我们出发吧!

预备知识:

计算机视觉中的 GAN - 生成学习简介 |人工智能之夏 (theaisummer.com)

【深度学习】生成对抗网络Generative Adversarial Nets_无水先生的博客-CSDN博客

二、GAN概念概述

        什么是生成式学习?什么是 GAN?我们为什么要使用它?与自动编码器有什么区别?GAN模型的基本训练算法是什么?我们如何让它学习有意义的表示?它在什么计算机视觉应用中有用?如何为她/他的问题设计一个?

        我们将解决所有这些问题以及很多问题!在本评论系列文章中,我们将重点介绍用于计算机视觉应用的大量 GAN。具体来说,我们将慢慢建立导致生成对抗网络(GAN)发展的想法和原则。我们将遇到不同的任务,例如条件图像生成,3D对象生成,视频合成。

        让我们从回顾第一部分的内容开始!

        通常,数据生成方法存在于从计算机视觉到自然语言处理的各种现代深度学习应用程序中。在这一点上,我们能够通过人眼产生几乎无法区分的生成数据。生成学习大致可分为两大类:

  • a)变分自动编码器(VAE)
  • b)生成对抗网络(GAN)。

2.1 为什么不只是自动编码器?

        很多人仍然想知道为什么研究人员让GANs变得如此困难。为什么不直接使用自动编码器并最小化均方误差,使目标图像与预测图像匹配?原因是这些模型产生的结果很差(对于图像生成)。实际上,由于平均,仅最小化距离会产生模糊的预测。请记住,L1 或 L2 损失是标量,它是所有像素的平均数量。直观地说,这是一个类似于应用平滑过滤器的概念,该滤镜根据平均值对像素值求平均值。其次,不可能以这种方式产生多样性(如变分自动编码器)。这就是为什么研究界的注意力采用了GAN模型。请记住,这不是比较,而是GAN方法的区别。

        那么,让我们从头开始:对抗式学习到底是什么

2.2 什么是对抗式学习?

        我们已经通过实验验证,深度学习模型极易受到攻击,这些攻击基于测试时对模型输入的微小修改。假设您有一个经过训练的分类器,该分类器可以使用正确的标签正确识别图像中的对象。

        可以构建一个对抗性示例,这是一个视觉上无法区分的图像。这些对抗图像可以通过噪声扰动来构建。但是,图像分类不正确。为了解决这个问题,一种常见的方法是将对抗性示例注入训练集(对抗性训练)。因此,可以提高神经网络的鲁棒性。这种类型的示例可以通过添加噪声、应用数据增强技术或沿与梯度相反的方向扰动图像(以最大化损失而不是最小化损失)来生成。尽管如此,这些类型的技术还是有点手工制作的,所以总会有不同的扰动可以用来欺骗我们的分类器。现在让我们反过来想!

        如果我们对拥有一个健壮的分类器不感兴趣,而是对替换对抗性示例的手工制作过程感兴趣,该怎么办?通过这种方式,我们可以让网络创建视觉上吸引人的不同示例。所以,这正是生成术语发挥作用的地方。我们专注于生成数据集的代表性示例,而不是使网络对扰动更健壮!让我们使用另一个网络为我们完成这项工作。您如何调用生成类似于训练示例的现实示例的网络?当然是发电机!

三、香草 GAN(生成对抗网络 2014)

3.1 生成机

        由于生成器只是一个神经网络,我们需要为它提供一个输入并决定输出是什么。在最简单的形式中,输入是从小范围的实数分布中采样的随机噪声。这就是我们所说的潜在空间或连续空间。但是,由于我使用“随机”一词,这意味着每次从随机分布中采样时,我都会得到不同的向量样本。这就是随机性的意义所在。这样的输入将为我们提供非确定性的输出。因此,我们可以生成的样本数量没有限制!随机性也是您在与生成对抗学习(GAN)相关的论文中看到期望值符号的原因。输出将是用于生成图像的生成图像或我们想要生成的内容。主要区别在于,现在我们专注于生成特定分布的代表性示例(即狗、绘画、街道图片、飞机等)。

3.2 鉴别器

        鉴别器只不过是分类器。但是,我们不是在正确的类中对图像进行分类,而是专注于学习类的分布(假设生成建筑物图像)。因此,由于所需类是已知的,我们希望分类器量化该类对实际类分布的代表性。这就是为什么鉴别器输出单个概率的原因,其中 0 对应于虚假生成的图像,1 对应于我们分布中的真实样本。

        理想的发生器会产生无法区分的示例,这意味着输出为 0.5。在博弈论方面,这个对手被称为2人最小最大游戏。在博弈论中,最小-最大博弈或纳什均衡是涉及两个玩家的非合作博弈的数学表示,其中假设每个玩家都知道另一个玩家的均衡策略,并且没有玩家通过改变自己的策略而获得任何好处。

        生成器 G 试图生成接近真实分布的假示例,以欺骗鉴别器 D,而 D 试图确定分布的起源。规则GAN的核心思想是基于通过D的“间接”训练,该训练也在动态更新。

3.3 生成对抗训练方案

        基于上述原则,第一个GAN于2014年推出。了解生成式学习的训练过程很重要。一个关键的见解是间接训练:这基本上意味着生成器的训练不是为了最小化到特定图像的距离,而只是为了欺骗鉴别器!这使模型能够以无监督的方式学习。最后,请注意,训练生成器时的基本事实在输出中为 1(如真实图像),即使示例是假的。发生这种情况是因为我们的目标只是愚弄D。下图说明了此过程:

发电机
生成器训练方案的图解

        另一方面,判别器使用真实图像和生成的图像来区分它们,将真实图像的预测推到1(真实),将生成图像的预测推到0(假)。在此阶段,请注意生成器未经过训练

鉴别器
鉴别器训练方案示意图

        GAN的作者提出了一种由G和D的4个全连接层组成的架构。当然,G 输出图像的一维向量,D 输出 (1,0) 范围内的标量。

3.4 GAN培训计划在行动

        代表性赋予我们控制思想的权力。在看到代码之前了解数学是很好的。因此,给定鉴别器 D、生成器 G、vale 函数 V,基本的双人最小值游戏可以定义为(M 是样本):

在实践中,回想一下期望值的离散定义,它看起来像这样:

         事实上,鉴别器执行梯度上升,而生成器执行梯度下降。这可以通过检查上述方程的生成器部分的差异来观察到。请注意,D 需要访问真实和虚假数据,而 G 无法访问真实图像。让我们看看这个美丽而惊人的想法在真正的python代码中实践:

import torch

def ones_target(size):
    '''
    For real data when training D, while for fake data when training G
    Tensor containing ones, with shape = size
    '''
    return torch.ones(size, 1)

def zeros_target(size):
    '''
    For data when training D
    Tensor containing zeros, with shape = size
    '''
    return torch.zeros(size, 1)


def train_discriminator(discriminator, optimizer, real_data, fake_data, loss):
    N = real_data.size(0)
    # Reset gradients
    optimizer.zero_grad()
    # Train on Real Data
    prediction_real = discriminator(real_data)
    # Calculate error and backpropagate
    target_real = ones_target(N)

    error_real = loss(prediction_real, target_real)
    error_real.backward()

    # Train on Fake Data
    prediction_fake = discriminator(fake_data)
    # Calculate error and backpropagate
    target_fake = zeros_target(N)

    error_fake = loss(prediction_fake, target_fake)
    error_fake.backward()

    # Update weights with gradients
    optimizer.step()
    return error_real + error_fake, prediction_real, prediction_fake


def train_generator(discriminator, optimizer, fake_data, loss):
    N = fake_data.size(0)
    # Reset the gradients
    optimizer.zero_grad()
    # Sample noise and generate fake data
    prediction = discriminator(fake_data)

    # Calculate error and backpropagate
    target = ones_target(N)
    error = loss(prediction, target)
    error.backward()
    optimizer.step()
    return error

甘尼斯特
在 Mnist 中生成的香草 GAN 图像

3.5 GAN 中的模式折叠

        一般来说,GAN容易出现所谓的模式崩溃问题。后者通常是指无法充分表示所有可能输出的像素空间的生成器。相反,G只选择几个与噪声图像相对应的有限影响模式。通过这种方式,D能够区分真假,并且G的损失变得非常不稳定(由于梯度爆炸)。我们将在我们的系列中多次重温模式崩溃,因此掌握基本原理至关重要。

        基本上,G 卡在一个参数设置中,它总是发出相同的点。发生崩溃后,鉴别器了解到这个单点来自发生器,但梯度下降无法分离相同的输出。结果,D的梯度将生成器产生的单个点永远推到空间周围。

        模式崩溃可能会以相反的方式发生:如果在训练鉴别器时卡在局部最小值并且他无法找到最佳策略,那么生成器很容易欺骗当前的鉴别器(在几次迭代中)。

        最后,我会用简单的术语来解释模式崩溃:2 人游戏的状态,其中一名玩家获得了几乎不可逆转的优势,这使得很难输掉游戏。

四、条件 GAN(条件生成对抗网络 2014)

      条件概率是给定另一个事件发生的概率的度量。在这项工作中,介绍了GAN的条件版本。基本上,条件信息可以通过简单地输入任何“额外”数据来利用,例如图像标签/标签等。通过根据辅助信息调节模型,可以指导数据生成过程。

        根据生成任务,可以通过将信息输入 D 和 G 作为通过级联的额外输入来执行条件反射。在诸如医学图像生成等其他领域中,条件可能是人口统计信息(即年龄,身高)或语义分割。

有条件的氮化镓

从cGAN论文中获取的GAN调节的视觉表示

五、DCGAN(使用深度卷积生成对抗网络的无监督表示学习 2015)

        DCGAN是第一个卷积GAN。深度卷积生成对抗网络(DCGAN)是GAN的拓扑约束变体。为了减少每层的参数数量,以及使训练更快、更稳定,引入了以下原则:

  1. 将任何池化层替换为 D 中的跨步卷积。这是合理的,因为池化是固定操作。相比之下,跨步卷积也可以看作是学习池化操作,这增加了模型的表现能力。缺点是它还增加了可训练参数的数量。

  2. 在 G 中使用转置卷积。由于采样噪声是一维向量,因此通常将其投影并重塑为具有大量特征图的小二维网格(即1x2)。这就是为什么G使用转置卷积来增加空间维度(通常将它们加倍)并减少特征图的数量。

  3. 在 G 和 D 中使用批量归一化。批量归一化可根据层中每个批次的统计数据稳定训练并启用具有更高学习率的训练。

  4. 删除完全连接的隐藏层以获得更深的架构,以减少训练参数的数量和训练时间。

  5. 在 G 中对所有图层使用 ReLU 激活,但输出除外,输出在图像范围内生成值 [-1,1]

  6. 在所有层的鉴别器中使用 LeakyReLU 激活。这两个激活函数都是非线性的,使模型能够学习更复杂的表示。

  7. D 的特征映射比比较方法(K 均值)少。一般来说,对于 G 和 D,不清楚哪个模型应该更复杂,因为它与任务相关。在这项工作中,G 比 D 具有更多的可训练参数。但是,这种设计选择背后没有理论依据。

无条件甘

DCGAN的无条件生成器

结果和讨论

让我们观察 MNIST 数据集中 DCGAN 模型的输出,给定一个简单的实现

DCGAN-MNIST

使用 DCGAN 提高图像质量

使用卷积模块,输出数字更清晰,包含的噪声更少。如果你想在实践中观察模式崩溃,你可以尝试在CIFAR-10中训练DCGAN,只使用一个类:

DCGAN-CIFAR

在CIFAR10中观测DCGAN中的模式崩溃,使用一个类

基本上,你从噪音开始。然后,您有一个公平的表示,它开始看起来像所需的图像。然后轰!生成器从字面上折叠它是重复的方形图案。发生了什么事?模式崩溃!.

总而言之,DCGAN是大多数下一个架构所基于的标准卷积基线。与标准GAN相比,它在视觉质量(模糊度较小)和训练稳定性方面都显示出很大的改进。然而,正如我们将看到的,对于像CIFAR-10的无条件图像生成这样的大尺度,它有很大的空间来创造伟大的工程魔法。最后,让我们看一下在整个 CIFAR-10 数据集中用所有类训练 DCGAN 的结果。

DCGAN-CIFAR10

DCGAN在CIFAR10

很公平,对吧?

六、Info GAN:通过信息最大化生成对抗网络进行表征学习(2016)

我们已经讨论过 cGAN 的条件变量,通常是类标签或标签。但是,有两个问题没有答案:

a)与噪声相比,有多少信息被传递到生成过程中,以及

b)位于潜在空间中的完全无监督条件可以帮助我们在发电机空间中“行走”吗?

这项工作通过解开的表征和相互信息来解决这些问题。

6.1 解开的表示

        解缠表示是一种无监督学习技术,它将每个特征分解(解缠)为狭义定义的变量,并将它们编码为单独的维度。如原始Info GAN论文中所述,解开表示对于需要了解数据重要属性(面部识别,对象识别)的自然任务很有用。就我个人而言,我喜欢将解开表示视为数据较低维度的解码信息。因此,有人认为一个好的生成模型会自动学习解开的表示。

        动机是合成观察到的数据的能力具有某种形式的理解。基本上,我们希望模型能够发现独立和关键的无监督表示。这是通过引入一些独立的连续/分类变量来实现的。问题是,是什么让这些条件变量(通常称为潜在代码)与GAN中的现有输入噪声不同?相互信息最大化!

 

6.2 GAN中的互信息

        在通用GAN中,生成器可以自由忽略额外的潜在条件变量。这可以通过找到满足以下条件的解决方案来实现:P(x|c) = P(x)。为了解决琐碎代码的问题,提出了一种信息论正则化。更具体地说,潜在代码c和生成器分布G(z,c)之间应该有高度的互信息。

        两个随机变量(条件和输出)的互信息 (MI) 是它们之间相互依赖性的定量度量。从字面上看,它通过观察生成器的输出来量化获得的有关条件变量的“信息量”。因此,如果 I 是给定生成器输出的代码信息量,则I(c |G(z, c))应该很高MI有一个直观的解释:它是在观察条件随机变量时减少生成的输出中的不确定性。

因此,我们希望P(c|x)要高(小熵)。这意味着给定观察到的生成的图像x,我们很有可能观察到该条件。换句话说,潜在变量c中的信息不应该在生成过程中丢失。接下来的问题自己出现了,我们如何估计条件分布P(c|x)?让我们训练一个神经网络来模拟所需的分布!

6.3 实现条件互信息

        由于添加另一个网络来模拟此概率会增加复杂性,因此作者建议通过添加输出此概率的附加层,使用现有的鉴别器对其进行建模。因此,D还有另一个需要学习的目标:最大化互信息!这个额外的目标就是它在标题中被称为互信息正则化(类似于权重衰减)的原因。

        因此,给定Q具有D层加上额外分类层的模型,可以定义添加到GAN目标中的辅助损失L_I(G,Q)。最后,我们对GAN的训练过程没有变化,几乎没有额外的开销(计算上没有额外的目标)。这就是 InfoGan 如此绝妙的想法!

6.4 结果

        改变连续条件变量,说明我们可以使用低维解缠表示在图像的高维空间中导航。实际上,观察到表征学习会导致有意义的表征,例如旋转和厚度。代码可以在这里找到。

信息甘结果

旋转和厚度的无监督建模,InfoGAN

“值得注意的是,在潜在变量中,生成器不会简单地拉伸或旋转数字,而是调整其他细节,如厚度或笔触样式,以确保生成的图像看起来很自然。” ~ 信息甘

七、改进的 GAN 训练技术 (2016)

        这是一项伟大的实验工作,总结了可用于自身问题的训练技巧,以稳定 GAN 中的训练。由于GAN训练包括寻找两个玩家的纳什均衡梯度下降,因此对于许多任务(游戏)可能无法收敛。基本上,纳什均衡是一个没有一个球员可以通过改变其权重来提高的点。主要原因是成本函数通常是非凸的,参数是连续的。最后,参数空间是极高维的。

        为了更好地理解这一点,请考虑预测分辨率为128x128(16384像素)的图像的任务就像试图在R16384的复杂世界中寻找路径一样。高维路径称为流形,基本上是满足我们目标的生成图像的集合。如果我们的目标是学习人脸,那么我们的目标是找到世界上代表人脸的一小部分。在这条路径中移动就是在表示人脸的向量解决方案内移动。我強烈推薦英伟達的這個視頻。这项工作的代码可以在这里找到。现在,让我们开始训练魔法吧!

7.1 功能匹配

        基本上,生成器被训练为匹配鉴别器中间层上特征的期望值。新目标要求生成器生成与真实数据的统计信息(中间表示)匹配的数据。通过以这种方式训练鉴别器,我们要求D找到那些对真实数据与当前模型生成的数据最具区别的特征。到目前为止的经验结果表明,特征匹配在常规GAN变得不稳定的情况下确实有效。为了测量距离,采用了L2范数。

7.2 小批量歧视

        理念:小批量判别使我们能够非常快速地生成具有视觉吸引力的样品。

        动机:由于鉴别器独立处理每个示例,因此其梯度之间没有协调,因此没有机制来告诉生成器的输出彼此更加不同。

小批量区分
小批量区分的工作原理。

        解决方案:允许鉴别器组合查看多个数据示例,并执行我们所说的小批量判别。如上图所示,中间特征向量乘以 3D 张量,得到由 M1 表示的矩阵序列。基于矩阵,最终目标是量化每个数据对的成对相似性的度量。直观地说,现在每个样本都会有额外的信息o(xi),表示与其他数据样本相比的相似性。

        事实上,它们将小批量层的输出相似度 o(xi) 与其输入的中间特征 f(xi) 连接起来。然后,结果被输入到鉴别器的下一层。因此,鉴别器的任务仍然有效地将单个示例分类为真实数据或生成数据,但它现在能够使用小批量中的其他示例作为辅助信息。然而,这种方法的计算复杂度巨大,因为它需要所有样本之间的成对相似性。

7.3 历史平均体重

        参数的历史平均值可以在线更新,因此此学习规则可以很好地扩展到较长的时间序列。它对于梯度下降可能失败的低维问题非常有用。如果你曾经看过动量是如何工作的,它的工作原理是相同的,只是它只解释了之前的梯度。历史权重平均大致相同,但过去有多个时间步长。

7.4 单侧标签平滑和虚拟批次归一化

        仅在正标签(真实数据样本)中将标签平滑化为α(而不是 0)。这里不多说。与标准批次规范化相反,在虚拟批次归一化中,每个示例 x 都基于在参考批次示例上收集的统计信息进行规范化。动机是批量规范化导致输入示例 x 的神经网络输出高度依赖于同一小批量的其他输入。为了应对这种情况,选择一次参考批次的示例,并在训练期间保持固定。但是,引用批处理仅使用其自己的统计信息进行规范化,因此计算成本很高。

7.5 初始分数:评估图像质量

        该文没有逐一检查视觉质量,而是提出了一种新的定量方法来评估模型。这可以简单地描述为两步方法:首先,使用预先训练的分类器(InceptionNet)推断生成图像的标签(条件概率)。然后,测量分类器的KL散度与无条件概率的比较。为此,我们不需要志愿者来评估我们的模型,我们可以量化模型的分数。

7.6 半监督学习

        可以使用任何标准分类器进行半监督学习,只需将来自 GAN 生成器 G 的样本添加到我们的数据集中,用新的“生成”类标记它们,或者没有额外的类,因为预训练分类器以低熵(高概率,即人类 97/100)识别标签(条件概率)。

7.7 结果和讨论

小批量结果

摘自原始出版物

基于所提出的技术,GANs首次能够学习可区分的特征。图示的动物特征包括眼睛和鼻子。然而,这些特征并没有正确地组合成具有真实解剖结构的动物。尽管如此,这是朝着GAN发展迈出的一大步。总而言之,这项基础工作的结果是:

基于特征匹配的思想,可以生成人类认可的全局统计数据。发生这种情况是因为人类视觉系统对图像统计数据有很强的适应性,可以帮助推断图像所代表的类别,而它可能对对图像解释不太重要的局部统计数据不太敏感。但是,我们将在下一篇文章中看到,更好的模型尝试使用不同的技术来学习它们。

此外,通过让鉴别器D对图像中显示的对象进行分类,作者试图偏置D,从而开发内部表示。后者强调与人类强调的相同特征。这种效应可以理解为迁移学习的一种方法,并且可以更广泛地应用。

八、结论

        在本文中,我们以生成学习的思想为基础。我们引入了对抗学习和GAN训练方案的概念。然后,我们讨论了模态崩溃、条件生成和基于互信息的解缠表示。基于观察到的训练问题,我们介绍了训练GAN的基本技巧。最后,我们在训练网络和实际观察到的模式崩溃时看到了一些结果。有关最近发布的具有多个 GAN 以进行大量实验的出色存储库,请访问此存储库。

如果您想要一门全新的 GAN 课程,我们强烈推荐 Coursera 专业化。如果您想建立自动编码器的背景,我们还建议以下Udemy课程。

        到现在为止,您开始意识到我们声称只是第一部分,是大多数教程声称的完整GAN指南。但是,我谦虚地请您考虑检查该系列的其余部分,还有更多有趣的东西。每天一篇 GAN 文章就足够了!

        在下一篇文章中,我们将看到更高级的架构和训练技巧,这些技巧导致了更高分辨率的图像和 3D 对象生成。

}

九、引用

  1. Goodfellow, I., Pouget-Abadie, J., Mirza, M., Xu, B., Warde-Farley, D., Ozair, S., ...和Bengio, Y. (2014).生成对抗网络。神经信息处理系统进展(第2672-2680页)。
  2. Mirza, M., & Osindero, S. (2014).条件生成对抗网络。arXiv预印本arXiv:1411.1784。 Radford, A., Metz, L., & Chintala, S. (2015).使用深度卷积生成对抗网络的无监督表示学习。arXiv预印本arXiv:1511.06434。
  3. Chen, X., Duan, Y., Houthooft, R., Schulman, J., Sutskever, I., & Abbeel, P. (2016).Infogan:通过信息最大化生成对抗网络进行可解释的表示学习。神经信息处理系统进展(第2172-2180页)。
  4. Salimans,T.,Goodfellow,I.,Zaremba,W.,Cheung,V.,Radford,A.和Chen,X.(2016)。改进了训练甘斯的技术。神经信息处理系统进展(第2234-2242页)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/50641.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据结构——单链表

不能毁灭我的,终将使我更强大 文章目录 一、链表 二、单链表 三、实现单链表 1.定义节点 2.由数据生成节点 3.连接并打印链表 4.单链表的基本接口 头插 头删 尾插 尾删 由数据Data找节点 在pos之前插入节点 在pos之后插入节点 删除pos节点 删除po…

Matplotlib_绘制柱状图

绘制柱状图 🧩bar方法 bar()是Matplotlib.pyplot库中用于绘制条形图(bar chart)的函数。条形图是一种常见的数据可视化图表,用于显示不同类别之间的比较。 函数签名: matplotlib.pyplot.bar(x, height, width0.8, …

【KO】vite使用 git bash here创建vue3项目时方向键失败!

文章目录 起因过程结果 起因 今天使用vite创建ue3项目,因为git使用习惯了就直接用git运行创建命令,前两步都没啥问题,到选择框架的时候问题来了,方向键无效。如图: 过程 常理来说是直接用方向键↑和↓进行选择&…

3d激光slam建图与定位(1)_基于ndt算法定位

一.代码实现流程 二.ndt算法原理 一.该算法定位有三个进程文件 1.map_loader.cpp用于点云地图的读取,从文件中读取点云后对这个点云地图进行旋转平移后发布点云地图到ros #include "map_loader.h"MapLoader::MapLoader(ros::NodeHandle &nh){std::st…

【深度学习笔记】动量梯度下降法

本专栏是网易云课堂人工智能课程《神经网络与深度学习》的学习笔记,视频由网易云课堂与 deeplearning.ai 联合出品,主讲人是吴恩达 Andrew Ng 教授。感兴趣的网友可以观看网易云课堂的视频进行深入学习,视频的链接如下: 神经网络和…

Python开发之手动实现一维线性插值

Python开发之手动实现一维线性插值 1.线性插值法介绍2.手动实现线性插值3.案例一:手动实现线性插值4.使用pandas的插值方法实现要求(推荐)5.案例二:对一组数据进行线性插值和SG滤波处理 前言:主要介绍手动实现一维线性插值以及pandas里面的in…

【Docker】容器的数据卷

目录 一、数据卷的概念与作用 二、数据卷的配置 三、数据卷容器的配置 一、数据卷的概念与作用 在了解什么是数据卷之前我们先来思考以下这些问题: 1.如果我们一个容器在使用后被删除,那么他里面的数据是否也会丢失呢?比如容器内的MySQL的…

2023年的深度学习入门指南(21) - 百川大模型

2023年的深度学习入门指南(21) - 百川大模型 前面我们用了三节的篇幅介绍了目前最强大的开源模型LLaMA2。这一节我们说一说国产大模型的一个代表,百川大模型。 使用百川大模型 第一步我们先把百川用起来,然后再研究如何训练和其原理如何。 百川的使用…

Mybatis使用collection映射一对多查询分页问题

场景&#xff1a;页面展示列表&#xff0c;需要查询多的字段&#xff0c;和一的字段。并且还要分页。 这时候直接想到的是手写sql。 /*** 标签*/private List<BasicResidentTags> tags;Data TableName("basic_resident_tags") public class BasicResidentTag…

vue3 - element-plus 上传各种 word pdf 文件、图片视频并上传到服务器功能效果,示例代码开箱即用。

效果图 在 vue3 项目中,使用 element plus 组件库的 el-upload 上传组件,进行文件、图片图像的上传功能示例。 完整代码 可直接复制,再改个接口地址。 在这里上传图片和文件是分成

新产品:Stimulsoft Forms 2023.3.1 Crack

Stimulsoft Forms 是一个用于交互式收集和处理用户数据的组件。表单工具可以轻松集成到您的项目或应用程序中&#xff0c;具有直观且用户友好的界面&#xff0c;并允许您创建丰富的表单模板。Stimulsoft Forms 是应用程序中与用户交互的新水平 什么是 Stimulsoft Forms&#xf…

华为数通HCIP-EVPN基础

MP-BGP MP-BGP&#xff08;Multiprotocol Extensions for BGP-4&#xff09;在RFC4760中被定义&#xff0c;用于实现BGP-4的扩展以允许BGP携带多种网络层协议&#xff08;例如IPv6、L3VPN、EVPN等&#xff09;。这种扩展有很好的后向兼容性&#xff0c;即一个支持MP-BGP的路由…

cad丢失mfc140u.dll怎么办?找不到mfc140u.dll的解决方法

第一&#xff1a;mfc140u.dll有什么用途&#xff1f; mfc140u.dll是Windows操作系统中的一个动态链接库文件&#xff0c;它是Microsoft Foundation Class (MFC)库的一部分。MFC是 C中的一个框架&#xff0c;用于构建Windows应用程序的用户界面和功能。mfc140u.dll包含了MFC库中…

Flowable-中间事件-信号中间抛出事件

定义 当流程执行到达信号抛出事件时&#xff0c;流程引擎会直接抛出信号&#xff0c;其他引用了与其相同的信号捕获 事件会被触发&#xff0c;信号发出后事件结束&#xff0c;流程沿后继路线继续执行。其抛出的信号可以被信号开始事 件&#xff08;Signal Start Event&#xf…

从官网认识 JDK,JRE,JVM 三者的关系

点击下方关注我&#xff0c;然后右上角点击...“设为星标”&#xff0c;就能第一时间收到更新推送啦~~~ JVM 是一些大厂面试必问点&#xff0c;要想解决 OOM、性能调优方面的问题&#xff0c;掌握 JVM 知识必不可少&#xff0c;从今天开始&#xff0c;将为大家介绍 JVM 的常用知…

css实现有缺口的border

css实现有缺口的border 1.问题回溯2.css实现有缺口的border 1.问题回溯 通常会有那种两个div都有border重叠在一起就会有种加粗的效果。 div1,div2,div3都有个1px的border&#xff0c;箭头标记的地方是没有处理解决的&#xff0c;很明显看着是有加粗效果的。其实这种感觉把di…

【Vscode】远程内存占用大

查看远程服务器上的扩展 依次删除&#xff0c;重新连接后观察内存占用 此扩展占用较高&#xff0c;约2G&#xff08;前后端项目&#xff0c;依赖较多导致&#xff09;

【node.js】04-模块化

目录 一、什么是模块化 二、node.js中的模块化 1. node.js中模块的分类 2. 加载模块 3. node.js 中的模块作用域 4. 向外共享模块作用域中的成员 4.1 module对象 4.2 module.exports 对象 4.3 exports对象 5. node.js 中的模块化规范 一、什么是模块化 模块化是指解…

为Android构建现代应用——主体结构

创建Screents和ViewModels 在前面的章节中&#xff0c;我们已经分析了OrderNow项目的理论概念和我们将赋予的组织。 在本章中&#xff0c;我们将开始实现初始结构和模板&#xff0c;这将联接每一个应用程序的部分。 首先将添加以下带有各自视图模型的主屏幕&#xff1a; •…

springboot 之以enable开头的注解

Spring​ 有很多 Enable 开头的注解&#xff0c;平时在使用的时候也没有注意过为什么会有这些注解 Enable 注解 首先我们先看一下有哪些常用的 Enable 开头的注解&#xff0c;以及都是干什么用的。 EnableRetry​&#xff1a;开启Spring 的重试功能&#xff1b; EnableSch…