这一博文我们来共同学习下DCGAN,也就是深度卷积GAN的意思。

一:DCGAN(Deep Convolutional Generative Adversarial Networks)原理

上图是构造器的结构。
和普通的卷积神经网络很相似,作为GAN发展出来的网络,其实原理和GAN是一样的,是把D模型和D模型网络换成了卷积神经网络,还做了一些结构上的变化,这些变化可以提高网络输出样本的质量和收敛速度。另外顺带提一下,GAN的作用还有就是构造数据的作用,有时候我们无法得到大量的数据,我们可以自己只在一些数据,比如图像数据,可以对图像翻转,旋转,加噪声,锐化,模糊化,卷积等操作,我们还可以利用GAN网络来生成类似于现实的图片,这样得到的信息就会更多。

如下是DCGAN设计技巧

  1. 所有的pooling层使用步幅卷积(判别网络)和微步幅度卷积(生成网络)进行替换;
  2. 在生成网络和判别网络上使用批处理规范化;
  3. 对于更深的架构移除全连接隐藏层;
  4. 在生成网络的所有层上使用ReLU激活函数,除了输出层使用Tanh激活函数;
  5. 在判别网络的所有层上使用LeakyReLU激活函数;

这里是翻译自论文:https://arxiv.org/abs/1511.06434

这几个结构上的改变挺容易明白的,下面我用个简单的例子来实践一下。

二:运行实例(生成Naruto的图片的图片)
今天是10月10号,也是火影迷心中的男神漩涡鸣人的生日,就用DCGAN生成一个漩涡鸣人的照片,

定义构造器

class Generator(nn.Module):def __init__(self):super(Generator, self).__init__()self.genProcess = nn.Sequential(nn.ConvTranspose2d(100, image_size * 8, 4, 1, 0, bias=False),nn.BatchNorm2d(image_size * 8),nn.ReLU(True),nn.ConvTranspose2d(image_size * 8, image_size * 4, 4, 2, 1, bias=False),nn.BatchNorm2d(image_size * 4),nn.ReLU(True),nn.ConvTranspose2d(image_size * 4, image_size * 2, 4, 2, 1, bias=False),nn.BatchNorm2d(image_size * 2),nn.ReLU(True),nn.ConvTranspose2d(image_size * 2, image_size, 4, 2, 1, bias=False),nn.BatchNorm2d(image_size),nn.ReLU(True),nn.ConvTranspose2d(image_size, 3, 4, 2, 1, bias=False),nn.Tanh())def forward(self, x):x = self.genProcess(x)return x

定义判别器

class Discriminator(nn.Module):def __init__(self):super(Discriminator, self).__init__()self.disProcess = nn.Sequential(nn.Conv2d(3, image_size, 4, 2, 1, bias=False),nn.LeakyReLU(0.2, inplace=True),nn.Conv2d(image_size, image_size * 2, 4, 2, 1, bias=False),nn.BatchNorm2d(image_size * 2),nn.LeakyReLU(0.2, inplace=True),nn.Conv2d(image_size * 2, image_size * 4, 4, 2, 1, bias=False),nn.BatchNorm2d(image_size * 4),nn.LeakyReLU(0.2, inplace=True),nn.Conv2d(image_size * 4, image_size * 8, 4, 2, 1, bias=False),nn.BatchNorm2d(image_size * 8),nn.LeakyReLU(0.2, inplace=True),nn.Conv2d(image_size * 8, 1, 4, 1, 0, bias=False),nn.Sigmoid())def forward(self, x):x = self.disProcess(x)return x

这里完整代码如下:
这里完整代码如下:
这里完整代码如下:

import torch
import torch.nn as nn
import torch.optim as optim
import torchvision.datasets as datasets
import torchvision.transforms as transforms
import os
from torch.autograd import Variable
from torchvision.utils import save_image# ===================
# 今天是10.10号,是火影迷男神漩涡鸣人的生日,今天用DCGAN来生成鸣人的生日
# 作品完成的时候是欧洲东三区时间晚上10点多,因此还是赶得上时间的尾巴了。
# Step 1: 加载图片数据===============================================
image_size = 64  # 图片大小
batch_size = 6   # 批量大小,我就只用6个鸣人的图片做个测试的哈,都是从百度上取截图取得的。def preprocess_img(img):out = 0.5 * (img + 1)out = out.clamp(0, 1)out = out.view(-1, 3, 64, 64)return outdata_path = os.path.abspath("D:/software/Anaconda3/doc/3D_Img/")
print (os.listdir(data_path))
# 请注意,在data_path下面再建立一个目录,存放所有图片,ImageFolder会在子目录下读取数据,否则下一步会报错。
dataset = datasets.ImageFolder(root=data_path, transform=transforms.Compose([transforms.Resize(image_size),transforms.CenterCrop(image_size),transforms.ToTensor(),transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5)), ]))
dataloader = torch.utils.data.DataLoader(dataset, batch_size=batch_size, shuffle=True)# Step 2: 定义模型===============================================
# 定义鉴别器网络G
class Generator(nn.Module):def __init__(self):super(Generator, self).__init__()self.genProcess = nn.Sequential(nn.ConvTranspose2d(100, image_size * 8, 4, 1, 0, bias=False),nn.BatchNorm2d(image_size * 8),nn.ReLU(True),nn.ConvTranspose2d(image_size * 8, image_size * 4, 4, 2, 1, bias=False),nn.BatchNorm2d(image_size * 4),nn.ReLU(True),nn.ConvTranspose2d(image_size * 4, image_size * 2, 4, 2, 1, bias=False),nn.BatchNorm2d(image_size * 2),nn.ReLU(True),nn.ConvTranspose2d(image_size * 2, image_size, 4, 2, 1, bias=False),nn.BatchNorm2d(image_size),nn.ReLU(True),nn.ConvTranspose2d(image_size, 3, 4, 2, 1, bias=False),nn.Tanh())def forward(self, x):x = self.genProcess(x)return x# 定义鉴别器网络D
class Discriminator(nn.Module):def __init__(self):super(Discriminator, self).__init__()self.disProcess = nn.Sequential(nn.Conv2d(3, image_size, 4, 2, 1, bias=False),nn.LeakyReLU(0.2, inplace=True),nn.Conv2d(image_size, image_size * 2, 4, 2, 1, bias=False),nn.BatchNorm2d(image_size * 2),nn.LeakyReLU(0.2, inplace=True),nn.Conv2d(image_size * 2, image_size * 4, 4, 2, 1, bias=False),nn.BatchNorm2d(image_size * 4),nn.LeakyReLU(0.2, inplace=True),nn.Conv2d(image_size * 4, image_size * 8, 4, 2, 1, bias=False),nn.BatchNorm2d(image_size * 8),nn.LeakyReLU(0.2, inplace=True),nn.Conv2d(image_size * 8, 1, 4, 1, 0, bias=False),nn.Sigmoid())def forward(self, x):x = self.disProcess(x)return x# Step 3: 定义模型和损失函数和优化器===============================================
# 实例化构造器和生成器
G = Generator()
D = Discriminator()# 定义损失函数,依然用的是二分类的交叉熵损失函数
criterion = nn.BCELoss()
# 和两个模型的优化器
g_optimizer = optim.Adam(G.parameters(), lr=3e-4, betas=(0.9, 0.999))
d_optimizer = optim.Adam(D.parameters(), lr=3e-4, betas=(0.9, 0.999))# 判别器的损失值计算的函数
def discriminator_loss(d_real_decision, d_fake_decision):  # 判别器的 losssize = d_real_decision.shape[0]true_labels = Variable(torch.ones(size, 1)).float()size = d_fake_decision.shape[0]false_labels = Variable(torch.zeros(size, 1)).float()loss = criterion(d_real_decision, true_labels) + criterion(d_fake_decision, false_labels)return loss# 生成器的损失值计算的函数
def generator_loss(g_fake_decision):  # 生成器的 losssize = g_fake_decision.shape[0]true_labels = Variable(torch.ones(size, 1)).float()loss = criterion(g_fake_decision, true_labels)return loss# Step 4: 开始训练===============================================
os.mkdir('D:/software/Anaconda3/doc/3D_Img/dcgan')
num_epochs = 3000  # 循环次数
for epoch in range(num_epochs):for index, imgs in enumerate(dataloader, 0):# step 1,训练判别器img_data = imgs[0]print(img_data.shape)train_batch_size = img_data.size(0)# img_data = img_data.view(train_batch_size, -1) # 这里是展开成[batch_size, w * h] 维度d_real_decision = D(Variable(img_data)) # 训练真实的图片,经过D模型,标签是1d_fake_input = Variable(torch.randn(train_batch_size, 100, 1, 1)) # 生随机数 100 * 1 * 1d_fake_imgs = G(d_fake_input).detach()d_fake_decision = D(d_fake_imgs) # 训练构造的图片,经过D模型,标签是0d_total_error = discriminator_loss(d_real_decision, d_fake_decision)  # 计算判别器的 lossd_optimizer.zero_grad()d_total_error.backward()d_optimizer.step()# step 2,训练生成器g_fake_imgs = G(d_fake_input)g_fake_decision = D(g_fake_imgs) # 训练构造的图片,经过D模型,假想标签是1g_fake_error = generator_loss(g_fake_decision)  # 计算构造器的 lossg_optimizer.zero_grad()g_fake_error.backward()g_optimizer.step()if epoch % 200 == 0:print("Epoch[{}/{}]".format(epoch, index))real_images = preprocess_img(g_fake_imgs.data)save_image(real_images, 'D:/software/Anaconda3/doc/3D_Img/dcgan/test_%d.png' % (epoch))

饲喂的数据是,没错我就在百度上截取了6个:

训练效果如下,感觉很模糊啊,但是已经有鸣人的大致轮廓了,可能是数据太少了:

参考学习:
https://blog.csdn.net/qq_37172182/article/details/103650862
https://www.it610.com/article/1289832950736691200.htm
https://blog.csdn.net/Sophia_11/article/details/107960750
https://zhuanlan.zhihu.com/p/24767059
https://pytorch.org/tutorials/beginner/dcgan_faces_tutorial.html#

Pytorch《DCGAN模型》相关推荐

  1. Pytorch《GAN模型生成MNIST数字》

    这里的代码都是,参考网上其他的博文学习的,今天是我第一次学习GAN,心情难免有些激动,想着赶快跑一个生成MNIST数字图像的来瞅瞅效果,看看GAN的神奇. 参考博文是如下三个: https://www ...

  2. GAN网络生成手写体数字图片

    Keras真香,以前都是用tensorflow来写神经网络,自从用了keras,发现这个Keras也蛮方便的. 目前感觉keras的优点就是方便搭建基于标准网络组件的神经网络,这里的网络组件包括全连接 ...

  3. GAN 模型生成山水画,骗过半数观察者,普林斯顿大学本科生出品

    作者 | 高卫华 出品 | AI科技大本营 近年来,基于生成对抗网络GAN模型,图像生成领域实现了许多有趣的应用,尤其是在绘画创作方面. 英伟达曾在2019年提出一款名叫GauGAN的神经网络作图工具 ...

  4. 深度学习《GAN模型学习》

    前言:今天我们来一起学习下GAN神经网络,上一篇博文我先用pytorch运行了几个网上的代码例子,用于生成MNIST图片,现在我才反过来写GAN的学习,这次反了过来,效果也是很显而易见的,起码有个直观 ...

  5. GAN实战之Pytorch 使用CGAN生成指定MNIST手写数字

    有关条件GAN(cgan)的相关原理,可以参考: GAN系列之CGAN原理简介以及pytorch项目代码实现 其他类型的GAN原理介绍以及应用,可以查看我的GANs专栏 一.数据集介绍,加载数据 依旧 ...

  6. 搭建简单GAN生成MNIST手写体

    Keras搭建GAN生成MNIST手写体 GAN简介 生成式对抗网络(GAN, Generative Adversarial Networks )是一种深度学习模型,是近年来复杂分布上无监督学习最具前 ...

  7. 【Pytorch神经网络理论篇】 24 神经网络中散度的应用:F散度+f-GAN的实现+互信息神经估计+GAN模型训练技巧

    1 散度在无监督学习中的应用 在神经网络的损失计算中,最大化和最小化两个数据分布间散度的方法,已经成为无监督模型中有效的训练方法之一. 在无监督模型训练中,不但可以使用K散度JS散度,而且可以使用其他 ...

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

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

  9. GAN掉人脸识别系统?GAN模型「女扮男装」

    文章来源 新智元 编辑:LRS [新智元导读]人脸识别技术最近又有新的破解方式!一位斯坦福的学生使用GAN模型生成了几张自己的图片,轻松攻破两个约会软件,最离谱的是「女扮男装」都识别不出来. 真的有人 ...

  10. pytorch学习之GAN生成MNIST手写数字

    0.简单介绍: 学深度学习的人必然知道,最基本的GAN模型由一个生成器 G 和判别器 D 组成.生成器用于生成假样本,判别器用于判断样本是真实的还是假的. 在整个训练过程中,生成器努力地让生成的图像更 ...

最新文章

  1. GCC编译选项参数介绍
  2. android怎么播放音频,Android播放音频的两种方式
  3. 是北京晚报!不,是中国最大的讽刺!!!
  4. Swift 中 String 取下标及性能问题
  5. python实现模逆运算
  6. 【Python基础】刷爆网络的动态条形图,3行Python代码就能搞定
  7. 学生信息链表,建立,插入,删除,遍历,查找,修改,最大(小)值,平均...
  8. java 什么是servlet_JavaWeb解释一下什么是 servlet?
  9. linux开机自动挂载硬盘指定权限,Linux开机自动挂载硬盘
  10. iOS自定义组与组之间的距离以及视图
  11. 什么是 XDoclet?
  12. 记录平时发现的一些小知识点
  13. easyUI替换非16x16的图标
  14. html5修改进度条颜色,如何改变HTML5进度条
  15. SQL SERVER 获得当前系统时间
  16. Android实现登录和注册
  17. 联想笔记本电脑键盘灯怎么开启_联想笔记本电脑wifi怎么连接 联想笔记本电脑键盘灯开启方法...
  18. 零库存挑战-分压电阻选择器V1.01【下载地址发布】
  19. Cortex-A7 MPCore 架构
  20. 机器学习与算法(8)--局部加权学习算法(LWR)

热门文章

  1. Scom 2012 中的资源组(Resource Pool)
  2. AjaxFileUploader上传插件 兼容性好
  3. 面试官系统精讲Java源码及大厂真题 - 47 工作实战:Socket 结合线程池的使用
  4. /etc/passwd文件+/etc/shadow文件(图解+字段详解)
  5. arp协议、arp应答出现的原因、arp应答过程、豁免ARP详细解答附图(建议电脑观看)
  6. linux下安装mysql数据库
  7. Windows环境下多个tomcat启动方法
  8. 【Java】用while循环实现1+2+3......+100
  9. 配置hosts快速访问GitHub
  10. CSS和JS两种颜色渐变文字效果代码