生成模型(一):GAN

news2024/11/26 19:25:40

在这里插入图片描述
生成对抗网络 (GAN)在许多生成任务中显示出很好的结果,以复制真实世界的丰富内容,例如图像、文字和语音。它受到博弈论的启发:一个生成器和一个判别器,在互相竞争的同时让彼此变得更强大。然而,训练 GAN 模型相当具有挑战性,因为人们面临训练不稳定或无法收敛等问题。

KL散度和JS Divergence
首先回顾一下用于量化两个概率分布之间相似性的两个指标。

KL (Kullback-Leibler) 散度衡量一个概率分布如何p偏离第二个预期概率分布q.
D K L ( p ∥ q ) = ∫ x p ( x ) log ⁡ p ( x ) q ( x ) d x D_{KL}(p \| q) = \int_x p(x) \log \frac{p(x)}{q(x)} dx DKL(pq)=xp(x)logq(x)p(x)dx

当 p(x) == q(x) 时,D_{KL}达到最小值。 根据公式,很明显KL散度是不对称的。在这种情况下p⁡(x)接近于零,但q⁡(x)明显不为零,则q的影响被忽略。当我们只想测量两个同样重要的分布之间的相似性时,它可能会导致错误的结果。

Jensen-Shannon Divergence是两个概率分布之间相似性的另一种度量,其界限为[0,1]. JS 散度是对称且更平滑。如果您有兴趣关于 KL 散度和 JS 散度之间的比较的信息,请查看这篇Quora 帖子。
D_{JS}(p | q) = \frac{1}{2} D_{KL}(p | \frac{p + q}{2}) + \frac{1}{2} D_{KL}(q | \frac{p + q}{2}) \
在这里插入图片描述

图 1. 给定两个高斯分布,p分布均值为0,标准差 1 ,q分布均值为1,标准差为1。两个分布的平均值标记为m=(p+q)/2. KL散度D_{K⁢L}是不对称的,但 JS散度D_J{⁢S}是对称的。

GAN 取得巨大成功的一个原因是将损失函数从传统最大似然方法中的不对称 KL 散度转换为对称 JS 散度。我们将在下一节中详细讨论这一点。

GAN
GAN 由两个模型组成:

判别器D估计给定样本来自真实数据集的概率。它作为一个分类器,并经过优化以区分假样本和真实样本。
生成器G在给定噪声变量输入的情况下输出合成样本z(z带来潜在的输出多样性)。它被训练来捕捉真实的数据分布,因此它的生成样本可以尽可能真实,或者换句话说,可以欺骗判别器以提供高概率。
这两个模型在训练过程中相互竞争:生成器G努力欺骗判别器,而判别模型D努力不被骗。两个模型之间的零和博弈促使二者进步。

p_{z} 噪声输入z上的数据分布 .
p_{g} 生成器在数据x上的分布 .
p_{r} 真实样本 x上的数据分布.
一方面,我们要确保判别器D对真实数据的估计 \mathbb{E}{x \sim p{r}(x)} [\log D(x)]是准确的. 同时,给定一个假样本 G(z), z \sim p_z(z), 判别器预计输出一个概率D(G(z)), 通过最大化 \mathbb{E}{z \sim p{z}(z)} [\log (1 - D(G(z)))]接近于零.

另一方面,对生成器进行训练以增加D产生高概率,从而最小化\mathbb{E}{z \sim p{z}(z)} [\log (1 - D(G(z)))].

将这两个方面结合在一起时,D和G正在玩一个极小极大游戏,我们应该优化以下损失函数:

\begin{aligned} \min_G \max_D L(D, G) & = \mathbb{E}{x \sim p{r}(x)} [\log D(x)] + \mathbb{E}{z \sim p_z(z)} [\log(1 - D(G(z)))] \ & = \mathbb{E}{x \sim p_{r}(x)} [\log D(x)] + \mathbb{E}_{x \sim p_g(x)} [\log(1 - D(x)] \end{aligned} \

(G在梯度下降更新期间\mathbb{E}{x \sim p{r}(x)} [\log D(x)] 没有影响.)

D的最优情况
现在我们有了一个定义明确的损失函数。让我们先来看看什么是zui y最优的D.

L(G, D) = \int_x \bigg( p_{r}(x) \log(D(x)) + p_g (x) \log(1 - D(x)) \bigg) dx \

因为我们感兴趣的最大话化L(G, D) 的最优D(x) ,

\tilde{x} = D(x), A=p_{r}(x), B=p_g(x) \

然后是积分里面的内容(我们可以放心地忽略积分,因为X对所有可能的值进行采样)是:

\begin{aligned} f(\tilde{x}) & = A log\tilde{x} + B log(1-\tilde{x}) \ \frac{d f(\tilde{x})}{d \tilde{x}} & = A \frac{1}{ln10} \frac{1}{\tilde{x}} - B \frac{1}{ln10} \frac{1}{1 - \tilde{x}} \ & = \frac{1}{ln10} (\frac{A}{\tilde{x}} - \frac{B}{1-\tilde{x}}) \ & = \frac{1}{ln10} \frac{A - (A + B)\tilde{x}}{\tilde{x} (1 - \tilde{x})} \ \end{aligned} \

因此,让 \frac{d f(\tilde{x})}{d \tilde{x}} = 0, 我们得到判别器的最佳值:D^(x) = \tilde{x}^ = \frac{A}{A + B} = \frac{p_{r}(x)}{p_{r}(x) + p_g(x)} \in [0, 1].

一旦生成器被训练到最佳状态, p_g 非常接近 p_{r}. 也就是说,当 p_g = p_{r}, D^*(x) 变成1/2.

什么是全局最优?
当两个G和D处于最佳值,我们有p_g = p_{r}和D^*(x) = 1/2损失函数变为:

\begin{aligned} L(G, D^) &= \int_x \bigg( p_{r}(x) \log(D^(x)) + p_g (x) \log(1 - D^*(x)) \bigg) dx \ &= \log \frac{1}{2} \int_x p_{r}(x) dx + \log \frac{1}{2} \int_x p_g(x) dx \ &= -2\log2 \end{aligned} \

损失函数代表什么?
根据之前的公式, p_{r} 和 p_g 的JS散度可以计算为:

\begin{aligned} D_{JS}(p_{r} | p_g) =& \frac{1}{2} D_{KL}(p_{r} || \frac{p_{r} + p_g}{2}) + \frac{1}{2} D_{KL}(p_{g} || \frac{p_{r} + p_g}{2}) \ =& \frac{1}{2} \bigg( \log2 + \int_x p_{r}(x) \log \frac{p_{r}(x)}{p_{r} + p_g(x)} dx \bigg) + \& \frac{1}{2} \bigg( \log2 + \int_x p_g(x) \log \frac{p_g(x)}{p_{r} + p_g(x)} dx \bigg) \ =& \frac{1}{2} \bigg( \log4 + L(G, D^*) \bigg) \end{aligned} \

因此,

L(G, D^*) = 2D_{JS}(p_{r} | p_g) - 2\log2 \

本质上,GAN 的损失函数量化了生成数据分布p_G和真实的样本分布p_r之间的相似性.

GAN 的问题
尽管 GAN 在图像生成方面取得了巨大成功,但训练并不容易;众所周知,该过程缓慢且不稳定。

难以达到纳什均衡(Nash equilibrium)
让我们看一个简单的例子,以更好地理解为什么在非合作博弈中很难找到纳什均衡。假设一名玩家控制 x 尽量减少 f_1(x) = xy, 而同时其他玩家不断更新 y 而同时其他玩家不断更新 f_2(y) = -xy.

因为 \frac{\partial f_1}{\partial x} = y , \frac{\partial f_2}{\partial y} = -x, 同一次迭代中我们用 x-\eta \cdot y 更新 x , 用y+ \eta \cdot x 更新y , 每一次x和y有不同的符号,每次梯度更新都会引起巨大的振荡,并且不稳定性会随着时间的推移而恶化,如图所示。

梯度消失
当判别器完美时,我们保证D(x) = 1, \forall x \in p_r 和 D(x) = 0, \forall x \in p_g. 因此损失函数大号下降到零,我们最终没有梯度来更新学习迭代期间的损失。下图展示了一个实验,当判别器变得更好时,梯度消失得很快。

因此,训练 GAN 面临两难境地:

如果判别器表现不佳,则生成器没有准确的反馈,损失函数无法代表现实。
如果判别器做得很好,损失函数的梯度下降到接近于零,学习变得超级慢甚至卡顿。 这种困境显然能够使 GAN 训练变得非常艰难。
模式崩溃
在训练期间,生成器可能会崩溃到它总是产生相同输出的设置。这是 GAN 的常见失败案例,通常称为Mode Collapse。即使生成器可能能够欺骗相应的判别器,它也无法学会表示复杂的现实世界数据分布,并且卡在了一个多样性极低的小空间中。

缺乏适当的评估指标

生成对抗网络缺少可以告知我们训练进度的函数。没有一个好的评估指标,就像在黑暗中工作。没有兆头告诉你什么时候停下来;同时也没有很好的指标来比较多个模型的性能。

改进的 GAN 训练
以下方法可以以帮助稳定和改进 GAN 的训练。前五种方法是实现 GAN 训练更快收敛的实用技术,在“Improve Techniques for Training GANs”中提出。最后两个是在“Towards principled methods for training generative adversarial networks”中提出的,以解决不相交分布的问题。

Feature Matching 特征匹配建议优化判别器以检查生成器的输出是否与真实样本的预期统计信息匹配。在这种情况下,新的损失函数定义为: | \mathbb{E}{x \sim p_r}f(x) - \mathbb{E}{z \sim p_z(z)}f(G(z)) |2^2 , f(x) 可以是特征统计的任何计算,例如均值或中值。
小批量判别 通过小批量判别,判别器能够学习一批训练数据点之间的关系,而不是独立处理每个点。
在一个小批量中,我们近似每对样本之间的接近度, c(x_i, x_j), 并通过总结它与同一批次中其他样本的接近程度来获得一个数据点的整体摘要, o(x_i) = \sum
{j} c(x_i, x_j). 然后将 o(x_i) 显式添加到模型的输入中。

历史平均
对于这两个模型,添加 | \Theta - \frac{1}{t} \sum_{i=1}^t \Theta_i |^2 进入损失函数,其中 \Theta 是模型参数, \Theta_i是过去时刻 i模型参数. 这会惩罚训练速度,避免 \Theta变化太剧烈 .

单面标签平滑 输入鉴别器时,不要提供 1 和 0 标签,而是使用软化值,例如 0.9 和 0.1。它被证明可以减少网络的脆弱性。
虚拟批量标准化(VBN)
每个数据样本都基于固定批次数据进行标准化,而不是在其小批次内。参考批次在开始时选择一次,并在整个训练过程中保持不变。

添加噪声p_r和p_G在高维空间中是不相交的,它会导致梯度消失的问题。为增加两个概率分布创造更高的重叠机会,一种解决方案是在判别器的输入上添加连续噪声D.
使用更好的分布相似度度量 vanilla GAN的损失函数测量了p_r和p_G分布之间的JS散度. 当两个分布不相交时,该指标无法提供有意义的值。 Wasserstein 度量被提出来代替 JS 散度,因为它具有更平滑的值空间。
Wasserstein GAN
什么是 Wasserstein 距离?
Wasserstein 距离是两个概率分布之间距离的度量。它也被称为Earth Mover 距离,因为非正式地它可以解释为将一堆泥土从一种概率分布的形状移动并转换为另一种分布的形状的最小能量成本。成本量化为:移动的泥土 x 移动距离。

让我们首先看一个离散概率的简单情况。例如,假设我们有两个分布P和Q,每人四堆土,一共十铲土。每个土堆中的铲子数量分配如下:

P_1 = 3, P_2 = 2, P_3 = 1, P_4 = 4\ Q_1 = 1, Q_2 = 2, Q_3 = 4, Q_4 = 3 \

为了将P改变为Q,如图 所示,我们:

第一步, 从P_1 移动两铲到 P_2 => (P_1, Q_1) 配对.
第二步, 从 P_2 移动两铲到 P_3 => (P_2, Q_2) 配对.
第三步,从 Q_3 移动一铲到 Q_4 => (P_3, Q_3) \ (P_4, Q_4) 配对.
如果我们标明 P_i 和 Q_i 的制造成本为 \delta_i, 有 \delta_{i+1} = \delta_i + P_i - Q_i :

\begin{aligned} \delta_0 &= 0\ \delta_1 &= 0 + 3 - 1 = 2\ \delta_2 &= 2 + 2 - 2 = 2\ \delta_3 &= 2 + 1 - 4 = -1\ \delta_4 &= -1 + 4 - 3 = 0 \end{aligned} \

最后,移动的距离是 W = \sum \vert \delta_i \vert = 5.

在处理连续概率域时,距离公式变为:

W(p_r, p_g) = \inf_{\gamma \sim \Pi(p_r, p_g)} \mathbb{E}_{(x, y) \sim \gamma}[| x-y |] \

在上面的公式中, \Pi(p_r, p_g) 是所有p_r 和p_g可能的联合概率分布的集合。一次联合分布\gamma \in \Pi(p_r, p_g) 描述了一种泥土运输计划。将 x 视为起点, y 看作为目的地, 移动的污垢总量为 γ(x,y) , 行驶距离为 |x−y| ,因此成本是γ(x,y)⋅|x−y|. 平均预期成本(x,y)可以很容易地计算为:

\sum_{x, y} \gamma(x, y) | x-y | = \mathbb{E}_{x, y \sim \gamma} | x-y | \

最后,我们将所有泥土移动解决方案的成本中的最小值作为 EM 距离。

为什么 Wasserstein 优于 JS 或 KL 散度?
即使两个分布位于没有重叠的低维流形中,Wasserstein 距离仍然可以提供有意义且平滑的中间距离表示。 WGAN 论文用一个简单的例子来说明这个想法。假设我们有两个概率分布,P & Q:

\forall (x, y) \in P, x = 0 \text{ and } y \sim U(0, 1)\ \forall (x, y) \in Q, x = \theta, 0 \leq \theta \leq 1 \text{ and } y \sim U(0, 1)\ \

当 \theta \neq 0时:

\begin{aligned} D_{KL}(P | Q) &= \sum_{x=0, y \sim U(0, 1)} 1 \cdot \log\frac{1}{0} = +\infty \ D_{KL}(Q | P) &= \sum_{x=\theta, y \sim U(0, 1)} 1 \cdot \log\frac{1}{0} = +\infty \ D_{JS}(P, Q) &= \frac{1}{2}(\sum_{x=0, y \sim U(0, 1)} 1 \cdot \log\frac{1}{1/2} + \sum_{x=0, y \sim U(0, 1)} 1 \cdot \log\frac{1}{1/2}) = \log 2\ W(P, Q) &= |\theta| \end{aligned} \

但当 θ=0 时, 两个分布完全重叠:

\begin{aligned} D_{KL}(P | Q) &= D_{KL}(Q | P) = D_{JS}(P, Q) = 0\ W(P, Q) &= 0 = \lvert \theta \rvert \end{aligned} \

当两个分布不相交时D_{KL} 为无穷大. D_{JS} 会有突然的跳跃,在 \theta = 0处不可导. 只有 Wasserstein 度量提供了平滑的度量,这对于使用梯度下降的稳定学习过程非常有帮助。

使用 Wasserstein 距离作为 GAN 损失函数
穷尽\Pi(p_r, p_g) 所有可能的联合分布计算 \inf_{\gamma \sim \Pi(p_r, p_g)}是很困难的. 因此,作者提出了基于 Kantorovich-Rubinstein 对偶的公式的智能转换:

W(p_r, p_g) = \frac{1}{K} \sup_{| f |L \leq K} \mathbb{E}{x \sim p_r}[f(x)] - \mathbb{E}_{x \sim p_g}[f(x)] \

\sup是 inf反面; 我们想要测量最小的上界,或者更简单地说,最大值。

**Lipschitz 连续性
函数 f 在新形式的 Wasserstein 度量中,要求满足| f |_L \leq K, 意味着它应该是K-Lipschitz 连续的。

实值函数 f: \mathbb{R} \rightarrow \mathbb{R} 被称作K-Lipschitz 连续,如果存在实常数K \geq 0,对所有 x_1, x_2 \in \mathbb{R}, 有

\lvert f(x_1) - f(x_2) \rvert \leq K \lvert x_1 - x_2 \rvert \

K 被称为函数 f(.)的 Lipschitz 常数。处处连续可微的函数是 Lipschitz 连续的, 因为导数估计为\frac{\lvert f(x_1) - f(x_2) \rvert}{\lvert x_1 - x_2 \rvert}, 是有界的。 然而,Lipschitz 连续函数可能并非处处可微,例如 f(x) = \lvert x \rvert.

解释如何在 Wasserstein 距离公式上发生转换本身就值得一长篇文章,所以我在这里跳过细节。如果您对如何使用线性规划计算 Wasserstein 度量,或者如何根据 Kantorovich-Rubinstein Duality 将 Wasserstein 度量转换为对偶形式感兴趣,请阅读这篇文章。

假设函数 f 来自一个 K-Lipschitz 连续函数族 { f_w }_{w \in W}。在修改后的 Wasserstein-GAN 中,“判别器”模型用于学习 w 找到一个好的 f_w ,并且损失函数被设置为测量 p_r 和 p_g之间的 Wasserstein 距离.

L(p_r, p_g) = W(p_r, p_g) = \max_{w \in W} \mathbb{E}{x \sim p_r}[f_w(x)] - \mathbb{E}{z \sim p_r(z)}[f_w(g_\theta(z))] \

因此,“判别器”不再直接将假样本与真实样本区分开来。相反,它被用来学习K-Lipschitz 连续函数,帮助计算 Wasserstein 距离。随着训练中损失函数的减小,Wasserstein 距离变小,生成器模型的输出越来越接近真实数据分布。

一个大问题是维护f_w 在训练期间的K-Lipschitz 连续性。该论文提出了一个简单但非常实用的技巧:在每次梯度更新后,将权重w设定到一个小窗口,例如[-0.01,0.01],导致紧凑的参数空间W, 因此F_w获得其下界和上界以保持 Lipschitz 连续性。

与原始 GAN 算法相比,WGAN 进行了以下更改:

在critic函数的每次梯度更新后,将权重限制在一个小的固定范围内,[-C,C].
使用从 Wasserstein 距离推导出的新损失函数,不再使用对数。“判别器”模型不作为判断者,而是作为估计真实数据分布和生成数据分布之间的 Wasserstein 度量的帮助者。
根据经验,作者建议在判别器上使用RMSProp优化器,而不是Adam这样可能导致模型训练不稳定的基于动量的优化器。
实验结果
作者设置了一个小实验来展示 GAN 和 WGAN 之间的区别。有两个一维高斯分布,蓝色代表真实,绿色代表虚假。将 GAN 判别器和 WGAN 判别器训练到最优,然后在空间上绘制它们的值。红色曲线是 GAN 判别器输出,青色曲线是 WGAN 判别器输出。

两者都可以识别哪个分布是真实的,哪个是假的,但是 GAN 鉴别器这样做的方式是使梯度在大部分空间中消失。相比之下,WGAN 中的权重在所有内容上都提供了相当不错的梯度。 在卧室数据集上的 DCGAN 基线相比,性能也差不多。上图:具有与 DCGAN 相同架构的 WGAN。底部:DCGAN

具有 DCGAN 架构的 DCGAN
如果我们从生成器中删除批范数,WGAN 仍然会生成好的样本,但 DCGAN 完全失败了

最后,使用前馈网络而不是卷积网络作为生成器。参数的数量保持不变,同时消除了卷积模型中的归纳偏差。WGAN 样本更详细,并且不会像标准 GAN 那样崩溃。事实上,他们报告说 WGAN 根本不会遇到模式崩溃!

具有 MLP 架构的 WGAN

具有 MLP 架构的 DCGAN
顶部:具有 MLP 架构的 WGAN。底部:相同架构的标准 GAN。

但是,Wasserstein GAN 并不完美。WGAN 仍然存在训练不稳定、权重裁剪后收敛缓慢(裁剪窗口太大)和梯度消失(裁剪窗口太小)等问题。

参考文献
[1] Goodfellow, Ian, et al. “Generative adversarial nets." NIPS, 2014.

[2] Tim Salimans, et al. “Improved techniques for training gans." NIPS 2016.

[3] Martin Arjovsky and Léon Bottou. “Towards principled methods for training generative adversarial networks." arXiv preprint arXiv:1701.04862 (2017).

[4] Martin Arjovsky, Soumith Chintala, and Léon Bottou. “Wasserstein GAN." arXiv preprint arXiv:1701.07875 (2017).

[5] Ishaan Gulrajani, Faruk Ahmed, Martin Arjovsky, Vincent Dumoulin, Aaron Courville. Improved training of wasserstein gans. arXiv preprint arXiv:1704.00028 (2017).

[6] Computing the Earth Mover’s Distance under Transformations

[7] Wasserstein GAN and the Kantorovich-Rubinstein Duality

[8] zhuanlan.zhihu.com/p/25071913

[9] Ferenc Huszár. “How (not) to Train your Generative Model: Scheduled Sampling, Likelihood, Adversary?." arXiv preprint arXiv:1511.05101 (2015).




参考资料:
生成模型(一):GAN

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一篇解析Linux paging_init

说明: Kernel版本:4.14ARM64处理器,Contex-A53,双核使用工具:Source Insight 3.5, Visio 1. 介绍 从详细讲解Linux物理内存初始化中,可知在paging_init调用之前,存放Kernel Image和…

java计算机毕业设计ssm幼儿英语学习平台的设计与实现yofnu(附源码、数据库)

java计算机毕业设计ssm幼儿英语学习平台的设计与实现yofnu(附源码、数据库) 项目运行 环境配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支…

注册微信小程序

文章目录1. 项目结构2. 页面组成3. json配置文件4. 认识页面5. WXML6. WXSS7. js文件8. 宿主环境9. 组件10. API11. 协同工作与发布跟公众号平台不共用一个账号,需要用其它邮箱另行注册,填写身份证信息(姓名、身份证号码)&#xf…

[附源码]Node.js计算机毕业设计电商后台管理系统Express

项目运行 环境配置: Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术: Express框架 Node.js Vue 等等组成,B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境:最好是Nodejs最新版,我…

我妈眼中我的房间

ONE This is Me in My room as a teenager according to My Mother. 在我老妈眼里,这就是十几岁待在房间里的我。 ✨ 评论区 1️⃣ It’s all true. 这都是真的。 2️⃣ As a father - yep that’s you. 作为一个父亲,没错就是你。 3️⃣ Looking…

基于C语言开发(控制台)通讯录管理程序【100010030】

通讯录程序设计 一、课程设计题目与要求 题目 :通讯录管理程序 1. 问题描述 ​ 编写一个简单的通讯录管理程序。通讯录记录有姓名,地址(省、市(县)、街道),电话号码,邮政编码等四项。 2. 基本要求 程序应提供的基本基本管理…

Biotin-PEG-Pyrene,Pyrene-PEG-Biotin,芘丁酸-PEG-生物素peg化芘衍生物

聚乙二醇化芘衍生物之Pyrene-PEG-Biotin(Biotin-PEG-Pyrene),其化学试剂的中文名为芘丁酸-聚乙二醇-生物素,此试剂可用于碳纳米管和石墨烯表面功能化。它所属分类为Biotin PEG Pyrene PEG。 peg试剂的分子量均可定制,…

机器学习实战教程(二):决策树基础篇

一、决策树 决策树是什么?决策树(decision tree)是一种基本的分类与回归方法。举个通俗易懂的例子,如下图所示的流程图就是一个决策树,长方形代表判断模块(decision block),椭圆形成代表终止模块(terminating block),表…

简单架构演变过程概图

单一应用就是一个jar包或者war包丢到tomcat等服务器上运行,耦合度很高,前后不分离,就是一整个应用 演变成 MVC是一个框架模式,它强制性的使应用程序的输入、处理和输出分开。使用MVC应用程序被分成三个核心部件:模型、视图、控制器。它们各自处理自己的任务。最典型的MVC就…

1567_AURIX_TC275_电源管理_待机模式

全部学习汇总: GreyZhang/g_TC275: happy hacking for TC275! (github.com) 进入待机模式前需要有序关闭各个模块以避免出现大的电流突变;之后,所有额度外设以及相关的中断全都关闭以避免异常唤醒;进入待机模式的过程中会有系统时…

JS中一个方法同时发送两个ajax请求出现报错问题的解决方法

目录 1、背景介绍 2、分析原因 3、解决办法 1、背景介绍 在实现前端显示后端数据时遇到这样一个问题:在js同一个方法中调用2个ajax,其中ajax1与ajax2之间没有联系,但是为了看效果需要同时请求数据显示,运行程序却报错,…

java计算机毕业设计ssm影城在线售票及票房数据分析系统8b9a0(附源码、数据库)

java计算机毕业设计ssm影城在线售票及票房数据分析系统8b9a0(附源码、数据库) 项目运行 环境配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都…

Simulink基础【1】-弹簧-阻尼模型的常微分方程求解

Simulink基础【1】-弹簧-阻尼模型的常微分方程求解0. Simulink模块是什么?能干什么?1. 弹簧阻尼模型简介1.1 受常力的弹簧阻尼模型1.2 动力学方程2. simulink模型构建2.1 Simulink基础模块使用2.2 结果可视化后记0. Simulink模块是什么?能干什…

基于微信小程序旅游管理系统-计算机毕业设计

项目介绍 随着互联网的趋势的到来,各行各业都在考虑利用互联网将自己的信息推广出去,最好方式就是建立自己的平台信息,并对其进行管理,随着现在智能手机的普及,人们对于智能手机里面的应用旅游服务软件也在不断的使用…

区块链溯源的应用四大领域

目前基于区块链溯源的应用案例可以分为4大领域:食药畜牧、知识产权、数字凭证和供应链。 1、在食药畜牧领域中,区块链溯源将全流程的关键业务数据上链,做到信息公开透明;将链上链下相结合,确保信息真实性和品质可控&a…

[1.2.0新功能系列:二] Apache Doris 1.2.0 JDBC外表 及 Mutil Catalog

JDBC 外表 JDBC External Table Of Doris 提供了Doris通过数据库访问的标准接口(JDBC)来访问外部表,外部表省去了繁琐的数据导入工作,也省去了之前ODBC繁杂的驱动安装部署及版本匹配问题,兼容性更好,操作更简单,让Dor…

【猿如意】如意如意随我心意快快显灵—markdown笔记来啦

文章目录「猿如意介绍」「猿如意安装」【基于Windows环境安装】「markdown笔记简介」「markdown笔记功能介绍」「markdown笔记通过猿如意下载安装步骤及说明」「markdown笔记使用感受」🎨猿如意官网:猿如意-程序员的如意兵器,工具代码,一搜就有 &#x1…

HbuilderX连接手机模拟器实战记录

下载HBuliderX 点击进入HBuilderX 的官网,建议下载开发版. 下载模拟器 这里使用逍遥模拟器,官方下载地址 HBuilder中配置逍遥模拟器 1.工具–设置–运行配置中添加逍遥模拟器安装目录以及端口号,默认端口号:21503 2.adb.exe配置环境变量 adb.exe一般在HbuilderX目录中&…

苹果电脑ntfs如何打开硬盘?苹果电脑读写ntfs

众所周知,在Mac电脑上面是不能够正常使用NTFS设备的,只能够读取上面的文件内容,但是想要进行删除、编辑、复制等操作是无法实现的,苹果电脑ntfs如何打开硬盘?在本文中,小编给大家介绍了两种让Mac正常使用NT…

C# 属性 索引

一 使用属性、索引的示例 1 使用属性button1.Text ① button1.Text“说你好”; 含义相当于button1.SetText(“说你好”); ② string sbutton1.Text; 2 使用属性string s“abcde” ① 求出长度:s.Length; 含义上相当于s.GetLength(); 3 使用索引 str…