文章目录

  • 简介
    • JS divergence来衡量分布的问题
    • What is the problem of JS divergence?
  • Least Square GAN (LSGAN)
  • Wasserstein GAN (WGAN): Earth Mover’s Distance
    • Why Earth Mover’s Distance?
    • WGAN
  • Improved WGAN (WGAN-GP)
  • Spectrum Norm
  • GAN to WGAN(如何将GAN的算法改为WGAN的算法)
    • Algorithm of GAN(Review)
    • Algorithm of WGAN
  • Energy-based GAN (EBGAN)
  • Outlook: Loss-sensitive GAN (LSGAN)
  • Reference

简介

Martin Arjovsky, Soumith Chintala, Leon Bottou, Wasserstein GAN, arXiv prepring, 2017
Ishaan Gulrajani, Faruk Ahmed,Martin Arjovsky, Vincent Dumoulin, Aaron Courville, “Improved Training of Wasserstein GANs”,arXiv prepring,2017
这节讲GAN的优化。
公式输入请参考:在线Latex公式

JS divergence来衡量分布的问题

JS divergence is not suitable. 原因在于:
In most cases, PGP_GPG​ and PdataP_{data}Pdata​ are not overlapped.
就是生成的数据和真实数据是不重叠的。不重叠有两方面的原因:
1、数据本身的问题The nature of data
Both PdataP_{data}Pdata​ and PGP_GPG​ are low-dim manifold in high-dim space.The overlap can be ignored.
例如:图片是高(三)维空间中的低(二)维空间的manifold。
如下图所示,可以看到两个曲线overlap的部分是很小的。

2、采样Sampling的原因
尽管数据本来是有overlap,但是我们不是取所有的数据:
Even though PdataP_{data}Pdata​ and PGP_GPG​ have overlap.

我们是对这两堆分布进行采样,我们不会采样全部,而是部分:

以上两个分布采样的结果是不会有overlap的,除非你采样超多点,因此这两个采样结果可以看做是两个不同的分布:

也就是说If you do not have enough sampling ……结果就是没有重合。
没有重合的时候,用JS divergence来衡量分布,会发生什么?

What is the problem of JS divergence?

只要两个分布不重合,那么算出来的结果都一样:log2log2log2
JS divergence is log2log2log2 if two distributions do not overlap

按理说PG1P_{G_1}PG1​​要比PG0P_{G_0}PG0​​好,因为它比PG0P_{G_0}PG0​​要更加接近PdataP_{data}Pdata​,JS divergence都一样,除非二者重合,两个才会有JS divergence=0。这样在不重合的状态下是没有办法做优化(train)的。
结果为什么会是:log2log2log2?
Intuition: If two distributions do not overlap, binary classifier achieves 100% accuracy.
用一个二分类的分类器对不重叠的两个分布做分类,总是可以得到100%的准确率,因此其cost都是一样的。
Same objective value is obtained. →Same divergence.
因此在GAN中用二分类来训练是很难收敛的。例如:
用绿色点代表真实数据
蓝色点代表生成数据
如果是一个sigmoid函数的话,可以看到蓝色点这块的梯度都是0,所以在GD的时候是不会更新(动)的。所以有人提出说,不要把这个分类函数训练得太好,使得整个分类函数在蓝色点部分有梯度,这样才可以进行梯度更新,但是这个训练得好不好(太用力,没梯度,不够用力,discriminator无法工作),很难把握。

因此为了做GAN的优化,出现了LSGAN

Least Square GAN (LSGAN)

算法思想就是用线性分类器替换sigmoid分类器。也就是把分类问题换成了回归问题。
Replace sigmoid with linear (replace classification with regression)

train的目标是使得真实数据越接近1越好,生成数据越接近0越好。

Wasserstein GAN (WGAN): Earth Mover’s Distance

Wasserstein中a发[æ]的音,思想就是不用JS divergence来衡量两个分布的差别,而是用另外一个方法:Earth Mover’s Distance。这个玩意的概念很土。。。
把P和Q看作是两堆土,而你是蓝翔毕业的挖掘机(Earth Mover)司机,要把P这堆土(原文是挖到Q那里,但是应该不是这个意思)挖成Q的形状,而Earth Mover’s Distance就是挖掘机来回移动的平均距离。
• Considering one distribution P as a pile of earth, and another distribution Q as the target
• The average distance the earth mover has to move the earth.

上面的分布是简化了的,土堆应该是这样:

要把P变成Q,可以有很多种挖法:

上图中的左边是是把邻近的土进行移动,右边是比较远的土进行移动。我们一般用左边的那种。
There many possible “moving plans”.
Using the “moving plan” with the smallest average distance to define the earth mover’s distance.
Best “moving plans” of this example

正式的定义:
A “moving plan” is a matrix. The value of the element is the amount of earth from one position to another.
Average distance of a plan γ\gammaγ:
B(γ)=∑xp,xqγ(xp,xq)∣∣xp−xq∣∣B(\gamma)=\sum_{x_p,x_q}\gamma(x_p,x_q)||x_p-x_q||B(γ)=xp​,xq​∑​γ(xp​,xq​)∣∣xp​−xq​∣∣
Earth Mover’s Distance:
W(P,Q)=minγ∈∏B(γ)W(P,Q)=\underset{\gamma\in\prod}{min}B(\gamma)W(P,Q)=γ∈∏min​B(γ)
这个矩阵中某个点(x,y)代表从行x移动多少土到列y,这个点的颜色越亮,那么代表移动的土越多。
行x所有点加起来,对应P中对应第x堆土;
列y所有点加起来,对应Q中对应第y堆土。
给定矩阵(确定移动方案后)γ\gammaγ,计算移动距离B(γ)B(\gamma)B(γ),如上面公式所示,然后穷举所有移动方案,找到最小那个。

也就是说这个方法要接一个优化方案后才能得到解。

Why Earth Mover’s Distance?

用Earth Mover’s Distance来替换JS divergence

那么也就改善了之前两个分布不重叠无法更新梯度的缺点:

可以看到d50比d0是有进步的,所以梯度才能不断更新迭代,最后到达两个分布距离为0的目标。

WGAN

如何用wasserstein distance来衡量两个分布,这个过程的证明比较复杂,直接给结论:
Evaluate wasserstein distance between PdataP_{data}Pdata​ and PGP_GPG​
V(G,D)=maxD∈1−Lipschitz{Ex∼Pdata[D(x)]−Ex∼PG[D(x)]}V(G,D)=\underset{D\in 1-Lipschitz}{max}\{E_{x\sim P_{data}}[D(x)]-E_{x\sim P_{G}}[D(x)]\}V(G,D)=D∈1−Lipschitzmax​{Ex∼Pdata​​[D(x)]−Ex∼PG​​[D(x)]}
公式的意思是:如果x是从PdataP_{data}Pdata​ 采样出来的,希望他的Discriminator值越大越好,如果是从PGP_GPG​采样出来的,希望他的Discriminator值越小越好,另外还有一个约束就是D要是一个1−Lipschitz1-Lipschitz1−Lipschitz的函数(啥意思后面讲,就是要D越平滑越好)
为什么要平滑呢,如果没有平滑的这个限制:

D就会在生成数据PdataP_{data}Pdata​的地方趋向于负无穷大,在真实数据PGP_GPG​的地方趋向于正无穷大。两个分布就会差很多。加入平滑限制,会使得D不会无限的上升和下降,会停在某个地方。


LipschitzFunctionLipschitz\space FunctionLipschitz Function
∣∣f(x1)−f(x2)∣∣≤K∣∣x1−x2∣∣||f(x_1)-f(x_2)||\leq K||x_1-x_2||∣∣f(x1​)−f(x2​)∣∣≤K∣∣x1​−x2​∣∣
可以看到公式左边是输出的变化,右边是输入的变化,也就是说输出的变化要小于K倍的输入的变化。
当K=1,我们就把这个满足这个不等式的函数称为1−Lipschitz1-Lipschitz1−Lipschitz
也就是
∣∣f(x1)−f(x2)∣∣≤∣∣x1−x2∣∣||f(x_1)-f(x_2)||\leq ||x_1-x_2||∣∣f(x1​)−f(x2​)∣∣≤∣∣x1​−x2​∣∣
也就是不会变化很快。例如下面的绿色函数比较像1−LipschitzFunction1-Lipschitz\space Function1−Lipschitz Function,蓝色函数就肯定不是1−LipschitzFunction1-Lipschitz\space Function1−Lipschitz Function


如何满足1−LipschitzFunction1-Lipschitz\space Function1−Lipschitz Function约束条件呢?原论文使用的方法是:Weight Clipping
Force the parameters www between ccc and −c-c−c. After parameter update,
if w > c, w = c;
if w < -c, w = -c
这个方法很简单,其实用这个方法弄出来的函数并不满足1−LipschitzFunction1-Lipschitz\space Function1−Lipschitz Function约束条件,但是基本能work,能达到使得D平滑的目的。也是没有办法的办法,因为1−LipschitzFunction1-Lipschitz\space Function1−Lipschitz Function不好优化。

Improved WGAN (WGAN-GP)

Weight Clipping进行改进,函数还是一样:
V(G,D)=maxD∈1−Lipschitz{Ex∼Pdata[D(x)]−Ex∼PG[D(x)]}V(G,D)=\underset{D\in 1-Lipschitz}{max}\{E_{x\sim P_{data}}[D(x)]-E_{x\sim P_{G}}[D(x)]\}V(G,D)=D∈1−Lipschitzmax​{Ex∼Pdata​​[D(x)]−Ex∼PG​​[D(x)]}
但是Improved WGAN对于约束换了一个角度,就是梯度的norm要小于等于1。
A differentiable function is 1-Lipschitz if and only if it has gradients with norm less than or equal to 1 everywhere.
这个转换和之前的约束是一样的。

关于norm的计算是有一个近似计算的方法的:
V(G,D)≈maxD{Ex∼Pdata[D(x)]−Ex∼PG[D(x)]−λ∫xmax(0,∣∣▽xD(x)∣∣−1)dx}V(G,D)\approx\underset{D}{max}\{E_{x\sim P_{data}}[D(x)]-E_{x\sim P_{G}}[D(x)]-\lambda\int_xmax(0,||\triangledown _xD(x)||-1)dx\}V(G,D)≈Dmax​{Ex∼Pdata​​[D(x)]−Ex∼PG​​[D(x)]−λ∫x​max(0,∣∣▽x​D(x)∣∣−1)dx}
后面这个积分项类似于正则项,它的作用是对所有的x做积分,然后取一个max,这个max的意思当Discriminator的梯度的norm大于1,那么就会存在正则项,如果Discriminator的梯度的norm小于1,那么这项为0,没有正则项(不惩罚)。但是这样会有问题,我们不可能对所有高维空间中的x都进行求积分这个操作,我们的x是sample出来的。因此再次把正则项进行近似:
−λEx∼Ppenalty[max(0,∣∣▽xD(x)∣∣−1)]-\lambda E_{x\sim P_{penalty}}[max(0,||\triangledown _xD(x)||-1)]−λEx∼Ppenalty​​[max(0,∣∣▽x​D(x)∣∣−1)]
这个正则项保证所有采样出来的x满足Discriminator的梯度的norm小于1
把这个惩罚项拿出来,做一个可视化,实际上这个penalty项就是从 PdataP_{data}Pdata​ 中随便取一点,然后从PGP_GPG​中随便取一点,然后在这两点的连线上进行采样,得到x∼penaltyx\sim penaltyx∼penalty

把这些sample到的x∼penaltyx\sim penaltyx∼penalty范围画出来就是上面的蓝色部分,为什么不是对整个空间中的x都做penalty呢?原文说实验结果表明这样做结果比较好。。。
“Given that enforcing the Lipschitz constraint everywhere is intractable, enforcing it only along these straight lines seems sufficient and experimentally results in good performance.”
从另外一个方面来看,PGP_GPG​要沿着梯度的方向向 PdataP_{data}Pdata​ 靠近,靠近移动的方向就是蓝色区域,其他区域也不会去,所以这样解释也可以。
Only give gradient constraint to the region between PdataP_{data}Pdata​ and PGP_GPG​ because they influence how PGP_GPG​ moves to PdataP_{data}Pdata​.
再来一个trick,之前说近似后的约束是希望梯度大于1就会有惩罚,小于1不会有惩罚(max(0,∣∣▽xD(x)∣∣−1)max(0,||\triangledown _xD(x)||-1)max(0,∣∣▽x​D(x)∣∣−1)这里。)但是在实作的时候,用的正则项为:(∣∣▽xD(x)∣∣−1)2(||\triangledown _xD(x)||-1)^2(∣∣▽x​D(x)∣∣−1)2,意思是希望梯度越接近1越好。原文:
“Simply penalizing overly large gradients also works in theory, but experimentally we found that this approach converged faster and to better optima.”
理由就是实作上效果好。。。
当然这个方法也有缺点,它的penalty的点是从两个分布中随机选点然后连接,然后做采样,如果有下图的两个分布明显这样做有问题:

选择红色那个点是不好的,(因为黄色的点移动也是移动到黑色点那个位置,也就是以黑色点为目标,而不是以红色点为目标。)应该选下图中黑色的点的连线来做采样比较合适。但是找黑色的点又比较麻烦。。。

后来又研究者对Improved WGAN提出Improved Improved WGAN算法,改进的地方在于把penalty放在了PdataP_{data}Pdata​的范围。

Spectrum Norm

上面讲的WGAN比较弱,一来都是用近似的方法搞的,解释不通就说反正实作就是这样;二来只有在某个区域Discriminator的norm才会满足小于1的条件。Spectrum Norm就直接,所有范围的x经过Discriminator后的norm都会满足小于1的条件。(不展开)
Spectral Normalization → Keep gradient norm smaller than 1 everywhere [Miyato, et al., ICLR, 2018]
下面是生成狗狗的DEMO,原文是动图。。。

GAN to WGAN(如何将GAN的算法改为WGAN的算法)

Algorithm of GAN(Review)

Initialize θd\theta_dθd​ for DDD and θg\theta_gθg​ for GGG.
• In each training iteration:


这块分割线内是训练Discriminator,重复k次,这里一定要训练到收敛为止,目的是找到maxDV(G,D)\underset{D}{\text{max}}V(G,D)Dmax​V(G,D)(实作的时候一般没有办法真的训练到收敛或者卡在局部最小点,因此这里找到的是maxDV(G,D)\underset{D}{\text{max}}V(G,D)Dmax​V(G,D)的lower bound)。
••Sample m examples {x1,x2,⋯,xm}\{x^1,x^2,\cdots,x^m\}{x1,x2,⋯,xm} from data distribution Pdata(x)P_{data}(x)Pdata​(x).(找到真实对象)
••Sample m noise examples {z1,z2,⋯,zm}\{z^1,z^2,\cdots,z^m\}{z1,z2,⋯,zm} from the prior Pprior(z)P_{prior}(z)Pprior​(z).(这个先验分布种类不是很重要)
•••Obtaining generated data {x~1,x~2,⋯,x~m},x~i=G(zi)\{\tilde x^1,\tilde x^2,\cdots,\tilde x^m\},\tilde x^i=G(z^i){x~1,x~2,⋯,x~m},x~i=G(zi).(找到生成对象)
•• Update discriminator parameters θd\theta_dθd​ to maximize
V~=1m∑i=1mlogD(xi)+1m∑i=1mlog(1−D(x~i))(1)\tilde V=\cfrac{1}{m}\sum_{i=1}^mlogD(x^i)+\cfrac{1}{m}\sum_{i=1}^mlog(1-D(\tilde x^i))\tag1V~=m1​i=1∑m​logD(xi)+m1​i=1∑m​log(1−D(x~i))(1)
θd←θd+η▽V~(θd)\theta_d\leftarrow\theta_d+\eta\triangledown\tilde V(\theta_d)θd​←θd​+η▽V~(θd​)



这块分割线内是训练Generator,重复1次,目的是减少JSD
••Sample another m noise samples {z1,z2,⋯,zm}\{z^1,z^2,\cdots,z^m\}{z1,z2,⋯,zm} from the prior Pprior(z)P_{prior}(z)Pprior​(z)
••Update generator parameters θg\theta_gθg​ to minimize
V~=1m∑i=1mlogD(xi)+1m∑i=1mlog(1−D(G(zi)))θg←θg−η▽V~(θg)\tilde V=\cfrac{1}{m}\sum_{i=1}^mlogD(x^i)+\cfrac{1}{m}\sum_{i=1}^mlog(1-D(G(z^i)))\\ \theta_g\leftarrow\theta_g-\eta\triangledown\tilde V(\theta_g)V~=m1​i=1∑m​logD(xi)+m1​i=1∑m​log(1−D(G(zi)))θg​←θg​−η▽V~(θg​)
由于1m∑i=1mlogD(xi)\cfrac{1}{m}\sum_{i=1}^mlogD(x^i)m1​∑i=1m​logD(xi)和GGG函数无关,所以在求最小值的时候可以忽略:
V~=1m∑i=1mlog(1−D(G(zi)))(2)\tilde V=\cfrac{1}{m}\sum_{i=1}^mlog(1-D(G(z^i)))\tag2V~=m1​i=1∑m​log(1−D(G(zi)))(2)
θg←θg−η▽V~(θg)\theta_g\leftarrow\theta_g-\eta\triangledown\tilde V(\theta_g)θg​←θg​−η▽V~(θg​)


Algorithm of WGAN

把原始GAN算法中的公式1和公式2进行修改,具体如下:
对于公式1(训练discriminator),实际上就是把sigmoid函数去掉,变成:
V~=1m∑i=1mD(xi)−1m∑i=1mD(x~i)(3)\tilde V=\cfrac{1}{m}\sum_{i=1}^mD(x^i)-\cfrac{1}{m}\sum_{i=1}^mD(\tilde x^i)\tag3V~=m1​i=1∑m​D(xi)−m1​i=1∑m​D(x~i)(3)
当然在训练discriminator的时候要注意使用Weight clipping /Gradient Penalty …等技巧,否则很难收敛。
对于公式2(训练generator),改为:
V~=−1m∑i=1mD(G(zi))\tilde V=-\cfrac{1}{m}\sum_{i=1}^mD(G(z^i))V~=−m1​i=1∑m​D(G(zi))

Energy-based GAN (EBGAN)

Junbo Zhao, et al., arXiv, 2016
这个算法还有一个变形,不展开,大概看看这个算法。
大概思想就是Generator不变,用autoencoder来做Discriminator。
Using an autoencoder as discriminator D.
计算过程如下图所示:

生成的图片进入粉色部分(Discriminator),先经过一个Autoencoder,还原后,计算出还原图像和原图的reconstruction error(上图中是0.1),然后乘上一个 -1,得到Discriminator的输出(上例中是-0.1)
所以从整体上来看Discriminator和之前的GAN的Discriminator一样,输入一个对象,得到这个对象和真实对象的差距,只不过是得到这个差距的方法不一样,之前是JS divergence,这里是Autoencoder。简单来说就是根据一个图片是否能够被reconstruction,如果能被还原得很好,说明这个图片是一个high quality的图片,反之亦然。
这个方法的好处就是Autoencoder是可以pretrain的,不需要negative example来训练,直接给它positive example来minimize reconstruction error即可。
➢Using the negative reconstruction error of auto-encoder to determine the goodness.
➢Benefit: The auto-encoder can be pre-train by real images without generator.
这样还有一个好处,原来的GAN刚开始训练的时候generator和discriminator都很弱,要不断迭代后discriminator才随着generator的变强而变强,这个方法discriminator不依赖generator,直接开局就很强。
EBGAN在训练的时候有一个trick,如果只是希望生成图片(蓝色)的分数,即reconstruction error越大越好(取负号后变小),那么会让autoencoder训练出来直接输出noise,因为Hard to reconstruct, easy to destroy,要得到低分很简单,只要输出noise,就会得到reconstruction error超级大(取负号后变小),这样训练出来的discriminator不是我们想要的。


因此我们会在训练的过程中为reconstruction error(取负号后)添加一个margin下限(超参数),让reconstruction error(取负号后)小到一定程度即可。

Outlook: Loss-sensitive GAN (LSGAN)

这个GAN也用到了margin的概念,之前的WGAN,Discriminator是希望真实数据得分越大越好,生成数据得分越小越好

但是有些生成数据已经比较真实了,没有必要要搞得很小。例如:下图中的x′′x''x′′比较接近真实数据xxx,即Δ(x,x′′)\Delta(x,x'')Δ(x,x′′)比较小,x′x'x′没有那么接近真实数据xxx,即Δ(x,x′)\Delta(x,x')Δ(x,x′)比较大,可以看到Δ(x,x′)\Delta(x,x')Δ(x,x′)的margin压得比较小,而Δ(x,x′′)\Delta(x,x'')Δ(x,x′′)的margin比较大。

Reference

• Ian J. Goodfellow, Jean Pouget-Abadie, Mehdi Mirza, Bing Xu, David WardeFarley, Sherjil Ozair, Aaron Courville, Yoshua Bengio, Generative Adversarial Networks, NIPS, 2014
• Sebastian Nowozin, Botond Cseke, Ryota Tomioka, “f-GAN: Training Generative Neural Samplers using Variational Divergence Minimization”, NIPS, 2016
• Martin Arjovsky, Soumith Chintala, Léon Bottou, Wasserstein GAN, arXiv, 2017
• Ishaan Gulrajani, Faruk Ahmed, Martin Arjovsky, Vincent Dumoulin, Aaron Courville, Improved Training of Wasserstein GANs, NIPS, 2017
• Junbo Zhao, Michael Mathieu, Yann LeCun, Energy-based Generative Adversarial Network, arXiv, 2016
• Mario Lucic, Karol Kurach, Marcin Michalski, Sylvain Gelly, Olivier Bousquet, “Are GANs Created Equal? A Large-Scale Study”, arXiv, 2017
• Tim Salimans, Ian Goodfellow, Wojciech Zaremba, Vicki Cheung, Alec Radford, Xi Chen Improved Techniques for Training GANs, NIPS, 2016
• Martin Heusel, Hubert Ramsauer, Thomas Unterthiner, Bernhard Nessler, Sepp Hochreiter, GANs Trained by a Two Time-Scale Update Rule Converge to a Local Nash Equilibrium, NIPS, 2017
• Naveen Kodali, Jacob Abernethy, James Hays, Zsolt Kira, “On Convergence and Stability of GANs”, arXiv, 2017
• Xiang Wei, Boqing Gong, Zixia Liu, Wei Lu, Liqiang Wang, Improving the Improved Training of Wasserstein GANs: A Consistency Term and Its Dual Effect, ICLR, 2018
• Takeru Miyato, Toshiki Kataoka, Masanori Koyama, Yuichi Yoshida, Spectral Normalization for Generative Adversarial Networks, ICLR, 2018

李宏毅学习笔记35.GAN.06.Tips for Improving GAN相关推荐

  1. 机器学习李宏毅学习笔记35

    文章目录 前言 一.Meta learning 1.第一步 2.第二步 3.第三步 二.machine learning 和 meta learning区别 总结 前言 Meta learning元学 ...

  2. 影像组学视频学习笔记(35)-基于2D超声影像的影像组学特征提取、Li‘s have a solution and plan.

    作者:北欧森林 链接:https://www.jianshu.com/p/f82d30289d68 来源:简书,已获转载授权 RadiomicsWorld.com "影像组学世界" ...

  3. c语言编程实例解析精粹,C语言实例解析精粹学习笔记——35(报数游戏)

    实例35: 设由n个人站成一圈,分别被编号1,2,3,4,--,n.第一个人从1开始报数,每报数位m的人被从圈中推测,其后的人再次从1开始报数,重复上述过程,直至所有人都从圈中退出. 实例解析: 用链 ...

  4. [原创]java WEB学习笔记35:java WEB 中关于绝对路径 和相对路径问题

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  5. 狄利克雷卷积_算法学习笔记(35): 狄利克雷卷积

    这篇笔记完全是数学内容,但它是之后一些算法的基础. 所谓狄利克雷卷积,是定义在数论函数( 的函数)间的一种二元运算,可这样定义: 也常常等价地写作: 为了之后讨论方便,先定义一些常用的数论函数的符号: ...

  6. [单片机学习笔记](35):串级PID算法应用剖析、通过串口控制电机、MPU6050获取平衡车姿态、自制平衡车PID算法程序设计

    串级PID算法应用剖析 这是经过给队友讲解串级PID的程序的之后的进一步的理解总结. 内环的实际值,取决于你能测出什么值给内环.而内环的输入就是内环误差 内环的输出值,是内环误差(内环目标值-内环实际 ...

  7. vue3小兔鲜商城项目学习笔记+资料分享06

    建议大家先去看我第一篇小兔鲜的文章,强烈建议,非常建议,十分建议,从头开始看更完整. 最近正在学习vue3小兔鲜 下面是学习笔记 购物车模块 购物车功能分析 [外链图片转存失败,源站可能有防盗链机制, ...

  8. 李宏毅学习笔记40.GAN.番外篇

    文章目录 简介 Recap Self-attention GAN(SAGAN) Self-attention Spectral normalization (SN) Two-Timescale Upd ...

  9. 李宏毅学习笔记38.GAN.09.Improving Sequence Generation by GAN

    文章目录 简介 Conditional Sequence Generation 原始seq2seq模型回顾 RL (human feedback) Policy Gradient warning of ...

最新文章

  1. java 装配_java – 无法自动装配方法
  2. 计算机ui答辩,KGUT1027 班级UI设计第一阶段成长答辩开始啦
  3. CSS书写技巧(转)
  4. Hadoop 之父:普通程序员到顶级公司 CTO 的进阶之路
  5. APP元素获取信息操作API
  6. SAP UI5 确保控件 id 全局唯一的实现方法
  7. VSS 请求程序和 SharePoint 2013
  8. hdu-5867 Water problem(水题)
  9. Android Studio下载安装及配置图文教程
  10. FRR BGP协议分析13 -- ZEBRA路由的处理2
  11. Windows安装WSL详解
  12. 机器视觉培训教程-镜头的基本知识
  13. 通过路由器设置,不用IPTV盒子,局域网内、局域网外任意设备随时随地观看网络电视直播
  14. 帆软报表多数据集关联合并操作
  15. 提供一个中国身份证号码判断的类
  16. auto.js B0013 查找父控件子控件进入阅读文章视频学习每日答题2021-10-03
  17. 一文教你如何使用Mybatis Plugin 以及Druid Filer 改写SQL
  18. Java实现多附件的邮件发送
  19. d610网络计算机,尼康D610,10年来我见过的真心值得买的全幅单反
  20. HDU 1002 A+BII大数

热门文章

  1. 【年终总结】——梦想起航
  2. 美国参议员建议立法“黑掉国土安全部”
  3. java飞机游戏开发_java飞机小游戏制作
  4. dd fdisk mount相关命令的总结
  5. 安装SSL证书的网站被谷歌提升排名权重
  6. 如何用本地连接共享无线网络连接
  7. 【STC8G2K64S4】比较器介绍以及比较器掉电检测示例程序
  8. CDN加速全站配置教程
  9. Python+VSCode+Git【转】
  10. java生成excel表格