当前位置: 首页>編程日記>正文

GAN(生成对抗神经网络)生成MNIST 基于pytorch实现

GAN(生成对抗神经网络)生成MNIST 基于pytorch实现

运行环境

pytorch1.3.0 

简介

生成对抗神经网络分为两部分: 生成器

                                                    鉴别器

生成器

把一个满足高斯分布的向量映射为一个784维度的向量,期望这个784维度的向量就是我们要的图片。对于生成器的监督训练主要是靠鉴别器。

鉴别器

是一个二分类模型,输入是图片向量,输出: 这张图是真图的概率。

训练数据有两种:真图、假图(生成器生成的)

真图对应的label是1、假图对应的label是0

补充

从0.4起, Variable 正式合并入Tensor类,通过Variable嵌套实现的自动微分功能已经整合进入了Tensor类中。虽然为了代码的兼容性还是可以使用Variable(tensor)这种方式进行嵌套,但是这个操作其实什么都没做。

运行方法:把程序粘贴下来保存为 xx.py ,然后最好把xx.py放在一个空的文件夹里面 ,python装好需要的包,就可以运行了

运行后程序会自动再生成两个文件夹,总体长这个样子

本程序数据集会自动下载,如果慢可以使用迅雷下载下来然后放到指定的地方(data\MNIST\raw)。

代码

import torch
import torch.nn as nn
import torchvision
import torch.nn.functional as F
from torchvision import datasets
from torchvision import transforms
from torchvision.utils import save_image
from torch.autograd import Variable
import os#超参数
batch_size = 128
num_epoch = 500
z_dimention = 100
d_optimizer_lr=0.0001
g_optimizer_lr=0.0001
use_gpu=Trueclass discriminator(nn.Module):  #784长度向量 -> (0,1)def __init__(self):super(discriminator, self).__init__()self.dis = nn.Sequential(nn.Linear(784, 256),nn.LeakyReLU(0.2),nn.Linear(256, 256),nn.LeakyReLU(0.2),nn.Linear(256, 1),nn.Sigmoid())def forward(self, x):x = self.dis(x)return xclass generator(nn.Module):  # 100长度向量 -> 784长度向量def __init__(self):super(generator, self).__init__()self.gen = nn.Sequential(nn.Linear(100, 256),nn.ReLU(True),nn.Linear(256, 256),nn.ReLU(True),nn.Linear(256, 784),nn.Tanh())def forward(self, x):x = self.gen(x)return x#784向量 -> 1*28*28
def to_img(x):out = 0.5 * (x + 1)out = out.clamp(0, 1)out = out.view(-1, 1, 28, 28)return outimg_transform = transforms.Compose([transforms.ToTensor(),transforms.Normalize((0.5,), (0.5,))
])mnist = datasets.MNIST(root='./data/', train=True, transform=img_transform, download=True
)dataloader = torch.utils.data.DataLoader(dataset=mnist, batch_size=batch_size,shuffle=True,drop_last=True
)if __name__=='__main__':if not os.path.exists('./img'):os.mkdir('./img')D = discriminator()G = generator()criterion = nn.BCELoss()  # 二分类的交叉熵d_optimizer = torch.optim.Adam(D.parameters(), lr=d_optimizer_lr)g_optimizer = torch.optim.Adam(G.parameters(), lr=g_optimizer_lr)z=torch.FloatTensor(batch_size,z_dimention)if use_gpu:D = D.cuda()G = G.cuda()z = z.cuda()for epoch in range(num_epoch):for i, (img, _) in enumerate(dataloader):img = img.view(batch_size, -1)if use_gpu:real_img = img.cuda()real_label = torch.ones(batch_size).cuda()fake_label = torch.zeros(batch_size).cuda()# =================train discriminatorreal_out = D(real_img)d_loss_real = criterion(real_out, real_label)  # 真实数据对应输出 1real_scores = real_outz.data.normal_(0,1)fake_img1 = G(z)fake_out = D(fake_img1.detach())d_loss_fake = criterion(fake_out, fake_label)fake_scores = fake_outd_loss = d_loss_real + d_loss_faked_optimizer.zero_grad()d_loss.backward()d_optimizer.step()# ===============train generatorz.data.normal_(0,1)fake_img2 = G(z)output = D(fake_img2)g_loss = criterion(output, real_label)g_optimizer.zero_grad()g_loss.backward()g_optimizer.step()if epoch == 0:real_images = to_img(real_img.cpu().data)save_image(real_images, './img/real_images.png')print('Epoch[{}/{}],d_loss:{:.6f},g_loss:{:.6f} D real:{:.6f},D fake:{:.6f}'.format(epoch, num_epoch, d_loss.item(), g_loss.item(), real_scores.data.mean(), fake_scores.data.mean()))fake_images = to_img(fake_img2.cpu().data)save_image(fake_images, './img/fake_images-{}.png'.format(epoch + 1))

实验结果 

epoch=0

 

epoch=10

 

epoch=100

 epoch=200

epoch=500

epoch=2800


https://www.fengoutiyan.com/post/13751.html

相关文章:

  • pytorch搭建自己的神经网络
  • matlab训练神经网络
  • pytorch二均值池化
  • pytorch resnet
  • 神经网络编译器
  • 生成神经网络
  • pytorch神经网络
  • grnn神经网络
  • 鏡像模式如何設置在哪,圖片鏡像操作
  • 什么軟件可以把圖片鏡像翻轉,C#圖片處理 解決左右鏡像相反(旋轉圖片)
  • 手機照片鏡像翻轉,C#圖像鏡像
  • 視頻鏡像翻轉軟件,python圖片鏡像翻轉_python中鏡像實現方法
  • 什么軟件可以把圖片鏡像翻轉,利用PS實現圖片的鏡像處理
  • 照片鏡像翻轉app,java實現圖片鏡像翻轉
  • 什么軟件可以把圖片鏡像翻轉,python圖片鏡像翻轉_python圖像處理之鏡像實現方法
  • matlab下載,matlab如何鏡像處理圖片,matlab實現圖像鏡像
  • 圖片鏡像翻轉,MATLAB:鏡像圖片
  • 鏡像翻轉圖片的軟件,圖像處理:實現圖片鏡像(基于python)
  • canvas可畫,JavaScript - canvas - 鏡像圖片
  • 圖片鏡像翻轉,UGUI優化:使用鏡像圖片
  • Codeforces,CodeForces 1253C
  • MySQL下載安裝,Mysql ERROR: 1253 解決方法
  • 勝利大逃亡英雄逃亡方案,HDU - 1253 勝利大逃亡 BFS
  • 大一c語言期末考試試題及答案匯總,電大計算機C語言1253,1253《C語言程序設計》電大期末精彩試題及其問題詳解
  • lu求解線性方程組,P1253 [yLOI2018] 扶蘇的問題 (線段樹)
  • c語言程序設計基礎題庫,1253號C語言程序設計試題,2016年1月試卷號1253C語言程序設計A.pdf
  • 信奧賽一本通官網,【信奧賽一本通】1253:抓住那頭牛(詳細代碼)
  • c語言程序設計1253,1253c語言程序設計a(2010年1月)
  • 勝利大逃亡英雄逃亡方案,BFS——1253 勝利大逃亡
  • 直流電壓測量模塊,IM1253B交直流電能計量模塊(艾銳達光電)
  • c語言程序設計第三版課后答案,【渝粵題庫】國家開放大學2021春1253C語言程序設計答案
  • 18轉換為二進制,1253. 將數字轉換為16進制
  • light-emitting diode,LightOJ-1253 Misere Nim
  • masterroyale魔改版,1253 Dungeon Master
  • codeformer官網中文版,codeforces.1253 B
  • c語言程序設計考研真題及答案,2020C語言程序設計1253,1253計算機科學與技術專業C語言程序設計A科目2020年09月國家開 放大學(中央廣播電視大學)
  • c語言程序設計基礎題庫,1253本科2016c語言程序設計試題,1253電大《C語言程序設計A》試題和答案200901
  • 肇事逃逸車輛無法聯系到車主怎么辦,1253尋找肇事司機