OMGD:用于GAN压缩的在线多粒度蒸馏

背景:1、生成性对抗性网络(GAN)在生成出色图像方面取得了普遍成功,但是,由于计算成本和庞大的内存使用,它们在资源受限的设备上部署起来很麻烦。

2、尽管最近压缩GAN的努力取得了显著的成果,但它们仍然存在潜在的模型冗余,可以进一步压缩。

方法简介:1、提出了一种新的在线多粒度蒸馏(OMGD)方案来获得轻量级的GAN,这有助于以低计算需求生成高保真图像。

2、首次尝试推广面向GAN压缩的单级在线蒸馏,其中逐步提升的教师生成器有助于改进无鉴别器的学生生成器。

3、互补的教师生成器和网络层提供了全面和多粒度的概念,以从不同维度增强视觉逼真度。

 

 1、模型方法

 1.1在线GAN蒸馏

提出了一种面向GAN的在线蒸馏算法来解决离线蒸馏中的三个关键问题。

a、传统离线蒸馏方法中的学生生成器应保持一定容量,以保持与鉴别器的动态平衡,以避免模型崩溃和梯度消失

b、学生生成器不再与鉴别器深度绑定,它可以更灵活地训练并获得进一步压缩。

c、由于评估指标是主观的,因此选择合适的预培训教师生成器并非易事,但该方法不需要预先训练的模型

1.1.1教师生成器

      遵循损失函数和训练设置来训练教师生成器G_{T}和鉴别器D。

G_{T}旨在学习一个函数,将数据从源域X映射到目标域Y。我们以Pix2Pix为例,它使用配对数据(\left \{x _{i} ,y_{i}\right \}_{i=1}^{N},其中x_{i}\in Xy_{i}\in Y)优化网络。

训练生成器G_{T}x_{i}映射到y_{i},而训练鉴别器D将G_{T}生成的假图像与真实图像区分开来。

L_{GAN}\left ( G_{T},D \right )=E_{x,y}\left [ \log D\left ( x,y \right ) \right ]+E_{x}\left [ \log \left ( 1-D\left ( x,G_{T} \left ( x \right )\right ) \right ) \right ]

此外,引入重建损失以将G_{T}输出的输出值推到接近真实标签y:

L_{Recon}\left (G _{T} \right )=E_{x,y}\left [ \left \| y-G_{T}\left ( x \right ) \right \|_{1} \right ]

GAN设置中的整体目标损失定义为:

G_{T}^{\ast }=\arg \min _{G_{T}}\max _{D}L_{GAN}\left ( G_{T} ,D\right )+L_{Recon}\left ( G_{T} \right )

1.1.2学生生成器

      在所提出的面向GAN的在线蒸馏方案中,学生生成器G_{S}仅利用教师网络G_{T}进行优化,并且可以在无鉴别器设置中进行训练。G_{S}的优化不需要同时使用真实标签y。

ps:即G_{S}仅学习具有类似结构(G_{T})的较大容量的输出,这大大降低了直接拟合y的难度。

       将G_{T}/G_{S}的输出表示为p_{t}/p_{s},我们使用结构相似性(SSIM)损失和感知损失来测量p_{t}p_{s}之间的差异。给定p_{s}p_{t}、SSIM损失,通过以下公式计算两幅图像的相似性:

L_{SSIM}\left (p_{t},p_{s} \right )=\frac{\left ( 2\mu _{t} \mu _{s}+C_{1}\right )\left ( 2\sigma _{ts} +C_{2}\right )}{\left ( \mu _{t}^{2}\mu _{s}^{2}+C_{1}\right )\left ( \sigma _{t}^{2} +\sigma _{s}^{2}+C_{2}\right )}

\mu _{s},\mu _{t}:亮度估计的平均值;

\sigma _{s}^{2},\sigma _{t}^{2}:对比度的标准差;

\sigma _{ts}:结构相似性估计的协方差;

C_{1},C_{2}:避免零分母的常数。

感知损失包括特征重建损失和风格重建损失。特征损失鼓励pt和ps具有相似的特征表示,这些特征表示由预训练的VGG网络\phi测量。L_{feature}特征形式化为:

L_{feature}\left ( p_{t} ,p_{s}\right )=\frac{1}{C_{j}H_{j}W_{j}}\left \| \phi _{j} \left ( p_{t} \right )-\phi _{j}\left (p _{s} \right )\right \|_{1}

其中\phi _{j}\left ( x \right )是输入x的\phi的第j层的激活。{C_{j}H_{j}W_{j}}\phi _{j}\left ( x \right )的维数。

L_{style}用于惩罚风格特征的差异,如颜色、纹理、常见图案等。L_{style}可计算为:

L_{style}\left ( p_{t} ,p_{s}\right )=\left \| G_{j}^{\phi } \left ( p_{t} \right )-G_{j}^{\phi } \left ( p_{s} \right )\right \|_{1}

其中G_{j}^{\phi } \left (x \right )是VGG网络中第j层激活的Gram矩阵。

此外,引入了总变化损失L_{TV},以促进生成图像的空间平滑。我们使用四个超参数\lambda _{SSIM}\lambda _{feature}\lambda _{style}\lambda _{TV}来实现上述损失之间的平衡,因此总在线KD损失L_{KD}\left ( p_{t},p_{s} \right )计算如下:

L_{KD}\left ( p_{t} ,p_{s}\right )=\lambda _{SSIM}L_{SSIM}+\lambda _{feature}L_{feature}+\lambda _{style}L_{style}+\lambda _{TV}L_{TV}

1.2多粒度知识蒸馏框架

OMGD框架

基于新的在线GAN蒸馏技术,进一步从两个角度将我们的方法扩展为多粒度方案:

a、教师生成器的互补结构和来自不同层的知识。在线多粒度蒸馏(OMGD)框架的整个流程如上图所示。

b、使用更广泛的教师生成器G_{T}^{W}和更深入的教师生成器G_{T}^{D}来形式化G_{S}的多目标优化任务。除了教师生成器的输出层,我们还通过通道蒸馏损失从中间层挖掘知识概念

1.2.1多教师知识蒸馏

      基于不同结构的教师生成器有助于从真实标签捕获更多互补图像线索,并从不同角度提高图像翻译性能。此外,多教师蒸馏设置可以进一步缓解过度拟合的问题。从两个互补的维度,即深度和宽度,将学生模型扩展为教师模型。

 a、给定学生生成器G_{S},我们扩展G_{S}的通道以获得更宽的教师生成器G_{T}^{W},卷积层的每个通道乘以通道扩展因子η

b、在每个下采样层和上采样层之后插入几个resnet块G_{S}中,以构建更深层的教师生成器G_{T}^{D},其容量与G_{T}^{W}相当。

      部分共享鉴别器设计用于共享前几层,并分离两个分支,以分别获得G_{T}^{W}G_{T}^{D}的鉴别器输出。

ps:这种共享设计不仅提供了鉴别器的高度灵活性,还利用了输入图像的相似特性来改进生成器的训练。

我们直接将互补教师发生器提供的两个蒸馏损失合并为多教师设置中的KD损失

L_{KD_{multi}}\left ( p_{t}^{w} ,p_{t}^{d},p_{s}\right )=L_{KD}\left ( p_{t}^{w} ,p_{s}\right )+L_{KD}\left ( p_{t}^{d} ,p_{s}\right )

其中p_{t}^{w}p_{t}^{d}分别是G_{T}^{W}G_{T}^{D}的输出层的激活。

1.2.2中间层知识蒸馏

      输出层的概念没有考虑教师网络的更多中间细节,因此我们进一步将信道粒度信息作为附加的监督信号传输,以促进G_{S}。具体地说,我们计算通道关注权重,以测量特征图中每个通道的重要性。关注权重W_{c}定义为:

W_{c}=\frac{1}{H\times W}\sum_{i=1}^{H}\sum_{i=1}^{W}u_{c}\left ( i,j \right )

其中u_{c}表示特征图的第c个通道。然后将1×1卷积层连接到G_{S}的中间层,以扩展通道数量,通道蒸馏(CD)损失计算如下:

L_{CD}\left ( G_{T}^{W} ,G_{S}\right )=\frac{1}{n}\sum_{i=1}^{n}\left ( \frac{\sum_{j=1}^{c}\left ( W_{t_{w}}^{ij} -W_{s}^{ij}\right )^{2}}{c} \right )

其中n是要采样的特征图的数量,c是特征图的通道数w^{ij}是第i个特征图的第j个通道的关注权重

总之,整个在线多粒度蒸馏目标形式化为:

L\left ( G_{T}^{W} ,G_{T}^{D},G_{S}\right )=\lambda _{CD}L_{CD}\left ( G_{T}^{W},G_{S} \right )+L_{KD_{multi}}\left (p_{t}^{w} ,p_{t}^{d},p_{s}\right )

2、总结 

1、提出了一种在线多粒度蒸馏(OMGD)技术来学习轻量级GAN。引入面向GAN的在线方案,交替促进教师和学生生成器,教师帮助学生热身,逐步引导优化方向。

2、OMGD还充分利用了来自互补教师生成器和来自不同层的辅助监督信号的多粒度概念。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
根据提供的引用内容,我了解到伪距单点定位是一种工应用中非常重要的技术,尤其是在复杂场景下。在进行伪距单点定位时,需要计算设计矩阵,而计算设计矩阵需要概略位置和每个卫星的位置。对于初次定位,我们一般将概略位置设置为地球质心,也就是参考坐标系的零点(0,0,0),而卫星位置计算则在satposs函数中。 在Visual Studio中进行伪距单点定位,可以使用C++或C#编写程序。以下是一个使用C++实现的伪距单点定位的示例代码: ```c++ #include <iostream> #include <fstream> #include <cmath> #include <cstdlib> #include <cstring> #include <ctime> #include <iomanip> #include <vector> using namespace std; #define MAXOBS 32 #define MAXSAT 32 #define MAXITER 100 #define MAXDIFF 10.0 #define MAXVAR 10.0 #define MINEL 15.0 typedef struct { int week; double sec; } gtime_t; typedef struct { gtime_t time; int sat; double P; double L; double D; double SNR; } obsd_t; typedef struct { int n; obsd_t data[MAXOBS]; } obs_t; typedef struct { double x; double y; double z; } xyz_t; typedef struct { double a; double e; double i0; double OMG0; double omg; double M0; double n; double OMGd; double idot; double crc; double crs; double cuc; double cus; double cic; double cis; double toes; double toe; double tgd; double f0; double f1; double f2; } eph_t; typedef struct { int n; eph_t data[MAXSAT]; } eph_t; typedef struct { double a; double b; double c; } blh_t; typedef struct { double x; double y; double z; double vx; double vy; double vz; } state_t; typedef struct { double P[MAXOBS]; double L[MAXOBS]; double D[MAXOBS]; double var[MAXOBS]; int vsat[MAXOBS]; int ns; double age; double ratio; } sol_t; typedef struct { double x; double y; double z; double dx; double dy; double dz; } ref_t; typedef struct { double a; double b; double c; double d; } quat_t; typedef struct { double pos[3]; double vel[3]; double acc[3]; double jrk[3]; double yaw; double pitch; double roll; } insstate_t; typedef struct { double time; double pos[3]; double vel[3]; double att[3]; double ba[3]; double bg[3]; } insopt_t; typedef struct { double time; double pos[3]; double vel[3]; double att[3]; double ba[3]; double bg[3]; double cov[21]; } insstate_t; typedef struct { double time; double pos[3]; double vel[3]; double att[3]; double ba[3]; double bg[3]; double cov[21]; } insopt_t; typedef struct { double time; double pos[3]; double vel[3]; double att[3]; double ba[3]; double bg[3]; double cov[21]; } insstate_t; typedef struct { double time; double pos[3]; double vel[3]; double att[3]; double ba[3]; double bg[3]; double cov[21]; } insopt_t; typedef struct { double time; double pos[3]; double vel[3]; double att[3]; double ba[3]; double bg[3]; double cov[21]; } insstate_t; typedef struct { double time; double pos[3]; double vel[3]; double att[3]; double ba[3]; double bg[3]; double cov[21]; } insopt_t; typedef struct { double time; double pos[3]; double vel[3]; double att[3]; double ba[3]; double bg[3]; double cov[21]; } insstate_t; typedef struct { double time; double pos[3]; double vel[3]; double att[3]; double ba[3]; double bg[3]; double cov[21]; } insopt_t; typedef struct { double time; double pos[3]; double vel[3]; double att[3]; double ba[3]; double bg[3]; double cov[21]; } insstate_t; typedef struct { double time; double pos[3]; double vel[3]; double att[3]; double ba[3]; double bg[3]; double cov[21]; } insopt_t; typedef struct { double time; double pos[3]; double vel[3]; double att[3]; double ba[3]; double bg[3]; double cov[21]; } insstate_t; typedef struct { double time; double pos[3]; double vel[3]; double att[3]; double ba[3]; double bg[3]; double cov[21]; } insopt_t; typedef struct { double time; double pos[3]; double vel[3]; double att[3]; double ba[3]; double bg[3]; double cov[21]; } insstate_t; typedef struct { double time; double pos[3]; double vel[3]; double att[3]; double ba[3]; double bg[3]; double cov[21]; } insopt_t; typedef struct { double time; double pos[3]; double vel[3]; double att[3]; double ba[3]; double bg[3]; double cov[21]; } insstate_t; typedef struct { double time; double pos[3]; double vel[3]; double att[3]; double ba[3]; double bg[3]; double cov[21]; } insopt_t; typedef struct { double time; double pos[3]; double vel[3]; double att[3]; double ba[3]; double bg[3]; double cov[21]; } insstate_t; typedef struct { double time; double pos[3]; double vel[3]; double att[3]; double ba[3]; double bg[3]; double cov[21]; } insopt_t; typedef struct { double time; double pos[3]; double vel[3]; double att[3]; double ba[3]; double bg[3]; double cov[21]; } insstate_t; typedef struct { double time; double pos[3]; double vel[3]; double att[3]; double ba[3]; double bg[3]; double cov[21]; } insopt_t; typedef struct { double time; double pos[3]; double vel[3]; double att[3]; double ba[3]; double bg[3]; double cov[21]; } insstate_t; typedef struct { double time; double pos[3]; double vel[3]; double att[3]; double ba[3]; double bg[3]; double cov[21]; } insopt_t; typedef struct { double time; double pos[3]; double vel[3]; double att[3]; double ba[3]; double bg[3]; double cov[21]; } insstate_t; typedef struct { double time; double pos[3]; double vel[3]; double att[3]; double ba[3]; double bg[3]; double cov[21]; } insopt_t; typedef struct { double time; double pos[3]; double vel[3]; double att[3]; double ba[3]; double bg[3]; double cov[21]; } insstate_t; typedef struct { double time; double pos[3]; double vel[3]; double att[3]; double ba[3]; double bg[3]; double cov[21]; } insopt_t; typedef struct { double time; double pos[3]; double vel[3]; double att[3]; double ba[3]; double bg[3]; double cov[21]; } insstate_t; typedef struct { double time; double pos[3]; double vel[3]; double att[3]; double ba[3]; double bg[3]; double cov[21]; } insopt_t; typedef struct { double time; double pos[3]; double vel[3]; double att[3]; double ba[3]; double bg[3]; double cov[21]; } insstate_t; typedef struct { double time; double pos[3]; double vel[3]; double att[3]; double ba[3]; double bg[3]; double cov[21]; } insopt_t; typedef struct { double time; double pos[3]; double vel[3]; double att[3]; double ba[3]; double bg[3]; double cov[21]; } insstate_t; typedef struct { double time; double pos[3]; double vel[3]; double att[3]; double ba[3]; double bg[3]; double cov[21]; } insopt_t; typedef struct { double time; double pos[3]; double vel[3]; double att[3]; double ba[3]; double bg[3]; double cov[21]; } insstate_t; typedef struct { double time; double pos[3]; double vel[3]; double att[3]; double ba[3]; double bg[3]; double cov[21]; } insopt_t; typedef struct { double time; double pos[3]; double vel[3]; double att[3]; double ba[3]; double bg[3]; double cov[21]; } insstate_t; typedef struct { double time; double pos[3]; double vel[3]; double att[3]; double ba[3]; double bg[3]; double cov[21]; } insopt_t; typedef struct { double time; double pos[3]; double vel[3]; double att[3]; double ba[3]; double bg[3]; double cov[21]; } insstate_t; typedef struct { double time; double pos[3]; double vel[3]; double att[3]; double ba[3]; double bg[3]; double cov[21]; } insopt_t; typedef struct { double time; double pos[3]; double vel[3]; double att[3]; double ba[3]; double bg[3]; double cov[21]; } insstate_t; typedef struct { double time; double pos[3]; double vel[3]; double att[3]; double ba[3]; double bg[3]; double cov[21]; } insopt_t; typedef struct { double time; double pos[3]; double vel[3]; double att[3]; double ba[3]; double bg[3]; double cov[21]; } insstate_t; typedef struct { double time; double pos[3]; double vel[3]; double att[3]; double ba[3]; double bg[3]; double cov[21]; } insopt_t; typedef struct { double time; double pos[3]; double vel[3]; double att[3]; double ba[3]; double bg[3]; double cov[21]; } insstate_t; typedef struct { double time; double pos[3]; double vel[3]; double att[3]; double ba[3]; double bg[3]; double cov[21]; } insopt_t; typedef struct { double time; double pos[3]; double vel[3]; double att[3]; double ba[3]; double bg[3]; double cov[21]; } insstate_t; typedef struct { double time; double pos[3]; double vel[3]; double att[3]; double ba[3]; double bg[3]; double cov[21]; } insopt_t; typedef struct { double time

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一瞬にして失う

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值