pytorch:实现简单的GAN示例(MNIST数据集)


Posted in Python onJanuary 10, 2020

我就废话不多说了,直接上代码吧!

# -*- coding: utf-8 -*-
"""
Created on Sat Oct 13 10:22:45 2018
@author: www
"""
 
import torch
from torch import nn
from torch.autograd import Variable
 
import torchvision.transforms as tfs
from torch.utils.data import DataLoader, sampler
from torchvision.datasets import MNIST
 
import numpy as np
 
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
 
plt.rcParams['figure.figsize'] = (10.0, 8.0) # 设置画图的尺寸
plt.rcParams['image.interpolation'] = 'nearest'
plt.rcParams['image.cmap'] = 'gray'
 
def show_images(images): # 定义画图工具
  images = np.reshape(images, [images.shape[0], -1])
  sqrtn = int(np.ceil(np.sqrt(images.shape[0])))
  sqrtimg = int(np.ceil(np.sqrt(images.shape[1])))
 
  fig = plt.figure(figsize=(sqrtn, sqrtn))
  gs = gridspec.GridSpec(sqrtn, sqrtn)
  gs.update(wspace=0.05, hspace=0.05)
 
  for i, img in enumerate(images):
    ax = plt.subplot(gs[i])
    plt.axis('off')
    ax.set_xticklabels([])
    ax.set_yticklabels([])
    ax.set_aspect('equal')
    plt.imshow(img.reshape([sqrtimg,sqrtimg]))
  return 
  
def preprocess_img(x):
  x = tfs.ToTensor()(x)
  return (x - 0.5) / 0.5
 
def deprocess_img(x):
  return (x + 1.0) / 2.0
 
class ChunkSampler(sampler.Sampler): # 定义一个取样的函数
  """Samples elements sequentially from some offset. 
  Arguments:
    num_samples: # of desired datapoints
    start: offset where we should start selecting from
  """
  def __init__(self, num_samples, start=0):
    self.num_samples = num_samples
    self.start = start
 
  def __iter__(self):
    return iter(range(self.start, self.start + self.num_samples))
 
  def __len__(self):
    return self.num_samples
    
NUM_TRAIN = 50000
NUM_VAL = 5000
 
NOISE_DIM = 96
batch_size = 128
 
train_set = MNIST('E:/data', train=True, transform=preprocess_img)
 
train_data = DataLoader(train_set, batch_size=batch_size, sampler=ChunkSampler(NUM_TRAIN, 0))
 
val_set = MNIST('E:/data', train=True, transform=preprocess_img)
 
val_data = DataLoader(val_set, batch_size=batch_size, sampler=ChunkSampler(NUM_VAL, NUM_TRAIN))
 
imgs = deprocess_img(train_data.__iter__().next()[0].view(batch_size, 784)).numpy().squeeze() # 可视化图片效果
show_images(imgs)
 
#判别网络
def discriminator():
  net = nn.Sequential(    
      nn.Linear(784, 256),
      nn.LeakyReLU(0.2),
      nn.Linear(256, 256),
      nn.LeakyReLU(0.2),
      nn.Linear(256, 1)
    )
  return net
  
#生成网络
def generator(noise_dim=NOISE_DIM):  
  net = nn.Sequential(
    nn.Linear(noise_dim, 1024),
    nn.ReLU(True),
    nn.Linear(1024, 1024),
    nn.ReLU(True),
    nn.Linear(1024, 784),
    nn.Tanh()
  )
  return net
  
#判别器的 loss 就是将真实数据的得分判断为 1,假的数据的得分判断为 0,而生成器的 loss 就是将假的数据判断为 1
 
bce_loss = nn.BCEWithLogitsLoss()#交叉熵损失函数
 
def discriminator_loss(logits_real, logits_fake): # 判别器的 loss
  size = logits_real.shape[0]
  true_labels = Variable(torch.ones(size, 1)).float()
  false_labels = Variable(torch.zeros(size, 1)).float()
  loss = bce_loss(logits_real, true_labels) + bce_loss(logits_fake, false_labels)
  return loss
  
def generator_loss(logits_fake): # 生成器的 loss 
  size = logits_fake.shape[0]
  true_labels = Variable(torch.ones(size, 1)).float()
  loss = bce_loss(logits_fake, true_labels)
  return loss
  
# 使用 adam 来进行训练,学习率是 3e-4, beta1 是 0.5, beta2 是 0.999
def get_optimizer(net):
  optimizer = torch.optim.Adam(net.parameters(), lr=3e-4, betas=(0.5, 0.999))
  return optimizer
  
def train_a_gan(D_net, G_net, D_optimizer, G_optimizer, discriminator_loss, generator_loss, show_every=250, 
        noise_size=96, num_epochs=10):
  iter_count = 0
  for epoch in range(num_epochs):
    for x, _ in train_data:
      bs = x.shape[0]
      # 判别网络
      real_data = Variable(x).view(bs, -1) # 真实数据
      logits_real = D_net(real_data) # 判别网络得分
      
      sample_noise = (torch.rand(bs, noise_size) - 0.5) / 0.5 # -1 ~ 1 的均匀分布
      g_fake_seed = Variable(sample_noise)
      fake_images = G_net(g_fake_seed) # 生成的假的数据
      logits_fake = D_net(fake_images) # 判别网络得分
 
      d_total_error = discriminator_loss(logits_real, logits_fake) # 判别器的 loss
      D_optimizer.zero_grad()
      d_total_error.backward()
      D_optimizer.step() # 优化判别网络
      
      # 生成网络
      g_fake_seed = Variable(sample_noise)
      fake_images = G_net(g_fake_seed) # 生成的假的数据
 
      gen_logits_fake = D_net(fake_images)
      g_error = generator_loss(gen_logits_fake) # 生成网络的 loss
      G_optimizer.zero_grad()
      g_error.backward()
      G_optimizer.step() # 优化生成网络
 
      if (iter_count % show_every == 0):
        print('Iter: {}, D: {:.4}, G:{:.4}'.format(iter_count, d_total_error.item(), g_error.item()))
        imgs_numpy = deprocess_img(fake_images.data.cpu().numpy())
        show_images(imgs_numpy[0:16])
        plt.show()
        print()
      iter_count += 1
 
D = discriminator()
G = generator()
 
D_optim = get_optimizer(D)
G_optim = get_optimizer(G)
 
train_a_gan(D, G, D_optim, G_optim, discriminator_loss, generator_loss)

以上这篇pytorch:实现简单的GAN示例(MNIST数据集)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Windows下用py2exe将Python程序打包成exe程序的教程
Apr 08 Python
Python通过RabbitMQ服务器实现交换机功能的实例教程
Jun 29 Python
python3+PyQt5使用数据库窗口视图
Apr 24 Python
Python数据可视化之画图
Jan 15 Python
Pycharm新建模板默认添加个人信息的实例
Jul 15 Python
QML使用Python的函数过程解析
Sep 26 Python
使用Python将图片转正方形的两种方法实例代码详解
Apr 29 Python
Pycharm新手使用教程(图文详解)
Sep 17 Python
如何让PyQt5中QWebEngineView与JavaScript交互
Oct 21 Python
SpringBoot首页设置解析(推荐)
Feb 11 Python
教你用Python matplotlib库制作简单的动画
Jun 11 Python
python中字符串String及其常见操作指南(方法、函数)
Apr 06 Python
pytorch GAN生成对抗网络实例
Jan 10 #Python
解决pytorch报错:AssertionError: Invalid device id的问题
Jan 10 #Python
python3中关于excel追加写入格式被覆盖问题(实例代码)
Jan 10 #Python
mac使用python识别图形验证码功能
Jan 10 #Python
python列表推导和生成器表达式知识点总结
Jan 10 #Python
pytorch的梯度计算以及backward方法详解
Jan 10 #Python
Python如何获取Win7,Win10系统缩放大小
Jan 10 #Python
You might like
非常好的php目录导航文件代码
2006/10/09 PHP
PHP中函数gzuncompress无法使用的解决方法
2017/03/02 PHP
Yii2框架可逆加密简单实现方法
2017/08/25 PHP
laravel 获取某个查询的查询SQL语句方法
2019/10/12 PHP
工作中常用到的JS表单验证代码(包括例子)
2010/11/11 Javascript
详解Bootstrap的aria-label和aria-labelledby应用
2016/01/04 Javascript
详解AngularJS如何实现跨域请求
2016/08/22 Javascript
D3.js实现散点图和气泡图的方法详解
2016/09/21 Javascript
Vue.js实现价格计算器功能
2020/03/30 Javascript
基于JavaScript实现抽奖系统
2018/01/16 Javascript
Vue实现6位数密码效果
2018/08/18 Javascript
React中使用UEditor百度富文本的方法
2018/08/22 Javascript
Windows下安装 node 的版本控制工具 nvm
2020/02/06 Javascript
Python实现在Linux系统下更改当前进程运行用户
2015/02/04 Python
Python操作MongoDB数据库PyMongo库使用方法
2015/04/27 Python
Python实现计算最小编辑距离
2016/03/17 Python
Python中Collections模块的Counter容器类使用教程
2016/05/31 Python
在Python程序员面试中被问的最多的10道题
2017/12/05 Python
Python实现的凯撒密码算法示例
2018/04/12 Python
pandas将numpy数组写入到csv的实例
2018/07/04 Python
python+splinter实现12306网站刷票并自动购票流程
2018/09/25 Python
对tensorflow中的strides参数使用详解
2020/01/04 Python
TensorFlow实现保存训练模型为pd文件并恢复
2020/02/06 Python
django实现日志按日期分割
2020/05/21 Python
Python API 操作Hadoop hdfs详解
2020/06/06 Python
导致python中import错误的原因是什么
2020/07/01 Python
Python3中的tuple函数知识点讲解
2021/01/03 Python
学点简单的Django之第一个Django程序的实现
2021/02/24 Python
6PM官网:折扣鞋、服装及配饰
2018/08/03 全球购物
New delete 与malloc free 的联系与区别
2013/02/04 面试题
大学生村官考核材料
2014/05/23 职场文书
党员查摆四风问题思想汇报
2014/10/25 职场文书
综合素质评价个性发展自我评价
2015/03/06 职场文书
2015年社会实践个人总结
2015/03/06 职场文书
个人总结格式范文
2015/03/09 职场文书
Nginx+Tomcat负载均衡多实例详解
2022/04/11 Servers