pytorch实现dcgan_Pytorch使用MNIST数据集实现基础GAN和DCGAN详解

本文详细介绍了如何使用PyTorch实现基础的生成对抗网络(GAN)和深度卷积生成对抗网络(DCGAN),并以MNIST数据集为例进行训练。通过交替训练判别器和生成器,逐步优化网络性能。文章展示了不同训练次数下的生成图像效果,探讨了超参数对结果的影响,并指出CGAN在生成指定数字上的优势。
摘要由CSDN通过智能技术生成

原始生成对抗网络Generative Adversarial Networks GAN包含生成器Generator和判别器Discriminator,数据有真实数据groundtruth,还有需要网络生成的“fake”数据,目的是网络生成的fake数据可以“骗过”判别器,让判别器认不出来,就是让判别器分不清进入的数据是真实数据还是fake数据。总的来说是:判别器区分真实数据和fake数据的能力越强越好;生成器生成的数据骗过判别器的能力越强越好,这个是矛盾的,所以只能交替训练网络。

需要搭建生成器网络和判别器网络,训练的时候交替训练。

首先训练判别器的参数,固定生成器的参数,让判别器判断生成器生成的数据,让其和0接近,让判别器判断真实数据,让其和1接近;

接着训练生成器的参数,固定判别器的参数,让生成器生成的数据进入判别器,让判断结果和1接近。生成器生成数据需要给定随机初始值

线性版:

import torch

from torch.utils.data import DataLoader

from torchvision.datasets import MNIST

from torchvision import transforms

from torch import optim

import torch.nn as nn

import matplotlib.pyplot as plt

import numpy as np

import matplotlib.gridspec as gridspec

def showimg(images,count):

images=images.detach().numpy()[0:16,:]

images=255*(0.5*images+0.5)

images = images.astype(np.uint8)

grid_length=int(np.ceil(np.sqrt(images.shape[0])))

plt.figure(figsize=(4,4))

width = int(np.sqrt((images.shape[1])))

gs = gridspec.GridSpec(grid_length,grid_length,wspace=0,hspace=0)

# gs.update(wspace=0, hspace=0)

print('starting...')

for i, img in enumerate(images):

ax = plt.subplot(gs[i])

ax.set_xticklabels([])

ax.set_yticklabels([])

ax.set_aspect('equal')

plt.imshow(img.reshape([width,width]),cmap = plt.cm.gray)

plt.axis('off')

plt.tight_layout()

print('showing...')

plt.tight_layout()

plt.savefig('./GAN_Image/%d.png'%count, bbox_inches='tight')

def loadMNIST(batch_size): #MNIST图片的大小是28*28

trans_img=transforms.Compose([transforms.ToTensor()])

trainset=MNIST('./data',train=True,transform=trans_img,download=True)

testset=MNIST('./data',train=False,transform=trans_img,download=True)

# device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")

trainloader=DataLoader(trainset,batch_size=batch_size,shuffle=True,num_workers=10)

testloader = DataLoader(testset, batch_size=batch_size, shuffle=False, num_workers=10)

return trainset,testset,trainloader,testloader

class discriminator(nn.Module)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值