深度学习(生成式模型)——Classifier Guidance Diffusion

文章目录

  • 前言
  • 问题建模
  • 条件扩散模型的前向过程
  • 条件扩散模型的反向过程
  • 条件扩散模型的训练目标

前言

几乎所有的生成式模型,发展到后期都需要引入"控制"的概念,可控制的生成式模型才能更好应用于实际场景。本文将总结《Diffusion Models Beat GANs on Image Synthesis》中提出的Classifier Guidance Diffusion(即条件扩散模型),其往Diffusion Model中引入了控制的概念,可以控制DDPM、DDIM生成指定类别(条件)的图片。

问题建模

本章节所有符号定义与DDPM一致,在条件 y y y下的Diffusion Model的前向与反向过程可以定义为
q ^ ( x t + 1 ∣ x t , y ) q ^ ( x t ∣ x t + 1 , y ) \begin{aligned} \hat q(x_{t+1}|x_{t},y)\\ \hat q(x_t|x_{t+1},y) \end{aligned} q^(xt+1xt,y)q^(xtxt+1,y)
只要求出上述两个概率密度函数,我们即可按条件生成图像。

我们利用 q ^ \hat q q^表示条件扩散模型的概率密度函数, q q q表示扩散模型的概率密度函数。

条件扩散模型的前向过程

对于前向过程,作者定义了以下等式
q ^ ( x 0 ) = q ( x 0 ) q ^ ( x t + 1 ∣ x t , y ) = q ( x t + 1 ∣ x t ) q ^ ( x 1 : T ∣ x 0 , y ) = ∏ t = 1 T q ^ ( x t ∣ x t − 1 , y ) \begin{aligned} \hat q(x_0)&=q(x_0)\\ \hat q(x_{t+1}|x_t,y)&=q(x_{t+1}|x_t)\\ \hat q(x_{1:T}|x_0,y)&=\prod_{t=1}^T\hat q(x_t|x_{t-1},y) \end{aligned} q^(x0)q^(xt+1xt,y)q^(x1:Tx0,y)=q(x0)=q(xt+1xt)=t=1Tq^(xtxt1,y)

基于上述第二行定义,可知基于条件 y y y的diffusion model的前向过程与普通的diffusion model一致,即 q ^ ( x t + 1 ∣ x t ) = q ( x t + 1 ∣ x t ) \hat q(x_{t+1}|x_t)=q(x_{t+1}|x_t) q^(xt+1xt)=q(xt+1xt)。即加噪过程与条件 y y y无关,这种定义也是合理的。

条件扩散模型的反向过程

对于反向过程,我们有
q ^ ( x t ∣ x t + 1 , y ) = q ^ ( x t , x t + 1 , y ) q ^ ( x t + 1 , y ) = q ^ ( x t , x t + 1 , y ) q ^ ( y ∣ x t + 1 ) q ^ ( x t + 1 ) = q ^ ( x t , y ∣ x t + 1 ) q ^ ( y ∣ x t + 1 ) = q ^ ( y ∣ x t , x t + 1 ) q ^ ( x t ∣ x t + 1 ) q ^ ( y ∣ x t + 1 ) (1.0) \begin{aligned} \hat q(x_t|x_{t+1},y)&=\frac{\hat q(x_t,x_{t+1},y)}{\hat q(x_{t+1},y)}\\ &=\frac{\hat q(x_t,x_{t+1},y)}{\hat q(y|x_{t+1})\hat q(x_{t+1})}\\ &=\frac{\hat q(x_t,y|x_{t+1})}{\hat q(y|x_{t+1})}\\ &=\frac{\hat q(y|x_t,x_{t+1})\hat q(x_{t}|x_{t+1})}{\hat q(y|x_{t+1})} \end{aligned}\tag{1.0} q^(xtxt+1,y)=q^(xt+1,y)q^(xt,xt+1,y)=q^(yxt+1)q^(xt+1)q^(xt,xt+1,y)=q^(yxt+1)q^(xt,yxt+1)=q^(yxt+1)q^(yxt,xt+1)q^(xtxt+1)(1.0)

已知条件扩散模型的前向过程与扩散模型一致,则有

q ^ ( x 1 : T ∣ x 0 ) = q ( x 1 : T ∣ x 0 ) \hat q(x_{1:T}|x_0)=q(x_{1:T}|x_0) q^(x1:Tx0)=q(x1:Tx0)

进而有
q ^ ( x t ) = ∫ q ^ ( x 0 , . . . , x t ) d x 0 : t − 1 = ∫ q ^ ( x 0 ) q ^ ( x 1 : t ∣ x 0 ) d x 0 : t − 1 = ∫ q ( x 0 ) q ( x 1 : t ∣ x 0 ) d x 0 : t − 1 = q ( x t ) \begin{aligned} \hat q(x_{t})&=\int \hat q(x_0,...,x_t) dx_{0:t-1}\\ &=\int \hat q(x_0)\hat q(x_{1:t}|x_0)dx_{0:t-1}\\ &=\int q(x_0)q(x_{1:t}|x_0)dx_{0:t-1}\\ &=q(x_t) \end{aligned} q^(xt)=q^(x0,...,xt)dx0:t1=q^(x0)q^(x1:tx0)dx0:t1=q(x0)q(x1:tx0)dx0:t1=q(xt)

对于 q ^ ( x t ∣ x t + 1 ) \hat q(x_t|x_{t+1}) q^(xtxt+1),则有
q ^ ( x t ∣ x t + 1 ) = q ^ ( x t , x t + 1 ) q ^ ( x t + 1 ) = q ^ ( x t + 1 ∣ x t ) q ^ ( x t ) q ^ ( x t + 1 ) = q ( x t + 1 ∣ x t ) q ( x t ) q ( x t + 1 ) = q ( x t ∣ x t + 1 ) \begin{aligned} \hat q(x_t|x_{t+1})&=\frac{\hat q(x_t,x_{t+1})}{\hat q(x_{t+1})}\\ &=\frac{\hat q(x_{t+1}|x_t)\hat q(x_{t})}{\hat q(x_{t+1})}\\ &=\frac{q(x_{t+1}|x_t)q(x_{t})}{q(x_{t+1})}\\ &=q(x_{t}|x_{t+1}) \end{aligned} q^(xtxt+1)=q^(xt+1)q^(xt,xt+1)=q^(xt+1)q^(xt+1xt)q^(xt)=q(xt+1)q(xt+1xt)q(xt)=q(xtxt+1)

对于 q ^ ( y ∣ x t , x x t + 1 ) \hat q(y|x_t,x_{x_{t+1}}) q^(yxt,xxt+1),我们有
q ^ ( y ∣ x t , x x t + 1 ) = q ^ ( x t + 1 ∣ x t , y ) q ^ ( y ∣ x t ) q ^ ( x t + 1 ∣ x t ) = q ^ ( x t + 1 ∣ x t ) q ^ ( y ∣ x t ) q ^ ( x t + 1 ∣ x t ) = q ^ ( y ∣ x t ) \begin{aligned} \hat q(y|x_t,x_{x_{t+1}})&=\frac{\hat q(x_{t+1}|x_t,y)\hat q(y|x_t)}{\hat q(x_{t+1}|x_t)}\\ &=\frac{\hat q(x_{t+1}|x_t)\hat q(y|x_t)}{\hat q(x_{t+1}|x_t)}\\ &=\hat q(y|x_t) \end{aligned} q^(yxt,xxt+1)=q^(xt+1xt)q^(xt+1xt,y)q^(yxt)=q^(xt+1xt)q^(xt+1xt)q^(yxt)=q^(yxt)

因此式1.0为

q ^ ( x t ∣ x t + 1 , y ) = q ^ ( y ∣ x t , x t + 1 ) q ^ ( x t ∣ x t + 1 ) q ^ ( y ∣ x t + 1 ) = q ^ ( y ∣ x t ) q ( x t ∣ x t + 1 ) q ^ ( y ∣ x t + 1 ) \begin{aligned} \hat q(x_t|x_{t+1},y)&=\frac{\hat q(y|x_t,x_{t+1})\hat q(x_{t}|x_{t+1})}{\hat q(y|x_{t+1})}\\ &=\frac{\hat q(y|x_t)q(x_{t}|x_{t+1})}{\hat q(y|x_{t+1})} \end{aligned} q^(xtxt+1,y)=q^(yxt+1)q^(yxt,xt+1)q^(xtxt+1)=q^(yxt+1)q^(yxt)q(xtxt+1)

由于在反向过程中, x t + 1 x_{t+1} xt+1是已知的,因此 q ^ ( y ∣ x t + 1 ) \hat q(y|x_{t+1}) q^(yxt+1)也可看成已知值,设其倒数为 Z Z Z,则有

q ^ ( x t ∣ x t + 1 , y ) = Z q ^ ( y ∣ x t ) q ( x t ∣ x t + 1 ) \begin{aligned} \hat q(x_t|x_{t+1},y) = Z\hat q(y|x_t)q(x_{t}|x_{t+1}) \end{aligned} q^(xtxt+1,y)=Zq^(yxt)q(xtxt+1)

取log可得
log ⁡ q ^ ( x t ∣ x t + 1 , y ) = log ⁡ Z + log ⁡ q ^ ( y ∣ x t ) + log ⁡ q ^ ( x t ∣ x t + 1 ) (1.1) \begin{aligned} \log \hat q(x_{t}|x_{t+1},y)=\log Z+\log \hat q(y|x_t)+\log \hat q(x_t|x_{t+1})\tag{1.1} \end{aligned} logq^(xtxt+1,y)=logZ+logq^(yxt)+logq^(xtxt+1)(1.1)

q ^ ( x t ∣ x t + 1 ) = N ( μ t , ∑ t 2 ) \hat q(x_t|x_{t+1})=\mathcal N(\mu_t,\sum_t^2) q^(xtxt+1)=N(μt,t2),则有
log ⁡ q ^ ( x t ∣ x t + 1 ) = − 1 2 ( x t − μ t ) T ( ∑ t ) − 1 ( x t − μ t ) + C (1.2) \log \hat q(x_{t}|x_{t+1})=-\frac{1}{2}(x_t-\mu_t)^T({\sum}_t)^{-1}(x_t-\mu_t)+C\tag{1.2} logq^(xtxt+1)=21(xtμt)T(t)1(xtμt)+C(1.2)

对于 log ⁡ q ^ ( y ∣ x t ) \log \hat q(y|x_t) logq^(yxt),在 x t = μ t x_t=\mu_t xt=μt处做泰勒展开,则有

log ⁡ q ^ ( y ∣ x t ) ≈ log ⁡ q ^ ( y ∣ x t ) ∣ x t = μ t + ( x t − μ t ) ∇ x t log ⁡ q ^ ( y ∣ x t ) ∣ x t = μ t = C 1 + ( x t − μ t ) g (1.3) \begin{aligned} \log \hat q(y|x_t) &\approx \log \hat q(y|x_t)|_{x_t=\mu_t}+(x_t-\mu_t)\nabla_{x_t}\log\hat q(y|x_t)|_{x_t=\mu_t}\\ &=C_1+(x_t-\mu_t)g \end{aligned}\tag{1.3} logq^(yxt)logq^(yxt)xt=μt+(xtμt)xtlogq^(yxt)xt=μt=C1+(xtμt)g(1.3)
其中 g = ∇ x t log ⁡ q ^ ( y ∣ x t ) ∣ x t = μ t g=\nabla_{x_t}\log\hat q(y|x_t)|_{x_t=\mu_t} g=xtlogq^(yxt)xt=μt,结合式1.1、1.2、1.3,有

log ⁡ q ^ ( x t ∣ x t + 1 , y ) ≈ C 1 + ( x t − μ t ) g + log ⁡ Z − 1 2 ( x t − μ t ) T ( ∑ t ) − 1 ( x t − μ t ) + C = ( x t − μ t ) g − 1 2 ( x t − μ t ) T ( ∑ t ) − 1 ( x t − μ t ) + C 2 = − 1 2 ( x t − μ t − ∑ t g ) T ( ∑ t ) − 1 ( x t − μ t − ∑ t g ) + C 3 \begin{aligned} \log \hat q(x_{t}|x_{t+1},y)&\approx C_1+(x_t-\mu_t)g+\log Z-\frac{1}{2}(x_t-\mu_t)^T(\sum{_t})^{-1}(x_t-\mu_t)+C\\ &=(x_t-\mu_t)g-\frac{1}{2}(x_t-\mu_t)^T(\sum{_t})^{-1}(x_t-\mu_t)+C_2\\ &=-\frac{1}{2}(x_t-\mu_t-\sum{_t} g)^T(\sum{_t})^{-1}(x_t-\mu_t-\sum{_t}g)+C_3 \end{aligned} logq^(xtxt+1,y)C1+(xtμt)g+logZ21(xtμt)T(t)1(xtμt)+C=(xtμt)g21(xtμt)T(t)1(xtμt)+C2=21(xtμttg)T(t)1(xtμttg)+C3

最终有

q ^ ( x t ∣ x t + 1 , y ) ≈ N ( μ t + ∑ t g , ( ∑ t ) 2 ) g = ∇ x t log ⁡ q ^ ( y ∣ x t ) ∣ x t = μ t (1.4) \begin{aligned} \hat q(x_t|x_{t+1},y)\approx \mathcal N(\mu_t+{\sum}_{t}g,({\sum}_t)^2)\\ g=\nabla_{x_t}\log\hat q(y|x_t)|_{x_t=\mu_t} \end{aligned}\tag{1.4} q^(xtxt+1,y)N(μt+tg,(t)2)g=xtlogq^(yxt)xt=μt(1.4)

为了获得 ∇ x t log ⁡ q ^ ( y ∣ x t ) \nabla_{x_t}\log\hat q(y|x_t) xtlogq^(yxt),Classifier Guidance Diffusion在训练好的Diffusion model的基础上额外训练了一个分类头。

假设 x t ≈ μ t x_t \approx\mu_t xtμt,则Classifier Guidance Diffusion的反向过程为:
在这里插入图片描述

其中 p ϕ ( y ∣ x t ) = q ^ ( y ∣ x t ) p_ \phi(y|x_t)=\hat q(y|x_t) pϕ(yxt)=q^(yxt) s s s为一个超参数。

式1.4有个问题,当方差 ∑ \sum 取值为0时, ∑ ∇ x t log ⁡ q ^ ( y ∣ x t ) {\sum}\nabla_{x_t}\log\hat q(y|x_t) xtlogq^(yxt)取值将为0,无法控制生成指定条件的图像。因此式1.4不适用于DDIM等确定性采样的扩散模型

在推导DDIM的采样公式前,我们先了解一下用Tweedie方法做参数估计的流程。

Tweedie方法主要用于指数族概率分布的参数估计,而高斯分布属于指数族概率分布,自然也适用。假设有一批样本 z z z,则利用样本 z z z估计高斯分布 N ( Z ; μ , ∑ 2 ) \mathcal N(Z;\mu,{\sum}^2) N(Z;μ,2)的均值 μ \mu μ的公式为

E [ μ ∣ z ] = z + ∑ 2 ∇ z log ⁡ p ( z ) (1.5) E[\mu|z]=z+{\sum}^2\nabla_z\log p(z)\tag{1.5} E[μz]=z+2zlogp(z)(1.5)

已知DDPM、DDIM的前向过程有

q ( x t ∣ x 0 ) = N ( x t ; α ˉ t x 0 , ( 1 − α ˉ t ) I ) (1.6) q(x_t|x_0)=\mathcal N(x_t;\sqrt{\bar \alpha_t}x_0,(1-\bar\alpha_t)\mathcal I)\tag{1.6} q(xtx0)=N(xt;αˉt x0,(1αˉt)I)(1.6)

结合式1.5、1.6可得

α ˉ t x 0 = x t + ( 1 − α ˉ t ) ∇ x t log ⁡ p ( x t ) \begin{aligned} \sqrt{\bar \alpha_t}x_0=x_t+(1-\bar\alpha_t)\nabla_{x_t}\log p(x_t) \end{aligned} αˉt x0=xt+(1αˉt)xtlogp(xt)
进而有
x t = α ˉ t x 0 − ( 1 − α ˉ t ) ∇ x t log ⁡ p ( x t ) (1.7) x_t=\sqrt{\bar \alpha_t}x_0-(1-\bar\alpha_t)\nabla_{x_t}\log p(x_t)\tag{1.7} xt=αˉt x0(1αˉt)xtlogp(xt)(1.7)
ϵ t \epsilon_t ϵt服从标准正态分布,则从式1.6可知

x t = α ˉ t x 0 + 1 − α ˉ t ϵ t (1.8) x_t=\sqrt{\bar \alpha_t}x_0+\sqrt{1-\bar\alpha_t}\epsilon_t\tag{1.8} xt=αˉt x0+1αˉt ϵt(1.8)

结合式1.7、1.8,则有

∇ x t log ⁡ p ( x t ) = − 1 1 − α ˉ t ϵ t (1.9) \nabla_{x_t}\log p(x_t)=-\frac{1}{\sqrt{1-\bar\alpha_t}}\epsilon_t\tag{1.9} xtlogp(xt)=1αˉt 1ϵt(1.9)

已知DDIM的采样公式为

x t − 1 = α ˉ t − 1 x t − 1 − α ˉ t ϵ θ ( x t ) α ˉ t + 1 − α ˉ t − δ t 2 ϵ θ ( x t ) (2.0) x_{t-1}=\sqrt{\bar \alpha_{t-1}}\frac{x_t-\sqrt{1-\bar \alpha_t}\epsilon_\theta(x_t)}{\sqrt{\bar\alpha_t}}+\sqrt{1-\bar\alpha_{t}-\delta_t^2}\epsilon_\theta(x_t)\tag{2.0} xt1=αˉt1 αˉt xt1αˉt ϵθ(xt)+1αˉtδt2 ϵθ(xt)(2.0)

结合式1.9、2.0可将DDIM的采样公式转变为

x t − 1 = α ˉ t − 1 x t − 1 − α ˉ t ( − 1 − α ˉ t ∇ x t log ⁡ p ( x t ) ) α ˉ t + 1 − α ˉ t − δ t 2 ( − 1 − α ˉ t ∇ x t log ⁡ p ( x t ) ) (2.1) x_{t-1}=\sqrt{\bar \alpha_{t-1}}\frac{x_t-\sqrt{1-\bar \alpha_t}(-\sqrt{1-\bar\alpha_t}\nabla_{x_t}\log p(x_t))}{\sqrt{\bar\alpha_t}}+\sqrt{1-\bar\alpha_{t}-\delta_t^2}(-\sqrt{1-\bar\alpha_t}\nabla_{x_t}\log p(x_t))\tag{2.1} xt1=αˉt1 αˉt xt1αˉt (1αˉt xtlogp(xt))+1αˉtδt2 (1αˉt xtlogp(xt))(2.1)

我们只需要将其中的 ∇ x t log ⁡ p ( x t ) \nabla_{x_t}\log p(x_t) xtlogp(xt)替换为 ∇ x t log ⁡ p ( x t ∣ y ) \nabla_{x_t}\log p(x_t|y) xtlogp(xty),即可引入条件 y y y来控制DDIM的生成过程,利用贝叶斯定理,我们有

log ⁡ p ( x t ∣ y ) = log ⁡ p ( y ∣ x t ) + log ⁡ p ( x t ) − log ⁡ p ( y ) ∇ x t log ⁡ p ( x t ∣ y ) = ∇ x t log ⁡ p ( y ∣ x t ) + ∇ x t log ⁡ p ( x t ) − ∇ x t log ⁡ p ( y ) = ∇ x t log ⁡ p ( y ∣ x t ) + ∇ x t log ⁡ p ( x t ) = ∇ x t log ⁡ p ( y ∣ x t ) − 1 1 − α ˉ t ϵ t (2.2) \begin{aligned} \log p(x_t|y)&=\log p(y|x_t)+\log p(x_t)-\log p(y)\\ \nabla_{x_t}\log p(x_t|y)&=\nabla_{x_t}\log p(y|x_t)+\nabla_{x_t}\log p(x_t)-\nabla_{x_t}\log p(y)\\ &=\nabla_{x_t}\log p(y|x_t)+\nabla_{x_t}\log p(x_t)\\ &=\nabla_{x_t}\log p(y|x_t)-\frac{1}{\sqrt{1-\bar\alpha_t}}\epsilon_t \end{aligned}\tag{2.2} logp(xty)xtlogp(xty)=logp(yxt)+logp(xt)logp(y)=xtlogp(yxt)+xtlogp(xt)xtlogp(y)=xtlogp(yxt)+xtlogp(xt)=xtlogp(yxt)1αˉt 1ϵt(2.2)
则有

− 1 − α ˉ t ∇ x t log ⁡ p ( x t ∣ y ) = ϵ t − 1 − α ˉ t ∇ x t log ⁡ p ( y ∣ x t ) (2.3) -\sqrt{1-\bar\alpha_t}\nabla_{x_t}\log p(x_t|y)=\epsilon_t-\sqrt{1-\bar\alpha_t}\nabla_{x_t}\log p(y|x_t)\tag{2.3} 1αˉt xtlogp(xty)=ϵt1αˉt xtlogp(yxt)(2.3)

至此,我们可以得到DDIM的采样流程为
在这里插入图片描述
对于DDIM等确定性采样的扩散模型,其应在训练好的Diffusion model的基础上额外训练了一个分类头,从而转变为Classifier Guidance Diffusion。

条件扩散模型的训练目标

注意到 q ^ ( x t ∣ x t + 1 ) = q ( x t ∣ x t + 1 ) \hat q(x_t|x_{t+1})=q(x_t|x_{t+1}) q^(xtxt+1)=q(xtxt+1),并且上述的推导过程并没有改变 q ( x t ∣ x t + 1 ) 、 q ( x t + 1 ∣ x t ) q(x_t|x_{t+1})、q(x_{t+1}|x_t) q(xtxt+1)q(xt+1xt)的形式,因此Classifier Guidance Diffusion的训练目标与DDPM、DDIM是一致的,都可以拟合训练数据。

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

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

相关文章

【TiDB】TiDB CLuster部署

目录 0 大纲 一 集群部署工具TiUP简介 1 TiUP 简介 2 TiUP使用 3 TiUP使用举例 二 TiDB Cluster安装配置需求 1 生产环境硬件需求 2 操作系统需求 三 TIDB部署 1 软硬件需求以及前置检查​编辑 2 安装TiUP 组件 ​3 集群拓扑文件 4 执行部署命令 (1&…

[Hive] CTE 通用表达式 WITH关键字

在Hive中,CTE代表的是Common Table Expression(通用表达式),这是一种SQL语句结构,使用WITH关键字定义的子句。 文章目录 CTE递归 CTE将多个CTE(公共表表达式)写在同一个SQL文件中 CTE CTE提供…

视频号小店怎么做?运营四步骤,快来学习!

大家好,我是电商糖果 2023年因为视频号小店的爆火,想尝试开店的朋友也不少。 但是因为自己是新手小白,对做电商方面了解的也并不多,再加上它是一个才出来一年多的电商平台。对它的很多规则和玩法并不清楚。 所以,这…

MoSe2 二硒化钼 CAS:12058-18-3 瑞禧分享

MoSe2二硒化钼 纯度:4N 99.99%-99.999% 英文名称:Molybdenum Selenide CAS:12058-18-3 分子式为MoSe2.分子量为253.86 灰色粉末,具有层状性质,具有半导体性质。 技术对接:高温高压真空熔炼,处理后进行热扩散 瓶装,1kg/瓶,外加铝复合薄膜真空包装 用途:科研,…

flutter实现视频播放

使用到的库是lecle_yoyo_player 详细请查看文档 main.dart代码如下: import package:flutter/material.dart; import package:lecle_yoyo_player/lecle_yoyo_player.dart;void main() > runApp(const MyApp());class MyApp extends StatefulWidget {const MyA…

如何实现 promise.map,限制 promise 并发数

实现一个带有并发限制的Promise.map函数,可以使用async/await和Promise的特性来管理并发数。 function promiseMap(array, mapper, concurrencyLimit) {return new Promise((resolve, reject) > {const results [];let currentIndex 0;let activeCount 0;asy…

竞赛选题 深度学习的口罩佩戴检测 - opencv 卷积神经网络 机器视觉 深度学习

文章目录 0 简介1 课题背景🚩 2 口罩佩戴算法实现2.1 YOLO 模型概览2.2 YOLOv32.3 YOLO 口罩佩戴检测实现数据集 2.4 实现代码2.5 检测效果 3 口罩佩戴检测算法评价指标3.1 准确率(Accuracy)3.2 精确率(Precision)和召回率(Recall)3.3 平均精…

Python与ArcGIS系列(七)自动化打印地图

目录 0 简述1 获取可用打印机列表2 打印地图3 导出地图至PDF4 导出地图至图像0 简述 本篇介绍如何利用arcpy实现获取可用打印机列表、打印地图、导出地图至PDF和图像。 1 获取可用打印机列表 通过arcpy提供的ListPrinterNames()函数可以生成可用的打印机列表。 import arcpy.m…

Makefile的简单语法学习

通配符 假如一个目标文件所依赖的依赖文件很多,那样岂不是我们要写很多规则,这显然是不合乎常理的,我们可以使用通配符,来解决这些问题。 我们对上节程序进行修改,代码如下: test : a.o b.ogcc -o test $…

【原创】java+swing+mysql办公用品管理系统设计与实现

摘要: 办公用品管理系统是一个设计和实现办公用品库存和使用管理的信息系统。此系统可以提高办公用品的利用率,减少浪费,使办公用品管理更加高效、规范、便捷。本文主要介绍使用javaswingmysql技术去开发实现一个办公用品管理系统。 功能分…

【JUC】三、集合的线程安全

文章目录 1、ArrayList集合线程安全问题分析2、解决方式一:Vector或synchronizedList( )3、解决方式二:CopyOnWriteArrayList 写时复制4、HashSet集合线程不安全的分析与解决5、HashMap集合线程不安全的分析与解决 1、ArrayList集合线程安全问题分析 对…

削峰填谷:居民小区电动汽车有序充电策略研究

摘 要:针对电动汽车在居民小区无序充电对电网系统产生严重隐患及充电间时过长问题,提出一种采用延迟充电的电动汽车有序充电控制策略,并在分析国内外电动汽车有序充电的研究现状后,设计了居民小区电动汽车有序充电策略的总体框架。…

体验家XMPlus收购NPSMeter,稳固体验管理行业“领头羊”地位

2023年9月30日,体验家XMPlus(以下简称“体验家”)成功完成了对NPSMeter的收购。此次收购是中国客户体验管理(CEM)赛道进入快速发展以来的首单收购,标志着体验家在CEM领域的进一步扩张,旨在继续完…

AcWing第129场周赛 - 5290. 重新分装 - 哈夫曼/贪心

解决这个问题前可以先把这三个问题想清楚 1、为什么可以使用哈夫曼树进行求解? 考虑逆操作 参考题解链接 2、为什么恰好是按照每堆所需要的数量分?针对某一堆,可以先分一部分吗? 首先这里按照每堆所正好含有的数量进行划分&#x…

Ribbon 负载均衡原理和策略

目录 一、Ribbon 是什么 二、Ribbon 负载均衡原理 三、Ribbon 负载均衡策略 四、Ribbon的应用场景 一、Ribbon 是什么 Ribbon是一个开源的、基于HTTP和TCP的客户端负载均衡工具,它提供了一个简单的、基于配置的负载均衡策略,可以帮助开发人员更轻松…

Go 命令行框架: 构建强大的命令行工具

引言 在软件开发中,命令行工具扮演着重要的角色。它们可以用于自动化任务、数据处理、系统管理等各种场景。而使用合适的命令行框架,可以帮助我们更轻松地构建和维护命令行工具。本文将介绍 Go 语言中一些流行的命令行框架,并讨论它们的特性…

HDU 1027:Ignatius and the Princess II ← next_permutation()

【题目来源】http://acm.hdu.edu.cn/showproblem.php?pid1027【题目描述】 Now our hero finds the door to the BEelzebub feng5166. He opens the door and finds feng5166 is about to kill our pretty Princess. But now the BEelzebub has to beat our hero first. feng5…

UITableView的style是UITableViewStyleGrouped

一般情况下,UITableViewStylePlain和UITableViewStyleGrouped是UITableView常用到的style, 之前都是用到的时候,遇到问题直接用度娘,差不多就够用了,今天在修复UI提出的间隙问题,来回改,总觉得…

k8s关于metadata、spec.containers、spec.volumes的属性介绍(yaml格式)

目录 一.metadata常用属性 二.spec.containers子属性介绍 explain pod.spec.containers给出的参考 1.command示例演示 2.env和envFrom示例演示 3.ports部分详解 4.resources部分详解 5.startupProbe格式演示 6.terminationMessagePath和terminationMessagePolicy格式演…

晶圆代工产能利用率下降,降价大战一触即发 | 百能云芯

晶圆代工行业正面临产能利用率的重大挑战,据悉,联电、世界先进和力积电等主要代工厂纷纷降低明年首季的报价,幅度高达两位数百分比,项目客户降幅更高达15%至20%,各大晶圆代工厂深陷产能利用率六成保卫战。 晶圆代工降价…