GAN系列:论文阅读——SimGAN( Simulated + Unsupervised Learning )

本文介绍无监督学习模型SimGAN,它由refiner和判别器组成,通过对抗使合成假图像更逼真且保留标注信息。文中阐述其架构、目标函数,还利用训练技巧改进模型性能,实验结果显示修正图像能提升模型预测能力,可用于数据扩增。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

把对抗思想用于改善生成图像的质量:保留生成图像重要的语义/标注信息,生成细节部分,使得图像更加逼真(即simulate)。训练对抗网络仅需要图像,不需要任何标注信息(unsupervised)。获得的图像称为refined images可以作为数据用于训练其他模型,相当于数据扩增,能使模型能力大幅度提升。该文主要内容:

1. 定义无监督学习模型SimGAN对合成的假图像进一步修正(refine)使其更逼真;

2. 修改SimGAN中的目标函数使修正后的图像能保留标注信息;

3. 改进模型的训练框架,稳定训练过程和控制refiner的结果。

一:SimGAN架构

SimGAN由refiner和判别器两部分组成,因此区别于普通GAN中生成器和判别器的对抗,这里是refiner和判别器进行对抗。算法如下图所示,可知refiner的输入是合成的假图像x_i,输出是修正过的图像R_\theta(x_i)。判别器的输入是修正过的图像R_\theta(x_i)和真实图像y_j(注意下标i和j,说明判别器的输入图像不是对应关系),输出是图像为修正的概率。借助判别器,SimGAN不断强化refiner的能力,使其得到更高质量的修正图像。其实和GAN原理相同,只不过生成器生成的内容改变了一点。

以gaze的实验为例,refiner网络R_\theta主体是残差结构,4个残差块(residual block)叠加,每个残差块中包含两个卷积层,卷积核大小3*3,输出64个特征图。最后的残差块接一个卷积核大小1*1的卷积层,输出一张特征图作为refined synthetic image,如下图所示:左侧为自己画的具体结构图,右侧为论文中残差模块的示意图。

注意:看了一下代码,残差应该是和残差块输入进行了element-wise相加,因此有相同的通道数。所以在残差模块前必须将输入图像batch变换到64个channels。代码里是通过卷积核为3*3,无步幅(因此尺度不变)的卷积实现的,共64个卷积核,因此得到的特征图是64个。然后才输入到四个连续的残差块中。因此下图input后应更改为加入一个卷积层,然后再进入ResNet Block。

        

判别器网络D_\phi中包含5个卷积层和2个最大池化层,具体结构如下图:

由此可知,整个对抗网络是全卷积网络,并且refiner中的卷积均没有stride,也没有池化层,这使得每层的操作都能保留全局/每个像素的信息(如果卷积有步长,是会漏掉部分信息的;池化同理;而全连接则会失去图像的空间结构)。论文中还提到refiner网络和判别器网络的最后一层感受野大小是接近的,这个还不是很明白,要看代码再计算一下。

二:SimGAN目标函数

目标函数的形式根据模型的目的而改变,SimGAN的目的是让合成图像更加真实,必须要保留其标注信息。普通的GAN进行无监督学习生成的图像是随机的,具有一定的不可控性。那么SimGAN如何生成标注信息不变(也就是图像的关键语义信息必须保留)又更加真实的图像呢?

让图像更真实可以借助判别器,和普通GAN的原理相同,因此SimGAN中refiner的目标函数中保留了该项:\sum_{i}l_{real}(\theta;\tilde{x}_i,y),用于为合成图像增加真实性;另一方面,保留图像的标注/语义信息,是通过最小化refiner输入输出图像间的像素差值实现的,这部分在目标函数中体现为:\lambda l_{reg}(\theta;\tilde{x}_i,x_i)

原文中提到,想让合成的图像更真实,就相当于在合成图像和真实图像间建立桥梁,让合成图像沿着该桥梁走即可。这个桥梁的建立就是依靠了GAN的思想,判别器D_\phi的作用就是判别一张图像是修正的还是真实的,因此目标函数为:

L_D(\phi)=-\sum _ilog(D_\phi(\tilde{x_i}))-\sum _j1-log(D_\phi(y_j))

注意:该形式下,判别器是给修正图像高分,给真实图像低分。因此实验中计算交叉熵损失时,修正图像的标签为1,真实图像标签为0。

借助判别器的输出,refiner关于增强真实性的式子为\sum_{i}l_{real}(\theta;\tilde{x}_i,y)=-\sum _{i}log(1-D_\phi(R_\theta(x_i)));关于另一部分\lambda l_{reg}(\theta;\tilde{x}_i,x_i),保留标注信息其实有点抽象,文中举例为:对于gaze estimation的图像,不可以改变gaze direction;对于手势识别,不能改变关键点位置。\lambda l_{reg}(\theta;\tilde{x}_i,x_i)在文中称作self-regularization loss,定义为refiner输入输出间像素差值的L1范数。因此refiner的目标函数完整形式为:L_R(\theta)=-\sum _ilog(1-D_\phi(R_\theta(x_i)))+\lambda\left \| R_\theta(x_i)-x_i \right \|_1

另外,refiner毕竟是个生成的过程,可能会生成某些artifacts的部分隐藏在整张图像中试图蒙混过关(是不是之前李宏毅老师提到的夹带小抄的做法?),因此该论文中的判别器不针对整张图像判别,而是对一张图像的patches进行判别(原理是修正图像的patch也是修正的,判别器应该具有识别它们的能力,有点赶鸭子上架的感觉,强迫判别器进化)。这个方法的另一个好处是,一张图像可以得到多个patches,相当于数据集扩增了好几倍。基于大量数据,refiner和判别器的性能都会有所提升。因此判别器的输出不是一个标量,而是具有W*H的空间结构,表示一张图像的W*H个patches,每一个patch的得分。因此目标函数中包含了判别器的值都是多个patches的交叉熵损失的和,如下图所示:

三:模型性能改进

GAN的训练有一个难收敛的问题,前面听李宏毅老师的课程时提到过,最后通过WGAN进行了改进。这篇论文也利用了一些训练中的技巧改善了这个问题。GAN的训练过程是先优化判别器,最优判别器得到的就是生成图像和真实图像分布间的JS散度,然后在所有JS散度中找到最小的以完成生成器的优化。然而,由于图像是高维空间的低维流形,生成图像和真实图像的分布很大概率上是互不重叠的,导致不同的最优判别器得到的JS散度都是相同的,自然不会为生成器的更新提供梯度,导致了整个模型的不收敛,因此一般会说不要把判别器训练得太好。本论文中使用的技巧是,将之前refiner的输出缓存,结合当前refiner的输出,各自占比一半,作为输入更新判别器的参数,如下图所示:(私以为该方法有效是因为,把过去refiner的输出和当前的修正图像结合,相当于改变了当前或者说是最近几次refiner输出的修正图像的分布,因此判别器就算很强,因为输入分布变化了,也不再适用该判别器了,那么判别器优化后的结果就不是两个分布间的JS散度,就不容易出现梯度消失的现象)。

该方法的原理基础是:即使是之前refiner的输出,也永远是修正图像而不是真实图像,更新的判别器也应该具有识别该修正图像的能力。因此该方法另一个作用就是,让判别器时刻记住之前的修正图像特点,不会只针对当前refiner的输出进行自我进化(因为GAN的训练特点就是refiner和判别器交替更新,refiner也是时刻改变的,当前refiner的映射已经不同于之前,判别器如果只学习当前的映射关系是过于片面的,判别器的效果就会不稳定)。

本文的实验结果很全面,一方面可视化了修正图像和原本的合成图像,如下图所示:

可以看到眼睛附近的皮肤细节被生成了,但gaze direction并没有改变。

另一方面,通过观察者的辨别结果展示了修正图像以假乱真的能力,如下图所示:51.7%的概率说明修正图像对于人眼来说已经很接近真实图像了。

同时,下面的曲线图将这种以假乱真的能力量化了,量化方法是用一个CNN网络预测gaze direction,预测结果编码为一个三维向量,计算分别用修正图像和真实图像训练CNN后的预测结果之间的L2 loss,结果如下图:

可以看到,修正后的图像作为训练集明显提升了模型的预测能力。

同时,论文也提供了最直观的模型预测错误率指标作为参考:

这篇论文的内容大概就是这些,总体上通过无监督学习的方式refine合成图像,同时不改变其标注信息,这使得其可以作为数据扩增的方法(注意:合成图像的标注信息可以是通过conditional GAN得到的,SimGAN保留了标注信息也相当于保留了标签,相当于产生了真实的带标签数据,可用于监督学习和非监督学习)。

<think>好的,我现在需要帮助用户解决在Win10上安装Docker Desktop后更换镜像源的问题。首先,用户提到参考了三个引用内容,我需要仔细分析这些引用中的信息,并整理出正确的步骤。 首先,引用[2]提到可以添加多个国内镜像源地址,比如Docker中国区官方镜像、网易和中科大的地址。这说明用户需要修改Docker Desktop的配置来添加这些镜像源。但引用[1]和[3]指出,直接在设置中修改可能不生效,可能需要通过WSL2来处理。 接下来,引用[3]详细描述了通过命令行操作WSL来导出和导入镜像数据,涉及到关闭WSL、导出数据等步骤。这可能是因为直接修改Docker Desktop的镜像存储位置或镜像源设置后,Docker没有正确应用这些更改,需要重启或重新配置WSL。 用户的问题集中在更换镜像源的教程上,因此需要将步骤分为修改镜像源和可能的存储位置调整。但根据引用[1]的情况,修改镜像源可能没有生效,所以需要检查步骤是否正确,或者是否有其他注意事项。 现在我需要将这些信息整合成一个清晰的步骤指南,确保用户能够正确更换镜像源。同时,需要注意可能的常见问题,比如设置未生效时的解决方法,如重启Docker或使用命令行重启WSL服务。此外,用户可能需要同时添加多个镜像源,因此要说明在Docker Desktop的配置文件中如何正确添加多个地址。 最后,生成相关问题,帮助用户进一步解决可能遇到的关联问题,比如修改镜像存储位置、处理设置未生效的情况等。</think>### Win10 Docker Desktop更换国内镜像源教程 #### 步骤说明 1. **打开Docker Desktop设置** - 右键点击系统托盘区Docker图标,选择"Settings" - 进入`Docker Engine`配置页面 2. **修改配置文件** 在编辑区域添加registry-mirrors配置项(多个镜像源用逗号分隔): ```json { "registry-mirrors": [ "https://registry.docker-cn.com", "http://hub-mirror.c.163.com", "https://docker.mirrors.ustc.edu.cn" ] } ``` 注意:配置文件路径为`%USERPROFILE%\.docker\daemon.json`[^2] 3. **应用配置** - 点击"Apply & Restart"按钮 - 等待Docker服务重启完成(约1-2分钟) 4. **验证配置** ```bash docker info ``` 在输出中查看`Registry Mirrors`字段是否包含配置的镜像地址 #### 常见问题处理 1. **设置未生效的情况** - 执行`wsl --shutdown`关闭WSL子系统[^3] - 重启Docker Desktop服务 - 检查防火墙是否拦截了镜像源连接 2. **镜像源失效处理** - 尝试切换不同镜像源地址 - 测试镜像拉取速度: ```bash docker pull ubuntu:latest ``` #### 注意事项 - 推荐同时配置多个镜像源以提高可用性 - 部分企业网络可能需要单独配置代理 - 镜像源变更不影响已有本地镜像
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值