当前位置:网站首页>【研究生工作周报】(第十二周)
【研究生工作周报】(第十二周)
2022-08-09 14:56:00 【wangyunpeng33】
项目场景:
CVPR 2020 风格迁移之NICE-GAN
基本信息
- Reusing Discriminators for Encoding: Towards Unsupervised Image-to-Image Translation
- 《重用判别器进行编码:实现无监督的图像到图像翻译》
- 源码
分析与结论:
通过t-SNE可视化隐层编码,并利用Maximum Mean Discrepancy(MMD)以计算隐层空间两个编码分布的差异。通过NICE的训练,两个域的隐层空间分布变得更加聚集和紧密,但彼此依然可分。这种现象解释了为什么NICE-GAN表现出色。基于共享隐层空间假设构建的NICE-GAN,通过缩短低维隐层空间中域之间的转换路径,可能会促进高维图像空间的域的转换。同时进一步支持了一个重要观点:对比由通过最大似然训练的编码器网络学习的特征,由经过判别训练的网络学习到的特征往往更具表现力,也更适合推理。在NICE-GAN中,编码器也成为分布距离度量函数的一部分,而生成器只需要从隐层分布中提取循环一致性信息并拟合目标域分布。这种简单解耦的明确分工,有望引起人们对判别器实际作用的重新思考,它可能会刷新基于GAN的诸多任务的实现框架。
关键参数
以下是源码中的一些关键参数,根据GPU的情况,尝试做了一些调整
def parse_args():
desc = "Pytorch implementation of NICE-GAN"
parser = argparse.ArgumentParser(description=desc)
parser.add_argument('--phase', type=str, default='train', help='[train / test]')
parser.add_argument('--light', type=str2bool, default=False, help='[NICE-GAN full version / NICE-GAN light version]')
parser.add_argument('--dataset', type=str, default='YOUR_DATASET_NAME', help='dataset_name')
parser.add_argument('--iteration', type=int, default=300000, help='The number of training iterations')
parser.add_argument('--batch_size', type=int, default=4, help='The size of batch size')
parser.add_argument('--print_freq', type=int, default=1000, help='The number of image print freq')
parser.add_argument('--save_freq', type=int, default=100000, help='The number of model save freq')
parser.add_argument('--decay_flag', type=str2bool, default=True, help='The decay_flag')
parser.add_argument('--lr', type=float, default=0.0001, help='The learning rate')
parser.add_argument('--weight_decay', type=float, default=0.0001, help='The weight decay')
parser.add_argument('--adv_weight', type=int, default=1, help='Weight for GAN')
parser.add_argument('--cycle_weight', type=int, default=10, help='Weight for Cycle')
parser.add_argument('--recon_weight', type=int, default=10, help='Weight for Reconstruction')
parser.add_argument('--ch', type=int, default=64, help='base channel number per layer')
parser.add_argument('--n_res', type=int, default=6, help='The number of resblock')
parser.add_argument('--n_dis', type=int, default=7, help='The number of discriminator layer')
parser.add_argument('--img_size', type=int, default=256, help='The size of image')
parser.add_argument('--img_ch', type=int, default=3, help='The size of image channel')
parser.add_argument('--result_dir', type=str, default='results', help='Directory name to save the results')
parser.add_argument('--device', type=str, default='cuda', choices=['cpu', 'cuda'], help='Set gpu mode; [cpu, cuda]')
parser.add_argument('--benchmark_flag', type=str2bool, default=False)
parser.add_argument('--resume', type=str2bool, default=False)
parser.add_argument('--gradient_penalty_weight', type=float, default=10.0)
parser.add_argument('--n_downsampling', type=int, default=2, help='The number of downsampling')
return check_args(parser.parse_args())
训练和测试
训练
# 显卡16G不够用,所以设置 --light True
python main.py --dataset horse2zebra --light True
# 指定多卡训练的方式如下
CUDA_VISIBLE_DEVICES=0,1 python main.py --dataset horse2zebra --light True
# nohup 把训练进程放到后台
nohup python main.py --dataset horse2zebra --light True &
测试
python main.py --dataset horse2zebra --phase test --light True
1.问题描述
提示:这里描述项目中遇到的问题:
RuntimeError: Found 0 files in subfolders of: dataset/face20000/trainA
Supported extensions are: .jpg,.jpeg,.png,.ppm,.bmp,.pgm,.tif
原因分析:
类似错误,是因为数据集结构不完整;
解决方案:
测试时,代码默认也需要 trainA、trainB 里面有至少一个数据;
2.问题描述
RuntimeError: CUDA out of memory. Tried to allocate 1024.00 MiB (GPU 0; 15.75 GiB total capacity; 13.78 GiB already allocated; 782.44 MiB free; 499.74 MiB cached)
原因分析:
单卡训练,NICE-GAN full version 训练, 【16G】GPU 不够用
解决方案:
经验证换用 24 G 以上更大内存的 GPU 进行训练,不会遇到该错误,即进行【NICE-GAN full version】训练
训练时,追加参数 --light True 即进行【NICE-GAN light version】训练
3.问题描述
该模型训练中一次保存,大小 1.2 个G
–batch_size == 1 时,GPU 占用 7679MiB
–batch_size == 2 时,GPU 占用 12473MiB
–batch_size == 4 时,16G 的GPU就不够用啦
原因分析:
在 GPU 足够大、数量足够多的情况下,batch_size 设置大一些,理论上模型训练更快
对于一些模型、batch_size 也未必越大越好、都有待验证
对于这个【 GAN 类型 】代码来说,模型的训练次数越多,并不一定效果就越好
因此,可以多保存中间生成的模型,来手动验证 风格迁移效果
解决方案:
# 指定多卡训练的方式如下
CUDA_VISIBLE_DEVICES=0,1 python main.py --dataset horse2zebra --light True
4.问题描述
为了保证模型效果,迭代次数较多,而学习率很小,这就导致训练时间可能要上百个小时,如果中间中断,是否就意味着重新训练?
原因分析:
resume训练,代码可以成功加载之前保存的 model
解决方案:
python main.py --dataset dog2cat --iteration 200000 --resume True --light True
trace code可知 模型resume训练会读取之前模型的参数和learning rate,所以如果训练中断,我们保持总的迭代次数,resume训练就可以正常衔接。
decay_flag为true时,重新计算lr:
训练策略
- Gan 网络的模型训练本身就有很多不稳定性、不确定性存在
- 改进策略,数据集 trainA 和 trainB 风格尽量一致
- 训练时,可以考虑更小的iteration间隔 保存一次模型 这样可以得到多个生成模型,然后一一测试
- 只能说,iteration次数越多,理论上训练效果相对会更好,但是实际应用中,效果好的模型未必就是训练次数最大的那次得到的模型
训练时间较长,暂时贴一下中间结果吧
apple to orange:
horse to zebra:
李宏毅学习笔记40.GAN.专题
(先mark一下GAN的发展历程,为后续学习GAN提供方向)
本节是助教主讲GAN的专题回顾,主要内容包括:
·Recap
·SAGAN
·BigGAN
·SinGAN
·GauGAN
·GANILLA
·NICE-GAN
上图涵盖了2014年到2019年GAN模型的发展
其中左边的分支代表模型的稳定度的发展(数学角度)
ImprovedGAN(2016)的作者和GAN(2014)的作者相同,不过ImprovedGAN对原始的GAN做了一些改进。
WGAN(2017)改进了测量两个分布的方式。
WGAN(2017)提出了一种思想,具体实现是在WGAN-GP(2017)
这个分支的终点是SNGAN(2018),从数学上用最完美的方法来解决GAN.
右边的大分支是GAN在CV领域的应用,因此里面大量用到了CNN.
边栏推荐
猜你喜欢
随机推荐
[Elementary C language] Detailed explanation of branch statements
strlen(), strcpy(), strncpy(), strcat(), strncat(), strcmp(), strncmp()函数的封装
为什么要学编译原理
个人域名备案详细流程(图文并茂)
解决跨域问题的三种方式
How to create a new project with VS+Qt
抱抱脸(hugging face)教程-中文翻译-分享一个模型
(精中求精) rem适配布局
你知道亚马逊代运营的成本是多少吗?
鸡生蛋,蛋生鸡问题。JS顶级对象Function,Object关系
抱抱脸(hugging face)教程-中文翻译-创建一个自定义架构
Basic principles and common methods of digital image processing
More than pytorch from zero to build neural network to realize classification (training data sets)
Simple analysis of regularization principle (L1 / L2 regularization)
路由的懒加载与接口的封装
pyspark explode时增加序号
【小白必看】初始C语言(上)
WebGL:BabylonJS入门——初探:我的世界
smote 采样
Region实战SVG地图点击









