生成对抗网络

article/2025/9/24 17:53:02

论文阅读笔记,论文链接

Generative Adversarial Network 生成对抗网络 GAN 理解gan的原理

网络思想

  在GAN网络当中,有两个网络,一个是生成网络G,另外一个是判别网络D。生成网络G的目的是生成数据,这里的数据可以是图片等数据形式。鉴别网络的目的是鉴别输入的数据是真实的数据还是由我们的生成网络生成的数据。对于生成网络,其输入就是一个噪声,输出一个我们想要的逼真的数据(假如说数据是熊猫图像的话,那么输入一个噪声,输出的是熊猫图片,并且这个熊猫图片在我们的判别网络中判别不出来是生成的)。对于鉴别网络,其输入就是数据(真实的数据或者由生成网络生成的数据),输出的就是对这张图片的判别结果,是真实的数据还是由生成网络生成的数据。

  整个网络训练的流程就是,首先固定生成网络的参数(最开始生成网络的参数可以随机初始化),然后使用生成网络生成一堆数据,这堆数据我们将其标签为生成的数据(0为假,1为真)。接着将这堆生成的数据与原始数据混合在一起,去训练我们的鉴别网络。当此次训练完成之后,接着去训练我们的生成网络。我们可以想到,鉴别网络输出的是输入数据是真实数据的概率,那么对于鉴别网络而言,肯定是想让来自生成网络的数据经过鉴别网络,输出的概率越小越好。对于生成网络而言,它则是想要其输出的数据经过鉴别网络,输出的概率越大越好。那么,在训练生成网络的时候,就是最大化其输出结果在经过鉴别网络后的概率。那么这一轮鉴别网络与生成网络的训练就结束了,接着只需要循环上面的步骤即可(固定生成网络的参数,训练鉴别网络。固定鉴别网络的参数,训练生成网络)。

  如果上面的内容你听懂了,那么恭喜你,你已经明白了GAN网络的核心原理。如果你没有听懂,那么接下来举个栗子~

  假设你是一名学画画的学生,现在老师要求你们不用任何参考资料画出考拉🐨。你当时就懵逼了😕,这什么SB老师,不用任何参考资料画出考拉,关键这玩意儿我也没在现实中见过啊😢,算了硬着头皮上吧,要不然给挂科了就难受了。首先你画了10张考拉的画像(图个稳妥,这张不行用那张,不至于都不像),然后你拿到老师那里去交作业。这个老师也是个奇葩,他说他也没见过考拉,所以他打印了一些考拉的照片,然后把你画的图片拿过来一张一张看(这里假设你画的的图像与老师打印出来的图像除了内容上的不一样,其它方面都是一样的),然后他说你这画的是个啥,一点都不像考拉,回去重画,要不然给你0分。mmp,然后你没办法,你就回去重画了。不过接下来在画的过程中你不是一次性画10张图像然后再去找老师了,你现在是画一张,接着就问老师这张有多大的概率像真的考拉,老师给出了一个概率。接着你又画了一张,又去问老师,老师又给出了一个概率,你发现只要你某次画的考拉老师给出的概率比上一次你画的考拉老师给出的概率大,那么这一次考拉与上一次不同的部分,你就可以认为要是像真的考拉靠近,这一部分该这样画。在经过一定数量的询问之后,你心里知道考拉应该怎么画了,然后你拿着你新画出的考拉图像去老师那里,然后老师看你画的考拉与打印出来的考拉,在看的过程中,老师发现了一些东西,然后老师说,虽然这次有些进步,但是画的考拉与真实的考拉还是有不同,要想拿到满分,那就下去继续画吧。然后为了卷死同学,你下去又接着画了,同样重复上述的步骤,在经过n次之后,你心里想着,小样儿,看这次不拿个满分我倒立洗头。然后你拿着你新画的考拉去找老师,老师这个时候傻眼了,卧槽,毕加索再世啊。老师这个时候已经分不出你画的考拉与打印出来的考拉的区别了,于是你成功地拿到了100分,成为卷王。

  虽然我想举原文中的钞票栗子,不过想了想还是谨言慎行为好。在上面的栗子中,你就是生成网络,老师就是鉴别网络。你从最开始的不会画到最后能够画出老师都不能判断是打印出来的还是你画的。老师从最开始的不认识考拉,到最后能够鉴别出画的考拉和打印的考拉。在这个过程中你们相互促进,共同成就,双向奔赴😌~最开始你拿着10张考拉图像去找老师的过程就是固定生成网络参数,训练鉴别网络的过程。然后你每画一张就问一下老师这张像真的可能性有多大,这个过程就是固定鉴别网络参数,训练生成网络的过程(你的每一次询问就是在训练你自己,当概率增大的时候,你觉得你刚才这样画是对的,当概率减小的时候你认为刚才这样画不对)。而上述步骤重复直到最终连老师都不能分辨你画的是真的还是假的,这个时候双方都得到最大的提升。

目标(损失)函数

  在结束了上面的理解之后,我们现在理解一下原文中提出来的目标函数,如下图:

在这里插入图片描述

  在理解公式之前,我们先对公式里的几个符号做一个解释:

  • D(x):表示的是,对于鉴别网络,输入的是真实的数据x,输出的是该数据是真实数据的概率
  • G(Z):表示的是,对于生成网络,输入噪声Z,输出生成的数据
  • D(G(Z)):表示的是,对于鉴别网络,输入生成的数据,输出的是该数据是真实数据的概率
  • x ∼ P d a t a ( x ) x\sim P_{data}(x) xPdata(x):表示的是,真实数据服从的分布
  • z ∼ P z ( z ) z\sim P_{z}(z) zPz(z):表示的是,噪声数据服从的分布

  在理解了GAN的原理之后,我们再来看这个目标函数就会发现很容易理解了。对于里面的max,首先是固定生成网络的参数,将鉴别网络的参数当做我们需要训练的,所以max下面有个D,说明D里的是变量。接着固定鉴别网络的参数,将生成网络的参数当做我们需要训练的,所以min下面有个G,说明G里的是变量。上面的目标函数可以从下面这几个角度来解读:

  • 对于鉴别网络而言,我们希望最大化真实数据的概率,而最小化来自生成数据的概率,而最小化来自生成数据的概率相当于最小化 1 − D ( G ( z ) ) 1-D(G(z)) 1D(G(z))
  • 对于生成网络而言,我们希望最大化来自生成数据的概率,而最大化来自生成数据的概率相当于最小化 1 − D ( G ( Z ) ) 1-D(G(Z)) 1D(G(Z))

KL散度

  在信息论当中,我们用一件事情发生的概率的负对数表示信息量,如下面的公式(1)所示。也就是事情发生的概率越大,其包含的信息就越少。而一件事情发生的概率越小,那么其包含的信息就越大。
H ( x i ) = − log ⁡ p i (1) \begin{aligned} H(x_i) = -\log p_{i} \tag{1} \end{aligned} H(xi)=logpi(1)
  信源熵,也是平均自信息量,如公式(2)所示。其表示的是自信息量(也就是上面提到的信息量)的数学期望,表示为概率与其自信息量的乘积然后再求和。除此之外,还有一个交叉熵的概念,这个我们在深度学习中常常会用到,交叉熵其实就是对于一个分布p来说,我们用分布q来对分布p中的信息进行编码,所需要的信息量。所以我们可以对公式(2)进行改造,改造成公式(3)。如果交叉熵越小,说明用分布q来表示分布p所需要的信息量越小,这也就说明q分布接近p分布,如果这里还不能理解可以去看交叉熵与极大似然的关系,这里不做过多阐述。
H ( X ) = − ∑ i n p i log ⁡ p i (2) \begin{aligned} H(X) = -\sum_{i}^{n}p_i \log p_{i} \tag{2} \end{aligned} H(X)=inpilogpi(2)
H ( p , q ) = − ∑ i n p i log ⁡ q i (3) \begin{aligned} H(p,q) = -\sum_{i}^{n}p_i\log{q_i} \tag{3} \end{aligned} H(p,q)=inpilogqi(3)
  根据上面对交叉熵的理解,我们可以知道,交叉熵表示用分布q表示分布p所需要的平均信息量。而这里我们提出一个新的概念,叫做相对熵,也就是我们常说的KL散度,描述两个概率分布之间差异的非对称量。其定义就是用理论分布去拟合真实分布时产生的信息损耗。看完定义之后我想我们就能够推倒(推导)出相对熵的公式了,如公式(4)所示。对,没错,相对熵也就等于交叉熵,减去原始的平均信息量得到我们的信息损耗。从公式(4)(5)我们可以看出KL散度的不对称性,也即是 K L ( P ∣ ∣ Q ) ≠ K L ( Q ∣ ∣ P ) KL(P||Q) \neq KL(Q||P) KL(PQ)=KL(QP)
K L ( P ∣ ∣ Q ) = H ( P , Q ) − H ( P ) = ∑ i n p i log ⁡ p i − ∑ i n p i log ⁡ q i = − ∑ i n p i log ⁡ q i p i (4) \begin{aligned} KL(P||Q) = H(P,Q) - H(P) = \sum_{i}^{n}p_i\log p_i - \sum_{i}^{n}p_i\log q_i = -\sum_{i}^{n}p_i\log \frac{q_i}{p_i} \tag{4} \end{aligned} KL(PQ)=H(P,Q)H(P)=inpilogpiinpilogqi=inpilogpiqi(4)

K L ( Q ∣ ∣ P ) = − ∑ i n p i log ⁡ p i q i (5) \begin{aligned} KL(Q||P) = -\sum_{i}^{n}p_i\log \frac{p_i}{q_i} \tag{5} \end{aligned} KL(QP)=inpilogqipi(5)

JS散度

  由于KL散度的不对称性,所以这里引入了一个JS散度,也就是Jensen-Shannon散度,JS散度度量了两个概率分布的相似度,基于KL散度的变体,解决了KL散度非对称的问题,一般地,JS散度是对称的,其取值为[0,1]之间,定义如公式(6)所示。
J S ( P 1 ∣ ∣ P 2 ) = 1 2 K L ( P 1 ∣ ∣ P 1 + P 2 2 ) + 1 2 K L ( P 2 ∣ ∣ P 1 + P 2 2 ) (6) \begin{aligned} JS(P_1||P_2) = \frac{1}{2}KL(P_1||\frac{P_1+P_2}{2}) + \frac{1}{2}KL(P_2||\frac{P_1+P_2}{2}) \tag{6} \end{aligned} JS(P1P2)=21KL(P12P1+P2)+21KL(P22P1+P2)(6)

目标(损失)函数的证明

  在了解了上述问题之后,我们回到目标函数。作者提出,这个目标函数的全局最优,存在于生成的数据的概率分布等于真实数据的概率分布。接下来作者给出了数学证明,我们一起来解读一下。首先考虑对于给定的生成器参数,鉴别器什么时候最优。也就是min-max里的max。上面给出的式子是离散情况下的表示,现在我们使用连续情况下的式子表示。下面这个式子也很好理解,第一行就是讲min-max里的max写成积分形式,第二行则是做了一个替换,从 p z p_z pz p g p_g pg,其实在生成网络中,利用噪声数据来生成模拟数据,也就是用 p z p_z pz来生成 p g p_g pg,所以等价于第二个积分使用 p g p_g pg做一个替换。
V ( G , D ) = ∫ x p d a t a ( x ) log ⁡ ( D ( x ) ) d x + ∫ z p z ( z ) log ⁡ ( 1 − D ( g ( z ) ) ) d z = ∫ x p d a t a ( x ) log ⁡ ( D ( x ) ) + p g ( x ) log ⁡ ( 1 − D ( x ) ) d x \begin{aligned} & V(G,D) = \int_x p_{data}(x)\log(D(x))dx + \int_{z} p_z(z)\log(1-D(g(z)))dz\\ & = \int_x p_{data}(x)\log(D(x))+ p_g(x)\log(1-D(x))dx \end{aligned} V(G,D)=xpdata(x)log(D(x))dx+zpz(z)log(1D(g(z)))dz=xpdata(x)log(D(x))+pg(x)log(1D(x))dx
  那么对于上述的式子我们求解最大值,相当于求解 f ( x ) = a log ⁡ x + b log ⁡ ( 1 − x ) f(x) = a\log x+b\log (1-x) f(x)=alogx+blog(1x)的最大值,那么我们求导得 f ′ ( x ) = a x − b 1 − x = a ( 1 − x ) − b x x ( 1 − x ) = a − ( a + b ) x x ( 1 − x ) f'(x) = \frac{a}{x} -\frac{b}{1-x} = \frac{a(1-x)-bx}{x(1-x)} = \frac{a-(a+b)x}{x(1-x)} f(x)=xa1xb=x(1x)a(1x)bx=x(1x)a(a+b)x,我们很容易知道当 x = a a + b x = \frac{a}{a+b} x=a+ba的时候,该函数有最大值。那么对于上述的式子,取得最大值时,鉴别器的分布如下:
D G ∗ ( x ) = p d a t a ( x ) p d a t a ( x ) + p g ( x ) \begin{aligned} D^{*}_{G}(x) = \frac{p_{data}(x)}{p_{data}(x)+p_{g}(x)} \end{aligned} DG(x)=pdata(x)+pg(x)pdata(x)
  现在我们已经求出当生成器的参数固定的时候,鉴别器的最优解。那么现在我们固定鉴别器的参数,来求生成器参数的最优解。首先,将上述求得的值带入式子得。

在这里插入图片描述

  接着我们再把上面的式子改写成积分形式,如下。从(1)到(2)也就是对数里,分子分母同时乘以 1 2 \frac{1}{2} 21,从(2)到(3),也就是两个对数相加等于对数里的数相乘。从(3)到(4)也就是将积分写开。从(4)到(5)利用的是 p d a t a p_{data} pdata p g p_g pg的积分为1。从(5)到(6)其实就是套用JS散度公式。那么现在求这个函数的最小值,也就是求JS散度的最小值,而对于JS散度来说,当两个分布相同的时候,也就是 p d a t a = p g p_{data} = p_g pdata=pg,那么JS散度取得最小值0。至此,也就证明了该目标函数存在全局最优,也即是当真实的数据分布与生成的数据分布一致的时候达到最优。
∫ x p d a t a ( x ) log ⁡ p d a t a ( x ) p d a t a ( x ) + p g ( x ) d x + ∫ x p g ( x ) log ⁡ p g ( x ) p d a t a ( x ) + p g ( x ) d x (1) \begin{aligned} & \int_x p_{data}(x) \log {\frac{p_{data}(x)}{p_{data}(x)+p_g(x)}}dx + \int_x p_{g}(x)\log \frac{p_g(x)}{p_{data}(x)+p_g(x)}dx \tag{1} \\ \end{aligned} xpdata(x)logpdata(x)+pg(x)pdata(x)dx+xpg(x)logpdata(x)+pg(x)pg(x)dx(1)
= ∫ x p d a t a ( x ) log ⁡ 1 2 p d a t a ( x ) p d a t a ( x ) + p g ( x ) 2 d x + ∫ x p g ( x ) log ⁡ 1 2 p g ( x ) p d a t a ( x ) + p g ( x ) 2 d x (2) \begin{aligned} & = \int_x p_{data}(x) \log {\frac{\frac{1}{2}p_{data}(x)}{\frac{p_{data}(x)+p_g(x)}{2}}}dx + \int_x p_{g}(x)\log \frac{\frac{1}{2}p_g(x)}{\frac{p_{data}(x)+p_g(x)}{2}}dx \tag{2}\\ \end{aligned} =xpdata(x)log2pdata(x)+pg(x)21pdata(x)dx+xpg(x)log2pdata(x)+pg(x)21pg(x)dx(2)
= ∫ x p d a t a ( x ) ( log ⁡ 1 2 + log ⁡ p d a t a ( x ) p d a t a ( x ) + p g ( x ) 2 ) d x + ∫ x p g ( x ) ( log ⁡ 1 2 + log ⁡ p g ( x ) p d a t a ( x ) + p g ( x ) 2 ) d x (3) \begin{aligned} & = \int_x p_{data}(x) (\log \frac{1}{2}+ \log {\frac{p_{data}(x)}{\frac{p_{data}(x)+p_g(x)}{2}}})dx + \int_x p_{g}(x)(\log \frac{1}{2}+ \log {\frac{p_{g}(x)}{\frac{p_{data}(x)+p_g(x)}{2}}})dx\tag{3}\\ \end{aligned} =xpdata(x)(log21+log2pdata(x)+pg(x)pdata(x))dx+xpg(x)(log21+log2pdata(x)+pg(x)pg(x))dx(3)
= ∫ x p d a t a ( x ) log ⁡ 1 2 d x + ∫ x p d a t a ( x ) log ⁡ p d a t a ( x ) p d a t a ( x ) + p g ( x ) 2 d x + ∫ x p g ( x ) log ⁡ 1 2 d x + ∫ x p g ( x ) log ⁡ p g ( x ) p d a t a ( x ) + p g ( x ) 2 d x (4) \begin{aligned} & = \int_x p_{data}(x)\log \frac{1}{2}dx + \int_x p_{data}(x)\log \frac{p_{data}(x)}{\frac{p_{data}(x)+p_g(x)}{2}}dx + \int_x p_{g}(x)\log \frac{1}{2}dx + \int_x p_{g}(x)\log \frac{p_{g}(x)}{\frac{p_{data}(x)+p_g(x)}{2}}dx\tag{4}\\ \end{aligned} =xpdata(x)log21dx+xpdata(x)log2pdata(x)+pg(x)pdata(x)dx+xpg(x)log21dx+xpg(x)log2pdata(x)+pg(x)pg(x)dx(4)
= 2 log ⁡ 1 2 + 2 × [ 1 2 K L ( p d a t a ( x ) ∣ ∣ p d a t a ( x ) + p g ( x ) 2 ) ] + 2 × [ 1 2 K L ( p g ( x ) ∣ ∣ p d a t a ( x ) + p g ( x ) 2 ) ] (5) \begin{aligned} & = 2\log {\frac{1}{2}} + 2\times[\frac{1}{2}KL(p_{data}(x)||\frac{p_{data}(x)+p_g(x)}{2})]+2\times[\frac{1}{2}KL(p_{g}(x)||\frac{p_{data}(x)+p_g(x)}{2})]\tag{5}\\ \end{aligned} =2log21+2×[21KL(pdata(x)2pdata(x)+pg(x))]+2×[21KL(pg(x)2pdata(x)+pg(x))](5)
= − 2 log ⁡ 2 + 2 J S D ( p d a t a ∣ ∣ p g ( x ) ) (6) \begin{aligned} & = -2\log 2+2JSD(p_{data}||p_g(x))\tag{6} \end{aligned} =2log2+2JSD(pdatapg(x))(6)

参考资料

[1] 于风,2020.GAN原理[DB/OL].[2021.11.10].https://www.cnblogs.com/xiaohuiduan/p/13246139.html
[2] Raywit,2020.GAN讲解[DB/OL].[2021.11.10].https://blog.csdn.net/qq_40520596/article/details/1046506909.html
[3] hsinjhao,2019.KL散度介绍及详细公式推导[DB/OL].[2021.11.10].https://hsinjhao.github.io/2019/05/22/KL-DivergenceIntroduction/


http://chatgpt.dhexx.cn/article/BJcETdtM.shtml

相关文章

对抗生成网络GAN系列——CycleGAN简介及图片春冬变换案例

🍊作者简介:秃头小苏,致力于用最通俗的语言描述问题 🍊往期回顾:对抗生成网络GAN系列——GAN原理及手写数字生成小案例    对抗生成网络GAN系列——DCGAN简介及人脸图像生成案例 🍊近期目标:写…

MATLAB代码:对于对抗生成网络GAN的风光场景生成算法 关键词:场景生成 GAN 对抗生成网络 风光场景

MATLAB代码:对于对抗生成网络GAN的风光场景生成算法 关键词:场景生成 GAN 对抗生成网络 风光场景 仿真平台: pythontensorflow 主要内容:代码主要做的是基于数据驱动的风光新能源场景生成模型,具体为,通过构建了一种对…

对抗生成网络GAN系列——GAN原理及手写数字生成小案例

🍊作者简介:秃头小苏,致力于用最通俗的语言描述问题 🍊往期回顾:目标检测系列——开山之作RCNN原理详解    目标检测系列——Fast R-CNN原理详解   目标检测系列——Faster R-CNN原理详解 🍊近期目标&a…

GAN——对抗生成网络

GAN的基本思想 作为现在最火的深度学习模型之一,GAN全称对抗生成网络,顾名思义是生成模型的一种,而他的训练则是处于一种对抗博弈状态中的。它使用两个神经网络,将一个神经网络与另一个神经网络进行对抗。 基本思想:&…

一文读懂对抗生成网络的3种模型

https://www.toutiao.com/i6635851641293636109/ 2018-12-17 14:53:28 基于对抗生成网络技术的在线工具edges2cats, 可以为简笔画涂色 前言 在GAN系列课程中分别讲解了对抗生成网络的三种模型,从Goodfellow最初提出的原始的对抗生成网络,到…

对抗生成网络(GAN)详解

目录 前言 目标函数 原理 训练 给定生成器,训练判别器 给定判别器,训练生成器 总结 前言 之前的生成模型侧重于将分布函数构造出来,然后使用最大似然函数去更新这个分布函数的参数,从而优化分布函数,但是这种方法…

对抗生成网络(GAN)简介及生成数字实战

一、简介 生成对抗网络(Generative Adversarial Netword,简称GAN),是一种生成式机器学习模型,该方法由伊恩古德费洛等人于2014年提出,曾被称为“机器学习这二十年来最酷的想法”,可以用来创造虚…

对抗生成网络(Generative Adversarial Net)

好久没有更新博客了,但似乎我每次更新博客的时候都这么说(泪)。最近对生活有了一些新的体会,工作上面,新的环境总算是适应了,知道了如何摆正工作和生活之间的关系,如何能在有效率工作的同时还能…

【PaddleOCR-det-finetune】一:基于PPOCRv3的det检测模型finetune训练

文章目录 基本流程详细步骤打标签,构建自己的数据集下载PPOCRv3训练模型修改超参数,训练自己数据集启动训练导出模型 测试 相关参考手册在PaddleOCR项目工程中的位置: det模型训练和微调:PaddleOCR\doc\doc_ch\PPOCRv3_det_train.…

模型微调(Finetune)

参考:https://zhuanlan.zhihu.com/p/35890660 ppt下载地址:https://github.com/jiangzhubo/What-is-Fine-tuning 一.什么是模型微调 给定预训练模型(Pre_trained model),基于模型进行微调(Fine Tune)。相…

fine-tuning

微调(fine-tuning) 在平时的训练中,我们通常很难拿到大量的数据,并且由于大量的数据,如果一旦有调整,重新训练网络是十分复杂的,而且参数不好调整,数量也不够,所以我们可…

大模型的三大法宝:Finetune, Prompt Engineering, Reward

编者按:基于基础通用模型构建领域或企业特有模型是目前趋势。本文简明介绍了最大化挖掘语言模型潜力的三大法宝——Finetune, Prompt Engineering和RLHF——的基本概念,并指出了大模型微调面临的工具层面的挑战。 以下是译文,Enjoy! 作者 | B…

RCNN网络源码解读(Ⅲ) --- finetune训练过程

目录 0.回顾 1.finetune二分类代码解释(finetune.py) 1.1 load_data(定义获取数据的方法) 1.2 CustomFineTuneDataset类 1.3 custom_batch_sampler类( custom_batch_sampler.py) 1.4 训练train_mod…

FinSH

finSH介绍 FinSH 是 RT-Thread 的命令行组件,提供一套供用户在命令行调用的操作接口,主要用于调试或查看系统信息。它可以使用串口 / 以太网 / USB 等与 PC 机进行通信。 命令执行过程 功能: 支持鉴权,可在系统配置中选择打开/关闭。(TODO…

从统一视角看各类高效finetune方法

每天给你送来NLP技术干货! 来自:圆圆的算法笔记 随着预训练模型参数量越来越大,迁移学习的成本越来越高,parameter-efficient tuning成为一个热点研究方向。在以前我们在下游任务使用预训练大模型,一般需要finetune模型…

finetune

finetune的含义是获取预训练好的网络的部分结构和权重,与自己新增的网络部分一起训练。下面介绍几种finetune的方法。 完整代码:https://github.com/toyow/learn_tensorflow/tree/master/finetune 一,如何恢复预训练的网络 方法一&#xf…

11.2 模型finetune

一、Transform Learning 与 Model Finetune 二、pytorch中的Finetune 一、Transfer Learning 与 Model Finetune 1. 什么是Transfer Learning? 迁移学习是机器学习的一个分支,主要研究源域的知识如何应用到目标域当中。迁移学习是一个很大的概念。 怎么理解源域…

飞桨深度学习学院零基础深度学习7日入门-CV疫情特辑学习笔记(四)DAY03 车牌识别

本课分为理论和实战两个部分 理论:卷积神经网络 1.思考全连接神经网络的问题 一般来收机器学习模型实践分为三个步骤,(1)建立模型 (2)选择损失函数 (3)参数调整学习 1.1 模型结构不…

unity sdk(android)-友盟推送SDK接入

注意:一开始想接友盟Unity的SDk,但是导入后缺少各种jar,所以最后还是接了android的,demo文档齐全 官方文档:开发者中心 按照官方文档对接即可, 接入流程 1、项目中com.android.tools.build:gradle配置&…

友盟推送学习

一、首次使用U_Push 1、首先注册友盟账号,进入工作台,选择产品U_Push。 2、创建应用 3、在自己的项目中自动集成SDK 开发环境要求: Android Studio 3.0以上 Android minSdkVersion: 14 Cradle: 4.4以上 在根目录build.gradle中添加mav…