本文参考官方博客以及李宏毅老师讲解。
另参考https://blog.csdn.net/sunqiande88/article/details/80219842
关于其中转置卷积和卷积的问题,会另外开一篇。
理论和GAN理论类似,只是在两个模型上做了改进,
论文中详细说明了改进方法。如下:

1.将pooling层替换成带strides的卷积层。
2.消除顶层卷积特征中的全连接层,为了实现更深的网络。顶层特征指的是生成器的输入,以及判别器的输出。
3.使用BatchNorm。直接对所有层使用batchnorm会导致震荡和不稳定。所以在生成器的输出层和辨别其的输入层不用。
4.在生成器中使用ReLU激活,除了输出层,用的是tanh激活。辨别器使用的是leakyReLU激活,尤其对于高分辨率建模。
https://blog.csdn.net/yfy1127yfy/article/details/88822125

导入包:

import argparse
import torch
import torchvision
import torchvision.utils as vutils
import torch.nn as nn
from random import randint

参数:

parser = argparse.ArgumentParser()
parser.add_argument('--batchSize', type=int, default=64)
parser.add_argument('--imageSize', type=int, default=96)
parser.add_argument('--nz', type=int, default=100, help='size of the latent z vector')
parser.add_argument('--ngf', type=int, default=64)
parser.add_argument('--ndf', type=int, default=64)
parser.add_argument('--epoch', type=int, default=25, help='number of epochs to train for')
parser.add_argument('--lr', type=float, default=0.0002, help='learning rate, default=0.0002')
parser.add_argument('--beta1', type=float, default=0.5, help='beta1 for adam. default=0.5')
parser.add_argument('--data_path', default='./face_data/', help='folder to train data')
parser.add_argument('--outf', default='./imgs/', help='folder to output images and model checkpoints')
opt = parser.parse_args()

数据处理:

device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
print(torch.cuda.is_available())
#图像读入与预处理
transforms = torchvision.transforms.Compose([torchvision.transforms.Resize([96, 96]),torchvision.transforms.ToTensor(),torchvision.transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])dataset = torchvision.datasets.ImageFolder(opt.data_path, transform=transforms)dataloader = torch.utils.data.DataLoader(dataset=dataset,batch_size=opt.batchSize,shuffle=True,drop_last=True,
)

torch.utils.data.DataLoader()中drop_last参数。
如果数据集大小不能被批处理大小整除,则将其设置为True以删除最后一个不完整的批处理。如果为False且数据集的大小不能被批处理大小整除,则最后一个批处理将更小。(默认值:False)。建议True。

模型:

class NetG(nn.Module):def __init__(self, ngf, nz):super(NetG, self).__init__()# layer1输入的是一个100x1x1的随机噪声, 输出尺寸(ngf*8)x4x4self.layer1 = nn.Sequential(nn.ConvTranspose2d(nz, ngf * 8, kernel_size=4, stride=1, padding=0, bias=False),nn.BatchNorm2d(ngf * 8),nn.ReLU(inplace=True))# layer2输出尺寸(ngf*4)x8x8self.layer2 = nn.Sequential(nn.ConvTranspose2d(ngf * 8, ngf * 4, 4, 2, 1, bias=False),nn.BatchNorm2d(ngf * 4),nn.ReLU(inplace=True))# layer3输出尺寸(ngf*2)x16x16self.layer3 = nn.Sequential(nn.ConvTranspose2d(ngf * 4, ngf * 2, 4, 2, 1, bias=False),nn.BatchNorm2d(ngf * 2),nn.ReLU(inplace=True))# layer4输出尺寸(ngf)x32x32self.layer4 = nn.Sequential(nn.ConvTranspose2d(ngf * 2, ngf, 4, 2, 1, bias=False),nn.BatchNorm2d(ngf),nn.ReLU(inplace=True))# layer5输出尺寸 3x96x96self.layer5 = nn.Sequential(nn.ConvTranspose2d(ngf, 3, 5, 3, 1, bias=False),nn.Tanh())# 定义NetG的前向传播def forward(self, x):out = self.layer1(x)out = self.layer2(out)out = self.layer3(out)out = self.layer4(out)out = self.layer5(out)return out# 定义鉴别器网络D
class NetD(nn.Module):def __init__(self, ndf):super(NetD, self).__init__()# layer1 输入 3 x 96 x 96, 输出 (ndf) x 32 x 32#64self.layer1 = nn.Sequential(nn.Conv2d(3, ndf, kernel_size=5, stride=3, padding=1, bias=False),nn.BatchNorm2d(ndf),nn.LeakyReLU(0.2, inplace=True))# layer2 输出 (ndf*2) x 16 x 16self.layer2 = nn.Sequential(nn.Conv2d(ndf, ndf * 2, 4, 2, 1, bias=False),nn.BatchNorm2d(ndf * 2),nn.LeakyReLU(0.2, inplace=True))# layer3 输出 (ndf*4) x 8 x 8self.layer3 = nn.Sequential(nn.Conv2d(ndf * 2, ndf * 4, 4, 2, 1, bias=False),nn.BatchNorm2d(ndf * 4),nn.LeakyReLU(0.2, inplace=True))# layer4 输出 (ndf*8) x 4 x 4self.layer4 = nn.Sequential(nn.Conv2d(ndf * 4, ndf * 8, 4, 2, 1, bias=False),nn.BatchNorm2d(ndf * 8),nn.LeakyReLU(0.2, inplace=True))# layer5 输出一个数(概率)self.layer5 = nn.Sequential(nn.Conv2d(ndf * 8, 1, 4, 1, 0, bias=False),nn.Sigmoid())# 定义NetD的前向传播def forward(self,x):out = self.layer1(x)out = self.layer2(out)out = self.layer3(out)out = self.layer4(out)out = self.layer5(out)return out

训练前的设置:

netG = NetG(opt.ngf, opt.nz).to(device)
netD = NetD(opt.ndf).to(device)criterion = nn.BCELoss()
optimizerG = torch.optim.Adam(netG.parameters(), lr=opt.lr, betas=(opt.beta1, 0.999))
optimizerD = torch.optim.Adam(netD.parameters(), lr=opt.lr, betas=(opt.beta1, 0.999))label = torch.FloatTensor(opt.batchSize)
real_label = 1
fake_label = 0

训练:

for epoch in range(1, opt.epoch + 1):for i, (imgs,_) in enumerate(dataloader):# 固定生成器G,训练鉴别器DoptimizerD.zero_grad()## 让D尽可能的把真图片判别为1imgs=imgs.to(device)output = netD(imgs)label.data.fill_(real_label)label=label.to(device)errD_real = criterion(output, label)errD_real.backward()## 让D尽可能把假图片判别为0label.data.fill_(fake_label)noise = torch.randn(opt.batchSize, opt.nz, 1, 1)noise=noise.to(device)fake = netG(noise)  # 生成假图output = netD(fake.detach()) #避免梯度传到G,因为G不用更新errD_fake = criterion(output, label)errD_fake.backward()errD = errD_fake + errD_realoptimizerD.step()# 固定鉴别器D,训练生成器GoptimizerG.zero_grad()# 让D尽可能把G生成的假图判别为1label.data.fill_(real_label)label = label.to(device)output = netD(fake)errG = criterion(output, label)errG.backward()optimizerG.step()print('[%d/%d][%d/%d] Loss_D: %.3f Loss_G %.3f'% (epoch, opt.epoch, i, len(dataloader), errD.item(), errG.item()))vutils.save_image(fake.data,'%s/fake_samples_epoch_%03d.png' % (opt.outf, epoch),normalize=True)
torch.save(netG.state_dict(), '%s/netG_%03d.pth' % (opt.outf, epoch))
torch.save(netD.state_dict(), '%s/netD_%03d.pth' % (opt.outf, epoch))

pytorch学习——DCGAN——生成动漫人物头像相关推荐

  1. pytorch实现DCGAN生成动漫人物头像

    pytorch实现DCGAN生成动漫人物头像 DCGAN原理 参考这一系列文章 数据集 21551张64*64动漫人物头像 生成效果 训练1个epoch(emm-) 训练10个epoch(起码有颜色了 ...

  2. Pytorch 使用DCGAN生成动漫人物头像 入门级实战教程

    有关DCGAN实战的小例子之前已经更新过一篇,感兴趣的朋友可以点击查看 Pytorch 使用DCGAN生成MNIST手写数字 入门级教程 有关DCGAN的相关原理:DCGAN论文解读-----DCGA ...

  3. 使用DCGAN生成动漫人物头像

    使 用 D C G A N 生 成 动 漫 人 物 头 像 使用DCGAN生成动漫人物头像 使用DCGAN生成动漫人物头像 import tensorflow as tf from tensorflo ...

  4. python 动漫卡通人物图片大全,『TensorFlow』DCGAN生成动漫人物头像_下

    一.计算图效果以及实际代码实现 计算图效果 实际模型实现 相关介绍移步我的github项目. 二.生成器与判别器设计 生成器 相关参量, 噪声向量z维度:100 标签向量y维度:10(如果有的话) 生 ...

  5. 『TensorFlow』DCGAN生成动漫人物头像_下

    『TensorFlow』以GAN为例的神经网络类范式 『cs231n』通过代码理解gan网络&tensorflow共享变量机制_上 『TensorFlow』通过代码理解gan网络_中 一.计算 ...

  6. 【GAN实战项目:DCGAN in Tensorflow生成动漫人物头像】代码学习

    目录 一.爬虫代码 二.头像截取 三.训练 四.遇到的问题及处理方法 五.生成效果 DCGAN的原理 和GAN是一样的,只是把G和D换成了两个卷积神经网络(CNN).但不是直接换就可以了,DCGAN对 ...

  7. 深度学习之基于DCGAN实现动漫人物的生成

    注:因为硬件原因,这次的实验并没有生成图片,但是代码应该是没有问题的,可以参考学习一下. 本次基于DCGAN实现动漫人物的生成.最终的效果可以参考大神**K同学啊**的博客.与上篇文章基于DCGAN生 ...

  8. 如何通过DCGAN实现动漫人物图像的自动生成?

    深度学习领域在近几年取得了重大突破,其中大部分研究成果都基于感知技术,计算机通过模仿人类的思维方式,感知物体.识别内容.生成对抗网络的理念由Goodfellow于2014年提出的,它的发展历程只有六年 ...

  9. 基础 | 如何通过DCGAN实现动漫人物图像的自动生成?

    点击上方"机器学习与生成对抗网络",关注"星标" 获取有趣.好玩的前沿干货! 文章来源:淘系技术 背景 基于生成对抗网络(GAN)的动漫人物生成近年来兴起的动漫 ...

最新文章

  1. 国产AI全面崛起!盘点11款2019年热门国产AI芯片
  2. python导入excel文件-python使用xlrd模块读写Excel文件的方法
  3. python3 基础教程: 文件read方法(read、readline、readlines)
  4. Oracle PL SQL 精萃pdf
  5. OpenCASCADE:Modeling Data之3D几何
  6. append 换行_代码风格:答应我,让括号换行吧!!
  7. python邮件发送哪个好_python发邮件(一)
  8. MyBatis入门到精通
  9. 201871010126 王亚涛 《面向对象程序设计(java)》 第四周学习总结
  10. python怎么更新sp2_GitHub - Sp2-Hybrid/Python-100-Days: Python - 100天从新手到大师
  11. java中指数形式的格式_java – 复数的指数形式
  12. 面试mysql索引底层_面试必备之MYSQL索引底层原理分析
  13. 实践材料1(感谢刘望的翻译)
  14. 社保缴费满15年就可以不缴了?6个很多人最关心的问题权威解答来了
  15. PMO和PM如何准备项目状态报告及进行项目进度汇报?【附项目状态表和进度跟踪表】
  16. tf.nn.batch_normalization() 和 tf.layer.batch_normalization()
  17. 树莓派3B——Mailbox
  18. 我为 Redis 找到了一个新家——Redis 之父当年的困兽之斗
  19. 基于值函数逼近的强化学习方法
  20. 向热爱计算机科学的你推荐SICP

热门文章

  1. HTML5七夕情人节表白网页 ❤ 一场浪漫烟花表白 ❤ HTML+CSS+JavaScript
  2. 第一范式 第二范式 第三范式理解
  3. 从maven中央仓库下载jar包
  4. 【Linux】Linux基本指令和工具操作大集合(vim、gcc/g++、gdb、make/makefile、git)
  5. android 正五边形图表,Android 自定义View 仿蚂蚁信用分析----正多边形绘制
  6. 妙味远程课堂-JS热身运动-上
  7. java 火龙劫,火龙畅想圆满完成 最终结果即将揭晓
  8. python循环剪刀石头布_剪刀石头布用python怎么写
  9. 0032-【R-ggplot2]-Rstudio的ggplot可视化插件-esquisse
  10. 【linux内核-insmod Tainted】