当前位置: 首页 > news >正文

山西做网站的公司有哪些wordpress导入文件格式

山西做网站的公司有哪些,wordpress导入文件格式,微信公众平台申请注册入口,wordpress+技术类模板下载#前言 对理论没兴趣的直接看代码吧#xff0c;理论一堆#xff0c;而且还有点复杂#xff0c;我自己的描述也不一定准确#xff0c;但是代码就两三句话搞定了。 国际惯例#xff0c;参考博文 论文#xff1a;Tutorial on Variational Autoencoders 【干货】一文读懂…#前言 对理论没兴趣的直接看代码吧理论一堆而且还有点复杂我自己的描述也不一定准确但是代码就两三句话搞定了。 国际惯例参考博文 论文Tutorial on Variational Autoencoders 【干货】一文读懂什么是变分自编码器 CS598LAZ - Variational Autoencoders MusicVAE: Creating a palette for musical scores with machine learning 【Learning Notes】变分自编码器Variational Auto-EncoderVAE 花式解释AutoEncoder与VAE #理论 ##基础知识 似然函数(引自百度百科) 似然函数是关于统计模型中的参数的函数表示模型参数的似然性。在给定输出xxx时关于参数θ\thetaθ的似然函数L(θ∣x)L(\theta|x)L(θ∣x)在数值上等于给定参数θ\thetaθ后变量XXX的概率 L(θ∣x)P(Xx∣θ)L(\theta|x)P(Xx|\theta) L(θ∣x)P(Xx∣θ) 有两个比较有趣的说法来区分概率与似然的关系比如抛硬币的例子 概率说法对于“一枚正反对称的硬币上抛十次”这种事件问硬币落地时十次都是正面向上的“概率”是多少似然说法对于“一枚硬币上抛十次”问这枚硬币正反面对称的“似然”程度是多少。 极大似然估计 (摘自西瓜书)两大学派 频率主义学参数是固定的通过优化似然函数来确定参数贝叶斯学派参数是变化的且本身具有某种分布先假设参数服从某个先验分布然后基于观测到的数据来计算参数的后验分布 极大似然估计(Maximum Likelihood Estimation,MLE)源自频率主义学。 假设DDD是第ccc类样本的集合比如所有的数字333的图片集合假设它们是独立同分布的则参数θ\thetaθ对于数据集DDD的似然是 P(D∣θ)∏x∈DP(x∣θ)P(D|\theta)\prod_{x\in D}P(x|\theta) P(D∣θ)x∈D∏​P(x∣θ) 极大似然估计就是寻找一个θ\thetaθ使得样本xxx出现的概率最大 但是上面的连乘比较难算这就出现了对数似然 L(θ)log⁡P(D∣θ)∑x∈Dlog⁡P(x∣D)L(\theta)\log P(D|\theta)\sum_{x\in D}\log P(x|D) L(θ)logP(D∣θ)x∈D∑​logP(x∣D) 我们的目标就是求参数θ\thetaθ的极大似然估计θ^\hat{\theta}θ^ θ^arg⁡max⁡θL(θ)\hat{\theta}\arg \max_{\theta}L(\theta) θ^argθmax​L(θ) 例子在连续属性情况下如果样本集合概率密度函数p(x∣c)∼N(μ,σ2)p(x|c)\sim N(\mu,\sigma^2)p(x∣c)∼N(μ,σ2)那么参数μ,σ2\mu,\sigma^2μ,σ2的极大似然估计就是 μ^1∣D∣∑x∈Dxσ^21∣D∣∑x∈D(x−μ^)(x−μ^)T\begin{aligned} \hat{\mu}amp;\frac{1}{|D|}\sum_{x\in D}x\\ \hat{\sigma}^2amp;\frac{1}{|D|}\sum_{x \in D}(x-\hat{\mu})(x-\hat{\mu})^T \end{aligned} μ^​σ^2​∣D∣1​x∈D∑​x∣D∣1​x∈D∑​(x−μ^​)(x−μ^​)T​ 其实就是计算均值和方差了。这样想这些样本就服从这个高斯分布那么把高斯分布直接当做参数一定能够大概率得到此类样本也就是说用333的样本所服从的高斯分布作为模型参数一定能使333出现的概率P(x∣θ)P(x|\theta)P(x∣θ)最大。 ###期望值最大化算法(EM) 这一部分简单说一下即可详细的在我前面的博客HMM——前向后向算法中有介绍主要有两步 E步求Q函数Q(θ,θ(i))Q(\theta,\theta^{(i)})Q(θ,θ(i)),这个θ(i)\theta^{(i)}θ(i)就是当前迭代次数iii对应的参数值Q函数实际就是对数联合似然函数log⁡P(X,Z∣θ)\log P(X,Z|\theta)logP(X,Z∣θ)在分布P(Z∣X,θ(i))P(Z|X,\theta^{(i)})P(Z∣X,θ(i))下的期望 Q(θ,θ(i))EZ∣X,θ(i)L(θ∣X,Z)Ez[log⁡P(X,Z∣θ)∣X,θ(i)]∑ZP(Z∣X,θ(i))log⁡P(X,Z∣θ)\begin{aligned} Q(\theta,\theta^{(i)})amp;E_{Z|X,\theta^{(i)}}L(\theta|X,Z)\\ amp;E_z\left[\log P(X,Z|\theta)|X,\theta^{(i)}\right]\\ amp;\sum_Z P(Z|X,\theta^{(i)})\log P(X,Z|\theta) \end{aligned} Q(θ,θ(i))​EZ∣X,θ(i)​L(θ∣X,Z)Ez​[logP(X,Z∣θ)∣X,θ(i)]Z∑​P(Z∣X,θ(i))logP(X,Z∣θ)​ M步求使得Q函数最大化的参数θ​\theta​θ​并将其作为下一步的θ(i)​\theta^{(i)}​θ(i)​ θ(i1)arg⁡max⁡θQ(θ,θ(i))\theta^{(i1)}\arg\max_\theta Q(\theta,\theta^{(i)}) θ(i1)argθmax​Q(θ,θ(i)) 从西瓜书上再摘点主要内容过来 有时候样本的一些属性可以观测到而另一些属性观测不到所以就定义未观测变量为隐变量设XXX为可观测变量ZZZ为隐变量θ\thetaθ为模型参数则可写出对数似然 L(θ∣X,Z)ln⁡P(X,Z∣θ)L(\theta|X,Z)\ln P(X,Z|\theta) L(θ∣X,Z)lnP(X,Z∣θ) 但是ZZZ又不知道所以采用边缘化(marginal)方法消除它 L(θ∣X)ln⁡P(X∣θ)ln⁡∑ZP(X,Z∣θ)∑i1Nln⁡{∑ZP(xi,Z∣θ)}L(\theta|X)\ln P(X|\theta)\ln\sum_Z P(X,Z|\theta)\sum_{i1}^N\ln\left\{\sum_Z P(x_i,Z|\theta)\right\} L(θ∣X)lnP(X∣θ)lnZ∑​P(X,Z∣θ)i1∑N​ln{Z∑​P(xi​,Z∣θ)} 使用EM算法求解参数的方法是 基于θ(i)\theta^{(i)}θ(i)推断隐变量ZZZ的期望记为ZtZ^tZt基于已观测变量XXX和ZtZ^tZt对参数θ\thetaθ做极大似然估计求得θ(i1)\theta^{(i1)}θ(i1) 【注】是不是感觉很像坐标下降法 变分推断 (摘自西瓜书) 变分推断是通过使用已知简单分布来逼近需推断的复杂分布并通过限制近似分布的类型从而得到一种局部最优但具有确定解的近似后验分布。 继续看上面的EM算法的M步我们得到了 θ(i1)arg⁡max⁡θQ(θ,θ(i))arg⁡max⁡θ∑ZP(Z∣x,θ(i))ln⁡P(x,Z∣θ)\begin{aligned} \theta^{(i1)}amp;\arg\max_\theta Q(\theta,\theta^{(i)})\\ amp;\arg\max_\theta \sum_ZP\left(Z|x,\theta^{(i)}\right)\ln P(x,Z|\theta) \end{aligned} θ(i1)​argθmax​Q(θ,θ(i))argθmax​Z∑​P(Z∣x,θ(i))lnP(x,Z∣θ)​ 还记得QQQ函数的意义吧对数联合似然函数ln⁡P(X,Z∣θ)\ln P(X,Z|\theta)lnP(X,Z∣θ)在分布P(Z∣X,θ(i))P(Z|X,\theta^{(i)})P(Z∣X,θ(i))下的期望。当分布P(Z∣X,θ(i))P(Z|X,\theta^{(i)})P(Z∣X,θ(i))与变量ZZZ的真实后验分布相等的时候QQQ函数就近似于对数似然函数因而EM算法能够获得稳定的参数θ\thetaθ且隐变量ZZZ的分布也能通过该参数获得。 但是通常情况下P(Z∣X,θ(i))P(Z|X,\theta^{(i)})P(Z∣X,θ(i))只是隐变量ZZZ所服从的真实分布的近似若用Q(Z)Q(Z)Q(Z)表示则 ln⁡P(X)L(Q)KL(Q∣∣P)\ln P(X)L(Q)KL(Q||P) lnP(X)L(Q)KL(Q∣∣P) 其中 L(Q)∫Q(Z)ln⁡{P(X,Z)Q(Z)}dZKL(Q∣∣P)−∫Q(Z)ln⁡P(Z∣X)Q(Z)dZL(Q)\int Q(Z)\ln\left\{\frac{P(X,Z)}{Q(Z)}\right\}dZ\\ KL(Q||P)-\int Q(Z)\ln \frac{P(Z|X)}{Q(Z)}dZ L(Q)∫Q(Z)ln{Q(Z)P(X,Z)​}dZKL(Q∣∣P)−∫Q(Z)lnQ(Z)P(Z∣X)​dZ 但是这个ZZZ模型可能很复杂导致E步的P(Z∣X,θ)P(Z|X,\theta)P(Z∣X,θ)比较难推断这时候就借用变分推断了假设ZZZ服从分布 Q(Z)∏i1MQi(Zi)Q(Z)\prod_{i1}^MQ_i(Z_i) Q(Z)i1∏M​Qi​(Zi​) 也就是说多变量ZZZ可拆解为一系列相互独立的多变量ZiZ_iZi​可以另QiQ_iQi​是非常简单的分布。 【PS】浅尝辄止了经过层层理论已经引出了变分自编码的主要思想变分推断使用简单分布逼近复杂分布实际上变分自编码所使用的简单分布就是高斯分布用多个高斯分布来逼近隐变量随后利用服从这些分布的隐变量重构我们想要的数据。 变分自编码 先看优化目标ELBO(Evidence Lower Bound) ELBOlog⁡p(x)−KL[q(z∣x)∣∣p(z∣x)]ELBO\log p(x)-KL\left[q(z|x)||p(z|x)\right] ELBOlogp(x)−KL[q(z∣x)∣∣p(z∣x)] 其中qqq是假设分布ppp是真实分布我们希望最大化第一项而最小化KL距离所以整个规则就是最大化ELBOELBOELBO但是这里面有个p(z∣x)p(z|x)p(z∣x)代表隐变量的真实分布这个是无法求解的所以需要简化 简化结果是 log⁡p(x)−KL(q(z)∣∣p(z∣x))Ez∼q[log⁡P(x∣z)]−KL(q(z)∣∣p(z))\log p(x)-KL(q(z)||p(z|x))E_{z\sim q}\left[\log P(x|z)\right]-KL(q(z)||p(z)) logp(x)−KL(q(z)∣∣p(z∣x))Ez∼q​[logP(x∣z)]−KL(q(z)∣∣p(z)) 证明 假设KL距离为KL(q(z)∣∣p(z∣x))Ez∼q[log⁡q(z)−log⁡p(z∣x)]KL(q(z)||p(z|x))E_{z\sim q}\left[\log q(z)-\log p(z|x)\right]KL(q(z)∣∣p(z∣x))Ez∼q​[logq(z)−logp(z∣x)] 那么直接使用贝叶斯准则: p(z∣x)p(x∣z)p(z)p(x)p(z|x)\frac{p(x|z)p(z)}{p(x)}p(z∣x)p(x)p(x∣z)p(z)​log⁡p(z∣x)log⁡p(x∣z)log⁡p(z)−log⁡p(x)\log p(z|x)\log p(x|z)\log p(z)-\log p(x)logp(z∣x)logp(x∣z)logp(z)−logp(x)p(x)p(x)p(x)不依赖于z 可以得到 KL(q(z)∣∣p(z∣x))Ez∼q(log⁡q(z)−log⁡p(x∣z)−log⁡p(z))log⁡p(x)KL(q(z)||p(z|x))E_{z\sim q}(\log q(z)-\log p(x|z)-\log p(z))\log p(x) KL(q(z)∣∣p(z∣x))Ez∼q​(logq(z)−logp(x∣z)−logp(z))logp(x) 其中Ez∼q(log⁡q(z)−log⁡p(z))KL(q(z)∣∣p(z))E_{z\sim q}(\log q(z)-\log p(z))KL(q(z)||p(z))Ez∼q​(logq(z)−logp(z))KL(q(z)∣∣p(z)) 所以就能继续简化那个KL(q(z)∣∣p(z∣x))KL(q(z)||p(z|x))KL(q(z)∣∣p(z∣x))了 log⁡p(x)−KL(q(z)∣p(z∣x))Ez∼q[log⁡p(x∣z)]−KL(q(z)∣∣p(z))\log p(x)-KL(q(z)|p(z|x))E_{z\sim q}[\log p(x|z)]-KL(q(z)||p(z)) logp(x)−KL(q(z)∣p(z∣x))Ez∼q​[logp(x∣z)]−KL(q(z)∣∣p(z)) 证毕 但是我们的优化目标是 ELBOlog⁡p(x)−KL[q(z∣x)∣∣p(z∣x)]ELBO\log p(x)-KL\left[q(z|x)||p(z|x)\right] ELBOlogp(x)−KL[q(z∣x)∣∣p(z∣x)] 发现一个是q(z)q(z)q(z)一个是q(z∣x)q(z|x)q(z∣x)怎么办呢看论文第8页有这样一句话 Note that X is fixed, and Q can be any distribution, not just a distribution which does a good job mapping X to the z’s that can produce X. Since we’re interested in inferring P(X), it makes sense to construct a Q which does depend on X, and in particular, one which makes D [Q(z)k|P(z|X)] small 翻译一下意思就是XXX是固定的(因为它是样本集)Q也可是任意分布并非仅是能够生成XXX的分布因为我们想推断P(X)P(X)P(X)那么构建一个依赖于XXX的QQQ分布是可行的还能让KL(Q(z)∣∣P(z∣X))KL(Q(z)||P(z|X))KL(Q(z)∣∣P(z∣X))较小 log⁡p(x)−KL(q(z∣x)∣p(z∣x))Ez∼q[log⁡p(x∣z)]−KL(q(z∣x)∣∣p(z))\log p(x)-KL(q(z|x)|p(z|x))E_{z\sim q}[\log p(x|z)]-KL(q(z|x)||p(z)) logp(x)−KL(q(z∣x)∣p(z∣x))Ez∼q​[logp(x∣z)]−KL(q(z∣x)∣∣p(z)) 这个式子就是变分自编码的核心了 这样我们就知道了优化目标(等号右边的时候)我们看看变换后的式子为什么能够计算 首先没了p(z∣x)p(z|x)p(z∣x)其次每一项都能计算我们挨个来看 如何计算q(z∣x)q(z|x)q(z∣x) 我们可以使用神经网络逼近q(z∣x)q(z|x)q(z∣x)假设q(z∣x)q(z|x)q(z∣x)服从高斯分布N(μ,σ)N(\mu,\sigma)N(μ,σ) 神经网络的输出就是均值μ\muμ和方差σ\sigmaσ输入是图片输出是分布 计算q(z∣x)q(z|x)q(z∣x)就是编码过程了 如果计算p(x∣z)用一个神经网络去逼近p(x|z) 用一个神经网络去逼近p(x∣z)用一个神经网络去逼近p(x|z)假设神经网络输出是假设神经网络输出是假设神经网络输出是f(z)$ 假设p(x∣z)p(x|z)p(x∣z)服从另一种高斯分布 xf(z)ηxf(z)\etaxf(z)η其中η∼N(0,I)\eta\sim N(0,I)η∼N(0,I)简化成l2l_2l2​损失∣∣X−f(z)∣∣2||X-f(z)||^2∣∣X−f(z)∣∣2 计算p(x∣z)p(x|z)p(x∣z)就是解码过程了 最终损失就是 L∣∣X−f(z)∣∣2−λ⋅KL(q(z∣x)∣∣p(z))L||X-f(z)||^2-\lambda\cdot KL(q(z|x)||p(z)) L∣∣X−f(z)∣∣2−λ⋅KL(q(z∣x)∣∣p(z)) 在这里我们先不看这个最终损失的式子我们去瞅瞅未经过l2l_2l2​简化的的优化目标 ELBOEz∼q[log⁡p(x∣z)]−KL(q(z∣x)∣∣p(z))ELBOE_{z\sim q}[\log p(x|z)]-KL(q(z|x)||p(z)) ELBOEz∼q​[logp(x∣z)]−KL(q(z∣x)∣∣p(z)) 计算第二项的KL散度 我们经常选择q(z∣x)N(z∣μ(x;θ),Σ(x;θ))q(z|x)N(z|\mu(x;\theta),\Sigma(x;\theta))q(z∣x)N(z∣μ(x;θ),Σ(x;θ))这里面μ,Σ\mu,\Sigmaμ,Σ通常是任意确定的函数且其参数θ\thetaθ能够从数据中学习。通常通过神经网络获取并且Σ\SigmaΣ被限制为一个对角阵。这样选择的好处是便于计算仅此而已那么右边的KL(q(z∣x)∣∣p(z))KL(q(z|x)||p(z))KL(q(z∣x)∣∣p(z))就编程了两个多元高斯分布的KL距离有闭式解为 D(N(μ0,Σ0)∣∣N(μ1,Σ1))12(tr(Σ1−1Σ0)(μ1−μ0)TΣ1−1(μ1−μ0)−klog⁡(det⁡Σ1det⁡Σ0)D(N(\mu_0,\Sigma_0)||N(\mu_1,\Sigma_1))\\ \frac{1}{2}\left(tr(\Sigma^{-1}_1\Sigma_0\right)(\mu_1-\mu_0)^T\Sigma_1^{-1}(\mu_1-\mu_0)-k\log(\frac{\det \Sigma_1}{\det \Sigma_0}) D(N(μ0​,Σ0​)∣∣N(μ1​,Σ1​))21​(tr(Σ1−1​Σ0​)(μ1​−μ0​)TΣ1−1​(μ1​−μ0​)−klog(detΣ0​detΣ1​​) 其中kkk是分布的维数而在变分推断中经常又被简化成 D(N(μ(x),Σ(x))∣∣N(0,I))12(tr(Σ(x))(μ(x))T(μ(x))−klog⁡det⁡(Σ(x))D(N(\mu(x),\Sigma(x))||N(0,I))\\ \frac{1}{2}\left(tr(\Sigma(x)\right)(\mu(x))^T(\mu(x))-k\log\det(\Sigma(x)) D(N(μ(x),Σ(x))∣∣N(0,I))21​(tr(Σ(x))(μ(x))T(μ(x))−klogdet(Σ(x)) 计算第一项Ez∼qE_{z\sim q}Ez∼q​ 论文中说这一项的计算有点小技巧(tricky)本来是可以通过采样的方法估计Ez∼q(log⁡p(x∣z))E_{z\sim q}(\log p(x|z))Ez∼q​(logp(x∣z))但是只有将很多的zzz通过fff式子(解码部分)输出以后才能得到较好的估计结果这个计算量很大因此想到了随机梯度下降我们可以拿一个样本zzz将p(x∣z)p(x|z)p(x∣z)作为Ez∼q(log⁡p(x∣z))E_{z\sim q}(\log p(x|z))Ez∼q​(logp(x∣z))的估计所以式子又变成了 Ex∼D(log⁡p(x)−KL(q(z∣x)∣∣p(z∣x)))Ex∼D[Ez∼q[log⁡p(x∣z)]]−KL(q(z∣x)∣∣p(z))E_{x\sim D}(\log p(x)-KL(q(z|x)||p(z|x)))\\ E_{x\sim D}\left[E_{z\sim q}\left[\log p(x|z)\right]\right]-KL(q(z|x)||p(z)) Ex∼D​(logp(x)−KL(q(z∣x)∣∣p(z∣x)))Ex∼D​[Ez∼q​[logp(x∣z)]]−KL(q(z∣x)∣∣p(z)) 意思就是我们从样本集合DDD中取一个样本xxx来计算所以对于单个可以计算下式梯度 log⁡p(x∣z)−KL(q(z∣x)∣∣p(z))\log p(x|z)-KL(q(z|x)||p(z)) logp(x∣z)−KL(q(z∣x)∣∣p(z)) 这样消除了Ez∼qE_{z\sim q}Ez∼q​中对qqq的依赖。 论文中有个图很好 其实log⁡p(x∣z)−KL(q(z∣x)∣∣p(z))\log p(x|z)-KL(q(z|x)||p(z))logp(x∣z)−KL(q(z∣x)∣∣p(z))刚好就是左图主要就是反传的时候没法计算梯度看左图红框部分这一部分是随机采样是无法计算梯度的那么文中就说了一个技巧重新参数化(reparameterization trick)给定了μ(x),Σ(x)\mu(x),\Sigma(x)μ(x),Σ(x)也就是Q(z∣x)Q(z|x)Q(z∣x)的均值和方差我们先从N(0,I)N(0,I)N(0,I)中采样然后计算zμ(x)Σ12∗ϵz\mu(x)\Sigma^{\frac{1}{2}}*\epsilonzμ(x)Σ21​∗ϵ所以我们又可以计算下式的梯度了 Ex∼D[Eϵ∼N(0,I)[log⁡p(x∣zμ(x)Σ1/2(x)∗ϵ)]−KL(q(z∣x)∣∣p(z))]E_{x\sim D}\left[E_{\epsilon\sim N(0,I)}\left[\log p(x|z\mu(x)\Sigma^{1/2}(x)*\epsilon)\right]-KL(q(z|x)||p(z)) \right] Ex∼D​[Eϵ∼N(0,I)​[logp(x∣zμ(x)Σ1/2(x)∗ϵ)]−KL(q(z∣x)∣∣p(z))] 这就完成了从左图到右图的转变。 代码实现-模型训练及保存 理论很复杂但是我们看着右图就能实现无需看理论理论只是让我们知道为什么会有右图这种网络结构。按照标准流程来书写代码 读数据初始化相关参数定义数据接收接口以便测试使用初始化权重和偏置定义基本模块编码器、采样器、解码器构建模型定义预测函数、损失函数、优化器训练 整个代码很简单我就只贴部分重点的 初始化权重偏置 #初始化权重、偏置 def glorot_init(shape):return tf.random_normal(shapeshape,stddev1./tf.sqrt(shape[0]/2.0)) #权重 weights{encoder_h1:tf.Variable(glorot_init([num_input,hidden_dim])),z_mean:tf.Variable(glorot_init([hidden_dim,latent_dim])),z_std:tf.Variable(glorot_init([hidden_dim,latent_dim])),decoder_h1:tf.Variable(glorot_init([latent_dim,hidden_dim])),decoder_out:tf.Variable(glorot_init([hidden_dim,num_input])) } #偏置 biases{encoder_b1:tf.Variable(glorot_init([hidden_dim])),z_mean:tf.Variable(glorot_init([latent_dim])),z_std:tf.Variable(glorot_init([latent_dim])),decoder_b1:tf.Variable(glorot_init([hidden_dim])),decoder_out:tf.Variable(glorot_init([num_input])) }注意这里使用了另一种初始化方法说是Xavier初始化方法因为直接使用上一篇博客的方法 tf.Variable(tf.random_normal([num_input,num_hidden1])),训练时候一直给我弹出loss:nan我也是醉了以后还是用之前学theano时候采用的fan_in-fan_out方法初始化权重算了。 定义基本模块 注意需要定义编码器、采样器、解码器 #定义编码器 def encoder(x):encodertf.matmul(x,weights[encoder_h1])biases[encoder_b1]encodertf.nn.tanh(encoder)z_meantf.matmul(encoder,weights[z_mean])biases[z_mean]z_stdtf.matmul(encoder,weights[z_std])biases[z_std]return z_mean,z_std#定义采样器 def sampler(z_mean,z_std):epstf.random_normal(tf.shape(z_std),dtypetf.float32,mean0,stddev1.0,nameepsilon)zz_meantf.exp(z_std/2)*epsreturn z#定义解码器 def decoder(x):decodertf.matmul(x,weights[decoder_h1])biases[decoder_b1]decodertf.nn.tanh(decoder)decodertf.matmul(decoder,weights[decoder_out])biases[decoder_out]decodertf.nn.sigmoid(decoder)return decoder构建模型 #构建模型 [z_mean,z_std]encoder(X)#计算均值方差 sample_latentsampler(z_mean,z_std)#采样隐空间 decoder_opdecoder(sample_latent)#重构输出预测函数和损失 #预测函数 y_preddecoder_op y_trueX tf.add_to_collection(recon,y_pred) #定义损失函数和优化器 def vae_loss(x_reconstructed,x_true,z_mean,zstd):#重构损失encode_decode_lossx_true*tf.log(1e-10x_reconstructed)\(1-x_true)*tf.log(1e-101-x_reconstructed)encode_decode_loss-tf.reduce_sum(encode_decode_loss,1)#KL损失kl_div_loss1z_std-tf.square(z_mean)-tf.exp(z_std)kl_div_loss-0.5*tf.reduce_sum(kl_div_loss,1)return tf.reduce_mean(encode_decode_losskl_div_loss) loss_opvae_loss(decoder_op,y_true,z_mean,z_std) optimizertf.train.RMSPropOptimizer(learning_ratelearning_rate) train_opoptimizer.minimize(loss_op)注意这里损失的第一项类似于交叉熵损失y×log⁡(y^)(1−y)×(1−log⁡y^)y\times \log(\hat{y})(1-y)\times(1-\log \hat y)y×log(y^​)(1−y)×(1−logy^​) 关于交叉熵损失和均方差损失的区别可以看我前面的博客损失函数梯度对比-均方差和交叉熵 训练和保存模型 #参数初始化 inittf.global_variables_initializer() input_image,input_labelread_images(./mnist/train_labels.txt,batch_size) #训练和保存模型 savertf.train.Saver() with tf.Session() as sess:sess.run(init)coordtf.train.Coordinator()tf.train.start_queue_runners(sesssess,coordcoord)for step in range(1,num_steps):batch_x,batch_ysess.run([input_image,tf.one_hot(input_label,1,0)])sess.run(train_op,feed_dict{X:batch_x})if step%disp_step0 or step1:losssess.run(loss_op,feed_dict{X:batch_x})print(step str(step) ,loss {:.4f}.format(loss))coord.request_stop()coord.join()print(optimization finished)saver.save(sess,./VAE_mnist_model/VAE_mnist)常规的保存方法没什么说的训练日志 step 1 ,loss 616.3002 step 1000 ,loss 169.6044 step 2000 ,loss 163.5006 step 3000 ,loss 166.1648 step 4000 ,loss 161.2366 step 5000 ,loss 155.1714 step 6000 ,loss 153.2840 step 7000 ,loss 161.5571 step 8000 ,loss 152.0021 step 9000 ,loss 159.5550 step 10000 ,loss 154.6315 step 11000 ,loss 153.8298 step 12000 ,loss 141.5825 step 13000 ,loss 149.7792 step 14000 ,loss 150.9575 step 15000 ,loss 151.2249 step 16000 ,loss 159.3878 step 17000 ,loss 148.7136 step 18000 ,loss 148.5801 step 19000 ,loss 150.6678 step 20000 ,loss 146.3471 step 21000 ,loss 156.4142 step 22000 ,loss 148.7607 step 23000 ,loss 145.4101 step 24000 ,loss 153.3523 step 25000 ,loss 157.8997 step 26000 ,loss 136.9668 step 27000 ,loss 155.7835 step 28000 ,loss 137.7291 step 29000 ,loss 153.1723 optimization finished【很尴尬的事情】偷偷说一句上面保存错东东了别打我但是也不必重新训练看接下来的蛇皮操作。 #代码实现-模型加载及测试 老样子先载入模型 sesstf.Session() new_savertf.train.import_meta_graph(./VAE_mnist_model/VAE_mnist.meta) new_saver.restore(sess,./VAE_mnist_model/VAE_mnist)获取计算图 graphtf.get_default_graph()看看保存了啥 print (graph.get_all_collection_keys()) #[queue_runners, recon, summaries, train_op, trainable_variables, variables]准备调用recon函数重构数据。 等等“重构”搞错了这里应该是依据噪声来生成数据的不是输入一个数据然后重构它这是AE的做法我们在VAE中应该称之为生成了然而不幸的是我们保存的recon函数接收的是图片输入无法指定decoder部分所需的分布参数也就是均值方差怎么办手动选择性载入模型这篇博客有介绍怎么在测试阶段定义网络权重和载入训练好的权重但是我好像没成功懒得试了按照我自己的想法来做。 眼尖的童鞋会发现我们之前一直只关注recon函数了忽视了其它keys很快发现最后两个trainable_variables和variables貌似与我们想要的模型参数有关我们来输出一下这两个东东里面都保存了啥 第一个trainable_variables for i in tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES):print(i)输出 tf.Variable Variable:0 shape(784, 512) dtypefloat32_ref tf.Variable Variable_1:0 shape(512, 2) dtypefloat32_ref tf.Variable Variable_2:0 shape(512, 2) dtypefloat32_ref tf.Variable Variable_3:0 shape(2, 512) dtypefloat32_ref tf.Variable Variable_4:0 shape(512, 784) dtypefloat32_ref tf.Variable Variable_5:0 shape(512,) dtypefloat32_ref tf.Variable Variable_6:0 shape(2,) dtypefloat32_ref tf.Variable Variable_7:0 shape(2,) dtypefloat32_ref tf.Variable Variable_8:0 shape(512,) dtypefloat32_ref tf.Variable Variable_9:0 shape(784,) dtypefloat32_ref第二个GLOBAL_VARIABLES for i in tf.get_collection(tf.GraphKeys.GLOBAL_VARIABLES):print(i)tf.Variable Variable:0 shape(784, 512) dtypefloat32_ref tf.Variable Variable_1:0 shape(512, 2) dtypefloat32_ref tf.Variable Variable_2:0 shape(512, 2) dtypefloat32_ref tf.Variable Variable_3:0 shape(2, 512) dtypefloat32_ref tf.Variable Variable_4:0 shape(512, 784) dtypefloat32_ref tf.Variable Variable_5:0 shape(512,) dtypefloat32_ref tf.Variable Variable_6:0 shape(2,) dtypefloat32_ref tf.Variable Variable_7:0 shape(2,) dtypefloat32_ref tf.Variable Variable_8:0 shape(512,) dtypefloat32_ref tf.Variable Variable_9:0 shape(784,) dtypefloat32_ref tf.Variable Variable/RMSProp:0 shape(784, 512) dtypefloat32_ref tf.Variable Variable/RMSProp_1:0 shape(784, 512) dtypefloat32_ref tf.Variable Variable_1/RMSProp:0 shape(512, 2) dtypefloat32_ref tf.Variable Variable_1/RMSProp_1:0 shape(512, 2) dtypefloat32_ref tf.Variable Variable_2/RMSProp:0 shape(512, 2) dtypefloat32_ref tf.Variable Variable_2/RMSProp_1:0 shape(512, 2) dtypefloat32_ref tf.Variable Variable_3/RMSProp:0 shape(2, 512) dtypefloat32_ref tf.Variable Variable_3/RMSProp_1:0 shape(2, 512) dtypefloat32_ref tf.Variable Variable_4/RMSProp:0 shape(512, 784) dtypefloat32_ref tf.Variable Variable_4/RMSProp_1:0 shape(512, 784) dtypefloat32_ref tf.Variable Variable_5/RMSProp:0 shape(512,) dtypefloat32_ref tf.Variable Variable_5/RMSProp_1:0 shape(512,) dtypefloat32_ref tf.Variable Variable_6/RMSProp:0 shape(2,) dtypefloat32_ref tf.Variable Variable_6/RMSProp_1:0 shape(2,) dtypefloat32_ref tf.Variable Variable_7/RMSProp:0 shape(2,) dtypefloat32_ref tf.Variable Variable_7/RMSProp_1:0 shape(2,) dtypefloat32_ref tf.Variable Variable_8/RMSProp:0 shape(512,) dtypefloat32_ref tf.Variable Variable_8/RMSProp_1:0 shape(512,) dtypefloat32_ref tf.Variable Variable_9/RMSProp:0 shape(784,) dtypefloat32_ref tf.Variable Variable_9/RMSProp_1:0 shape(784,) dtypefloat32_ref很容易发现我们只需要从可训练的参数集中获取权重还记得之前说过的么我们啥都往sess.run中丢试试看看能不能取出来值 asess.run(graph.get_collection(trainable_variables)) for i in a:print(i.shape)(784, 512) (512, 2) (512, 2) (2, 512) (512, 784) (512,) (2,) (2,) (512,) (784,)可以看出参数可以从a中通过索引取出来了。 接下来简单重新定义一下模型的decoder计算 latent_dim2 noise_inputtf.placeholder(tf.float32,shape[None,latent_dim]) decodertf.matmul(noise_input,a[3])a[8] decodertf.nn.tanh(decoder) decodertf.matmul(decoder,a[4])a[9] decodertf.nn.sigmoid(decoder)然后就可以尝试丢进去一个均值和方差去预测了 generatesess.run(decoder,feed_dict{noise_input:[[3,3]]})可视化 generategenerate*255.0 gen_imggenerate.reshape(28,28) plt.imshow(gen_img) plt.show()效果还不错再测试几个丢[0,0][0,0][0,0]试试 丢[0,5][0,5][0,5]试试 好了不玩了随机性太大了我都不知道啥噪声能输出啥数字只有输出的时候才知道。 后记 好玩是好玩但是我不知道哪个数字对应哪种噪声输入还是有点郁闷下一篇我们就去看看有名的搞基网GAN 本文训练代码链接https://pan.baidu.com/s/19QSNfT7fgWrU68CV7lXSZA 密码6c7l 本文测试代码链接https://pan.baidu.com/s/1CAxPGnmCTg-OT8TqnXQdVw 密码tmep
http://www.zqtcl.cn/news/834760/

相关文章:

  • 北京市昌平建设工程招标网站网站建设要学哪些软件有哪些方面
  • 部队内网网站建设方案诱导视频网站怎么做
  • 安徽省美好乡村建设网站郑州网站建设 论坛
  • 手机网站怎么建设软件外包公司绩效考核内容
  • 北京最大的火车站网站免费推广方式
  • 外贸网站建设系统工程公司名称大全
  • 手机视频网站建站吴江区经济开发区建设工程网站
  • 网站建设存在哪些问题学校网站手机站的建设
  • 婚恋网站设计手机免费制作网站模板
  • 北京网站建设与维护公司网络组建方案设计
  • 自己做网站好还是凡科樱花动漫做网站
  • 自己做外贸开通什么网站wordpress万能主题
  • 网站建设中添加图片链接cad线下培训班
  • 网站建站系统程序长宁区网站建设网站制
  • 合肥网站建设合肥做网站wordpress 关于页面
  • 软件开发公司赚钱吗北京网站优化解决方案
  • 泰安的网站建设公司哪家好国外ps网站
  • 网站建设制作方案做字典网站开发
  • 安徽道遂建设工程有限公司网站汽车之家网页
  • 仙居网站建设贴吧马鞍山钢铁建设集团有限公司网站
  • 编写网站 语言微网站开发语言
  • 深圳网站建设优化网站建设与维护培训
  • 张家港网站开发wordpress后台登录地址改
  • 郑州做网站的公司哪家好做网站运营工资是不是很低
  • 做网站电销公司开发个网站怎么做
  • 廊坊做网站哪家好深圳快速网站制
  • 网站开发文档实训小结与讨论做网站建设业务员好吗
  • 网站开发知识产权归属好看的个人网站设计
  • 怎么学习企业网站维护江西省城乡建设培训网站官方网站
  • 电脑网站 源码php网站数据库修改