VAE模型及pytorch实现

VAE模型及pytorch实现

    • VAE模型推导部分
    • 最小化KL散度推导
    • 代码部分
      • 损失函数
      • Encoder部分
      • Decoder部分
      • VAE整体架构
    • VAE问题
    • 参考资料

VAE(变分自编码器)是一种生成模型,结合了自编码器和概率图模型的思想。它通过学习数据的潜在分布,可以生成新的数据样本。VAE通过将输入数据映射到潜在空间中的分布,并在训练过程中最大化数据与潜在变量之间的条件概率来实现。其关键思想在于编码器将输入数据编码成潜在分布的参数,解码器则从这个分布中采样生成新的数据。这种生成方式不仅能够生成新的数据,还能够在潜在空间中进行插值和操作,提供了强大的特征学习和数据生成能力。

AE论文:Auto-Encoding Variational Bayes

VAE论文:Semi-supervised Learning with Deep Generative Models

2023-11-28_16-06-34

VAE模型推导部分

2023-11-28_10-05-53

假设 P ( z ) P(z) P(z)是一个正态分布, x ∣ z ∼ N ( μ ( z ) , σ ( z ) ) x|z \sim N(\mu(z),\sigma(z)) xzN(μ(z),σ(z))是x从z分布中进行采样得到的。
P ( x ) = ∫ z P ( z ) P ( x ∣ z ) d z P(x)=\int_zP(z)P(x|z)dz P(x)=zP(z)P(xz)dz
为了最大化 P ( x ) P(x) P(x),我们采用极大似然估计
L = ∑ x l o g P ( x ) M a x i m i z i n g   t h e   l i k e l i h o o d   o f   t h e   o b s e r v e d   x L=\sum_{x}logP(x)\quad\mathrm{Maximizing~the~likelihood~of~the~observed~x} L=xlogP(x)Maximizing the likelihood of the observed x
l o g P ( x ) logP(x) logP(x)进一步进行变形
l o g P ( x ) = ∫ z q ( z ∣ x ) l o g P ( x ) d z q ( z ∣ x )   c a n   b e   a n y   d i s t r i b u t i o n = ∫ z q ( z ∣ x ) l o g ( P ( z , x ) P ( z ∣ x ) ) d z = ∫ z q ( z ∣ x ) l o g ( P ( z , x ) q ( z ∣ x ) q ( z ∣ x ) P ( z ∣ x ) ) d z = ∫ z q ( z ∣ x ) l o g ( P ( z , x ) q ( z ∣ x ) ) d z + ∫ z q ( z ∣ x ) l o g ( q ( z ∣ x ) P ( z ∣ x ) ) d z ≥ ∫ z q ( z ∣ x ) l o g ( P ( x ∣ z ) P ( z ) q ( z ∣ x ) ) d z \begin{aligned} logP(x)=&\int_{z}q(z|x)logP(x)dz\quad\mathrm{q(z|x)~can~be~any~distribution} \\ &=\int_{z}q(z|x)log\left(\frac{P(z,x)}{P(z|x)}\right)dz=\int_{z}q(z|x)log\left(\frac{P(z,x)}{q(z|x)}\frac{q(z|x)}{P(z|x)}\right)dz \\ &=\int_{z}q(z|x)log\left(\frac{P(z,x)}{q(z|x)}\right)dz+\int_{z}q(z|x)log\left(\frac{q(z|x)}{P(z|x)}\right)dz \\ &\geq \int_{z}q(z|x)log\left(\frac{P(x|z)P(z)}{q(z|x)}\right)dz \end{aligned} logP(x)=zq(zx)logP(x)dzq(z∣x) can be any distribution=zq(zx)log(P(zx)P(z,x))dz=zq(zx)log(q(zx)P(z,x)P(zx)q(zx))dz=zq(zx)log(q(zx)P(z,x))dz+zq(zx)log(P(zx)q(zx))dzzq(zx)log(q(zx)P(xz)P(z))dz
因为 K L ( q ( z ∣ x ) ∣ ∣ P ( z ∣ x ) ) = ∫ z q ( z ∣ x ) l o g ( q ( z ∣ x ) P ( z ∣ x ) ) d z KL\left(q(z|x)||P(z|x)\right)=\int_{z}q(z|x)log\left(\frac{q(z|x)}{P(z|x)}\right)dz KL(q(zx)∣∣P(zx))=zq(zx)log(P(zx)q(zx))dz是大于0的数,所以,上述式子大于等于前面那一项。

​ 对于给定的 P ( x ∣ z ) P(x|z) P(xz),让KL尽可能小,就是让 L b L_b Lb最大。同时,当 K L KL KL尽可能小,也就是说明 q ( z ∣ x ) q(z|x) q(zx) p ( z ∣ x ) p(z|x) p(zx)这两个分布的相似度越高。

2023-11-28_10-09-17

​ 接下来我们就对 L b L_b Lb进行最大化变形处理,变形后左侧为,右侧为
L b = ∫ z q ( z ∣ x ) l o g ( P ( z , x ) q ( z ∣ x ) ) d z = ∫ z q ( z ∣ x ) l o g ( P ( x ∣ z ) P ( z ) q ( z ∣ x ) ) d z = ∫ z q ( z ∣ x ) log ⁡ ( P ( z ) q ( z ∣ x ) ) d z + ∫ z q ( z ∣ x ) l o g P ( x ∣ z ) d z = K L ( q ( z ∣ x ) ∣ ∣ P ( z ) ) + E q ( z ∣ x ) [ l o g P ( x ∣ z ) ] \begin{aligned} L_b&=\int_zq(z|x)log\left(\frac{P(z,x)}{q(z|x)}\right)dz=\int_zq(z|x)log\left(\frac{P(x|z)P(z)}{q(z|x)}\right)dz\\ &=\int_z q(z|x)\log (\frac{P(z)}{q(z|x)})dz+\int_zq(z|x)logP(x|z)dz\\ &=KL(q(z|x)||P(z))+E_{q(z|x)}[logP(x|z)] \end{aligned} Lb=zq(zx)log(q(zx)P(z,x))dz=zq(zx)log(q(zx)P(xz)P(z))dz=zq(zx)log(q(zx)P(z))dz+zq(zx)logP(xz)dz=KL(q(zx)∣∣P(z))+Eq(zx)[logP(xz)]

​ 如下所示,我们需要做的就是最小化 K L ( q ( z ∣ x ) ∣ ∣ P ( z ) ) KL(q(z|x)||P(z)) KL(q(zx)∣∣P(z))并最大化 E q ( z ∣ x ) [ l o g P ( x ∣ z ) ] E_{q(z|x)}[logP(x|z)] Eq(zx)[logP(xz)]。对于最小化KL,我们可以理解为输入一个 x x x,然后通过神经网络调参输出 μ ( x ) , σ ( x ) \mu_(x),\sigma(x) μ(x),σ(x),也就是让这个数值尽可能和 P ( z ) P(z) P(z)这个分布接近。这部分相当于Encoder部分。

​ 在Encoder部分结束后,对于第2项,从已知的 z z z,也就是数据的隐式特征表示,去采样出 x x x,相当于模型的Decoder部分,输出一个均值使之尽可能接近原始的 x x x,因为对于这种条件概率,均值最大的时候就是 x x x

2023-11-28_10-17-39

最小化KL散度推导

为了最小化 q ( z ∣ x ) q(z|x) q(zx) P ( z ) P(z) P(z)的KL散度,首先,我们先对正态分布的KL散度计算进行推导。参考链接高斯分布的KL散度-CSDN博客
K L ( N ( μ 1 , σ 1 2 ) ∥ N ( μ 2 , σ 2 2 ) ) = ∫ x 1 2 π σ 1 e − ( x − μ 1 ) 2 2 σ 1 2 log ⁡ 1 2 π σ 1 e − ( x − μ 1 ) 2 2 σ 1 2 1 2 π σ 2 e − ( x − μ 2 ) 2 2 σ 2 2 d x = ∫ x 1 2 π σ 1 e − ( x − μ 1 ) 2 2 σ 1 2 [ log ⁡ σ 2 σ 1 − ( x − μ 1 ) 2 2 σ 1 2 + ( x − μ 2 ) 2 2 σ 2 2 ] d x \begin{aligned} \mathrm{KL}\left(\mathcal{N}\left(\mu_{1}, \sigma_{1}^{2}\right) \| \mathcal{N}\left(\mu_{2}, \sigma_{2}^{2}\right)\right) & =\int_{\mathrm{x}} \frac{1}{\sqrt{2 \pi} \sigma_{1}} \mathrm{e}^{-\frac{\left(x-\mu_{1}\right)^{2}}{2 \sigma_{1}^{2}}} \log \frac{\frac{1}{\sqrt{2 \pi} \sigma_{1}} e^{-\frac{\left(x-\mu_{1}\right)^{2}}{2 \sigma_{1}^{2}}}}{\frac{1}{\sqrt{2 \pi} \sigma_{2}} e^{-\frac{\left(x-\mu_{2}\right)^{2}}{2 \sigma_{2}^{2}}}} d x \\ & =\int_{x} \frac{1}{\sqrt{2 \pi} \sigma_{1}} e^{-\frac{\left(x-\mu_{1}\right)^{2}}{2 \sigma_{1}^{2}}}\left[\log \frac{\sigma_{2}}{\sigma_{1}}-\frac{\left(x-\mu_{1}\right)^{2}}{2 \sigma_{1}^{2}}+\frac{\left(x-\mu_{2}\right)^{2}}{2 \sigma_{2}^{2}}\right] d x \end{aligned}\\ KL(N(μ1,σ12)N(μ2,σ22))=x2π σ11e2σ12(xμ1)2log2π σ21e2σ22(xμ2)22π σ11e2σ12(xμ1)2dx=x2π σ11e2σ12(xμ1)2[logσ1σ22σ12(xμ1)2+2σ22(xμ2)2]dx

  1. 对于第1项,由于 σ 1 , σ 2 \sigma_1,\sigma_2 σ1,σ2与x无关,则可以直接提取到积分外面,该积分即为正态分布的全概率公式,也就是为1
    log ⁡ σ 2 σ 1 ∫ x 1 2 π σ 1 e − ( x − μ 1 ) 2 2 σ 1 2 d x = log ⁡ σ 2 σ 1 \log \frac{\sigma_{2}}{\sigma_{1}} \int_{\mathrm{x}} \frac{1}{\sqrt{2 \pi} \sigma_{1}} \mathrm{e}^{-\frac{\left(x-\mu_{1}\right)^{2}}{2 \sigma_{1}^{2}}} \mathrm{dx}=\log \frac{\sigma_{2}}{\sigma_{1}}\\ logσ1σ2x2π σ11e2σ12(xμ1)2dx=logσ1σ2

  2. 对于第2项,则是由方差定义式 D ( x ) = ∫ x ( x − μ ) 2 f ( x ) d x D(x)=\int_x(x-\mu)^2f(x)dx D(x)=x(xμ)2f(x)dx,可知这个积分的结果为 σ 1 2 \sigma_1^2 σ12
    − 1 2 σ 1 2 ∫ x ( x − μ 1 ) 2 1 2 π σ 1 e − ( x − μ 1 ) 2 2 σ 1 2 d x = − 1 2 σ 1 2 σ 1 2 = − 1 2 -\frac{1}{2 \sigma_{1}^{2}} \int_{\mathrm{x}}\left(\mathrm{x}-\mu_{1}\right)^{2} \frac{1}{\sqrt{2 \pi} \sigma_{1}} \mathrm{e}^{-\frac{\left(\mathrm{x}-\mu_{1}\right)^{2}}{2 \sigma_{1}^{2}}} \mathrm{dx}=-\frac{1}{2 \sigma_{1}^{2}} \sigma_{1}^{2}=-\frac{1}{2} 2σ121x(xμ1)22π σ11e2σ12(xμ1)2dx=2σ121σ12=21

  3. 对于第3项,首先将其展开,对于 x 2 x^2 x2,由均方值公式, E ( x 2 ) = D ( x ) + E ( x ) 2 E(x^2)=D(x)+E(x)^2 E(x2)=D(x)+E(x)2,后面两项则分别是通过均值公式以及全概率公式进行计算。
    1 2 σ 2 2 ∫ x ( x − μ 2 ) 2 1 2 π σ 1 e − ( x − μ 1 ) 2 2 σ 1 2 d x = 1 2 σ 2 2 ∫ x ( x 2 − 2 μ 2 x + μ 2 2 ) 1 2 π σ 1 e − ( x − μ 1 ) 2 2 σ 1 2 d x = σ 1 2 + μ 1 2 − 2 μ 1 μ 2 + μ 2 2 2 σ 2 2 = σ 1 2 + ( μ 1 − μ 2 ) 2 2 σ 2 2 \begin{aligned} \frac{1}{2 \sigma_{2}^{2}} \int_{\mathrm{x}}\left(\mathrm{x}-\mu_{2}\right)^{2} \frac{1}{\sqrt{2 \pi} \sigma_{1}} \mathrm{e}^{-\frac{\left(\mathrm{x}-\mu_{1}\right)^{2}}{2 \sigma_{1}^{2}}} \mathrm{dx} & =\frac{1}{2 \sigma_{2}^{2}} \int_{\mathrm{x}}\left(\mathrm{x}^{2}-2 \mu_{2} \mathrm{x}+\mu_{2}^{2}\right) \frac{1}{\sqrt{2 \pi} \sigma_{1}} \mathrm{e}^{-\frac{\left(\mathrm{x}-\mu_{1}\right)^{2}}{2 \sigma_{1}^{2}}} \mathrm{dx} \\ & =\frac{\sigma_{1}^{2}+\mu_{1}^{2}-2 \mu_{1} \mu_{2}+\mu_{2}^{2}}{2 \sigma_{2}^{2}}=\frac{\sigma_{1}^{2}+\left(\mu_{1}-\mu_{2}\right)^{2}}{2 \sigma_{2}^{2}}\\ \end{aligned} 2σ221x(xμ2)22π σ11e2σ12(xμ1)2dx=2σ221x(x22μ2x+μ22)2π σ11e2σ12(xμ1)2dx=2σ22σ12+μ122μ1μ2+μ22=2σ22σ12+(μ1μ2)2

对上述式子进行汇总:
K L ( N ( μ 1 , σ 1 2 ) ∥ N ( μ 2 , σ 2 2 ) ) = log ⁡ σ 2 σ 1 − 1 2 + σ 1 2 + ( μ 1 − μ 2 ) 2 2 σ 2 2 = 1 2 ( σ 1 2 + μ 1 2 − log ⁡ σ 1 2 − 1 ) \begin{aligned} \mathrm{KL}\left(\mathcal{N}\left(\mu_{1}, \sigma_{1}^{2}\right) \| \mathcal{N}\left(\mu_{2}, \sigma_{2}^{2}\right)\right) &=\log{\frac{\sigma_2}{\sigma_1}-\frac{1}{2}+\frac{\sigma_1^2+(\mu_1-\mu_2)^2}{2\sigma_2^2}} \\&=\frac{1}{2}(\sigma_1^2+\mu_1^2-\log^{\sigma_1^2}-1) \end{aligned} KL(N(μ1,σ12)N(μ2,σ22))=logσ1σ221+2σ22σ12+(μ1μ2)2=21(σ12+μ12logσ121)

代码部分

损失函数

通过上述推导,我们知道了需要最小化散度,然后最大化那个均值。所以可以得到如下的损失函数。

    def loss_fn(recon_x, x, mean, log_var):
        BCE = torch.nn.functional.binary_cross_entropy(
            recon_x.view(-1, 28*28), x.view(-1, 28*28), reduction='sum')
        KLD = -0.5 * torch.sum(1 + log_var - mean.pow(2) - log_var.exp())

        return (BCE + KLD) / x.size(0)

Encoder部分

class Encoder(nn.Module):
    def __init__(self, layer_sizes, latent_size):
        super(Encoder, self).__init__()
        self.MLP = nn.Sequential()
        for i, (in_size, out_size) in enumerate(zip(layer_sizes[:-1], layer_sizes[1:])):
            self.MLP.add_module(name="L{:d}".format(i), module=nn.Linear(in_size, out_size))
            self.MLP.add_module(name="A{:d}".format(i), module=nn.ReLU())

        # 首先对图像特征进行一些变换处理,然后将其展开成一维向量,然后通过全连接层得到均值和方差
        self.linear_means = nn.Linear(layer_sizes[-1], latent_size)
        self.linear_log_var = nn.Linear(layer_sizes[-1], latent_size)

    def forward(self, x):
        x = self.MLP(x)

        means = self.linear_means(x)
        log_vars = self.linear_log_var(x)

        return means, log_vars

Decoder部分

class Decoder(nn.Module):
    def __init__(self, layer_sizes, latent_size):
        super(Decoder, self).__init__()
        self.MLP = nn.Sequential()
        input_size = latent_size
        
        for i, (in_size, out_size) in enumerate(zip([input_size] + layer_sizes[:-1], layer_sizes)):
            self.MLP.add_module(
                name="L{:d}".format(i), module=nn.Linear(in_size, out_size))
            if i + 1 < len(layer_sizes):
                self.MLP.add_module(name="A{:d}".format(i), module=nn.ReLU())
            else:
                self.MLP.add_module(name="sigmoid", module=nn.Sigmoid())

    def forward(self, z):
        #对输入的z进行全接连操作,最后输出一个重构的x
        x = self.MLP(z)
        return x

VAE整体架构

class VAE(nn.Module):
    def __init__(self, encoder_layer_sizes, latent_size, decoder_layer_sizes):
        super(VAE, self).__init__()
        self.latent_size = latent_size
        self.encoder = Encoder(encoder_layer_sizes, latent_size)
        self.decoder = Decoder(decoder_layer_sizes, latent_size)

    def forward(self, x):
        if x.dim() > 2:
            x = x.view(-1, 28 * 28)
        means, log_var = self.encoder(x)
        z = self.reparameterize(means, log_var)
        recon_x = self.decoder(z)
        return recon_x, means, log_var, z

    def reparameterize(self, mu, log_var):
        """
        用于对encoder部分输出的均值方差进行重参数化,采样得到隐式表示部分z
        :param mu:
        :param log_var:
        :return:
        """
        std = torch.exp(0.5 * log_var)
        eps = torch.randn_like(std)
        return mu + eps * std

    def inference(self, z):
        recon_x = self.decoder(z)
        return recon_x

VAE问题

vae只是记住图片,而不是生成图片

2023-11-28_11-50-38

再产生图片时,只是通过像素差异进行评估,则对于关键点像素和可忽略像素之间的图片,两者在vae看来是一致的,但是不是理想的产生图片,因此出现了GAN

参考资料

VAE 模型基本原理简单介绍_vae模型-CSDN博客

高斯分布的KL散度-CSDN博客

ML Lecture 18: Unsupervised Learning - Deep Generative Model (Part II)

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

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

相关文章

【数据库】基于排序算法的去重,集合与包的并,差,交,连接操作实现原理,执行代价以及优化

基于两趟排序的其它操作 ​专栏内容&#xff1a; 手写数据库toadb 本专栏主要介绍如何从零开发&#xff0c;开发的步骤&#xff0c;以及开发过程中的涉及的原理&#xff0c;遇到的问题等&#xff0c;让大家能跟上并且可以一起开发&#xff0c;让每个需要的人成为参与者。 本专栏…

跨标签页通信的8种方式(下)

跨标签页通信是指在浏览器中的不同标签页之间进行数据传递和通信的过程。在传统的Web开发中&#xff0c;每个标签页都是相互独立的&#xff0c;无法直接共享数据。然而&#xff0c;有时候我们需要在不同的标签页之间进行数据共享或者实现一些协同操作&#xff0c;这就需要使用跨…

C语言——字符函数和字符串函数(上)

在编程的过程中&#xff0c;我们经常要处理字符和字符串&#xff0c;为了方便操作字符和字符串&#xff0c;C语⾔标准库中提供了⼀系列库函数&#xff0c;接下来我们就学习⼀下这些函数。 一、 字符分类函数 C语⾔中有⼀系列的函数是专⻔做字符分类的&#xff0c;也就是⼀个字…

AI Agent应用落地前半场,属于企服软件厂商推出的平台级AI智能体

GPTs大受欢迎但问题多&#xff0c;企服厂商的AI Agent更被B端客户器重 比尔盖茨预言智能体是下个平台&#xff0c;超自动化平台的AI Agent更靠谱&#xff1f; 以GPTs为代表的AI Agent只是玩具&#xff1f;揭秘真实可用AI智能体长什么样 AI Agent应用落地前半场&#xff0c;属…

mysql处理40w数据脚本执行慢问题

需求背景&#xff1a; 2张表 SS_ZYXX 1w数据&#xff0c;WD_GZPZ 50w数据 SS_ZYXX.id WD_GZPZ.zyxx_id 找到SS_ZYXX表有数据&#xff0c;关联表WD_GZPZ没有数据的SS_ZYXX表的id 处理方案 方案一&#xff1a; 联合查询&#xff1a; 下面sql&#xff0c;在mysql执行时间3…

基于Python的网络爬虫设计与实现

基于Python的网络爬虫设计与实现 摘要&#xff1a;从互联网时代开始&#xff0c;网络搜索引擎就变得越发重要。大数据时代&#xff0c;一般的网络搜索引擎不能满足用户的具体需求&#xff0c;人们更加注重特定信息的搜索效率&#xff0c;网络爬虫技术应运而生。本设计先对指定…

[栈迁移+ret滑梯]gyctf_2020_borrowstack

题目来源buuctf——gyctf_2020_borrowstack 参考链接https://www.shawroot.cc/2097.html 题目信息ubuntu16、64位 第一个read仅溢出一个机器字长&#xff0c;需要栈迁移 解题步骤栈偏移到全局变量bank中&#xff0c;ret2libcgadget 关键步骤 ret滑梯 第二个payload需要添…

内网隧道学习

默认密码&#xff1a;hongrisec2019 一.环境搭建 网卡学习 一个网卡一个分段&#xff0c;想象成一个管道 192.168.52一段 192.168.150一段 仅主机模式保证不予外界连通&#xff0c;保证恶意操作不会跑到真实机之上 52段是内部通信&#xff0c;150段属于服务器&#xff08;…

深入理解强化学习——马尔可夫决策过程:备份图(Backup Diagram)

分类目录&#xff1a;《深入理解强化学习》总目录 在本文中&#xff0c;我们将介绍备份&#xff08;Backup&#xff09;的概念。备份类似于自举之间的迭代关系&#xff0c;对于某一个状态&#xff0c;它的当前价值是与它的未来价值线性相关的。 我们将与下图类似的图称为备份图…

sping boot的配置文件application.properties乱码

1.问题描述 查看spingboot项目中的配置信息&#xff0c;即查看application.properties文件&#xff0c;它出现乱码 2.解决问题 File->Settings->Editor->File Encodings 3.验证是否解决乱码

三维gis中用纹理限定多边形地理区域

在三维 gis 中经常需要在指定的多边形地理范围内做一些操作&#xff0c;比如地形的多边形裁剪、压平多边形区域内的倾斜摄影模型、在指定地理范围内绘制等间距的点等。这都涉及到限定多边形区域的问题。 所谓的限定多边形地理区域&#xff0c;核心问题在于判断某个片元是否处于…

如何获取高质量的静态住宅IP代理?常见误区与注意事项

静态住宅IP代理在今天的网络营销领域扮演着至关重要的角色&#xff0c;静态住宅IP代理以其稳定性和高匿名性&#xff0c;为互联网业务提供了一个安全的执行环境。通过模拟真实用户的网络行为&#xff0c;这些IP代理降低了企业在网络营销活动中被识别和封禁的风险。它保护了企业…

this.$refs,salesRankRefjj.searchRankCall is not a function

在vue项目中&#xff0c;在父组件使用$refs获取不到子组件的方法&#xff0c;为什么&#xff1f; 我的报错如下&#xff1a; [Vue wamn]: Error in v-on handler: "TypeError: this.$refs,salesRankRefjj.searchRankCall is not a function found in 代码如下&#xff1a…

Ultipa参加国际科学会议KGSWC2023

近日&#xff0c;领先的国际科学会议 KGSWC 2023&#xff0c;在西班牙萨拉戈萨大学召开&#xff0c;Ultipa Graph参加。 KGSWC2023是第五届伊比利亚-美洲会议和第四届印度-美洲知识图谱与语义网大会的联合论坛。自2019年成立以来&#xff0c;KGSWC一直是一个重要的学术活动&am…

陶陶摘苹果、跳跃游戏

1. 陶陶摘苹果 题目描述&#xff1a; 陶陶家的院子里有一棵苹果树&#xff0c;每到秋天树上就会结出 10 个苹果。苹果成熟的时候&#xff0c;陶陶就会跑去摘苹果。陶陶有个 30 厘米高的板凳&#xff0c;当她不能直接用手摘到苹果的时候&#xff0c;就会踩到板凳上再试试。 现在…

蓝桥杯-01简介

文章目录 蓝桥杯简介参考资源蓝桥杯官网第15届大赛章程一、概况&#xff08;一&#xff09;大赛背景和宗旨&#xff08;二&#xff09;大赛特色&#xff08;三&#xff09;大赛项目1.Java软件开发2.C/C程序设计3.Python程序设计4.Web应用开发5.软件测试6.网络安全7.嵌入式设计与…

文件服务器迁移

文件服务器迁移还是比较简单的 win server加域 导出配额文件 选中所有项&#xff0c;点击导出 导出共享文件夹权限列表 导出文件夹的权限表&#xff0c;留作备用。需要用到“icacls” icacls c:\windows\* /save aclfile /t # C:\Windows 目录及其子目录中所有文件的 DAC…

性能自动化测试?

一、思考❓❔ 1.什么是性能自动化测试? 性能 系统负载能力超负荷运行下的稳定性系统瓶颈 自动化测试 使用程序代替手工提升测试效率性能自动化 使用代码模拟大批量用户让用户并发请求多页面多用户并发请求采集参数&#xff0c;统计系统负载能力生成报告 2.Python中的性能…

【Vue】vue指令

目录 V-html v-show和v-if v-show 显示 隐藏 v-if 显示 隐藏 总结 显示隐藏的应用场景 未登录的情况 登录的情况 v- else 和 v-else-if v-if 和v-else v-if 和 v-else-if 总结&#xff1a; v-on 语法一&#xff1a; 语法二&#xff1a; 调用传参 v-bind…

微信小程序实现微信登录

文章目录 涉及到的微信官方文档login.wxml效果login.wxml login.js效果login.jsutil.js 后端&#xff08;使用django&#xff09;urls.pyviews.py 流程&#xff1a; 1. wx.getUserProfile() 会调出获取用户微信的页面 2. 当用户点击“允许”后&#xff0c;wx.login() 带着code去…