pytorch GAN伪造手写体mnist数据集方式

  

<强>一、mnist数据集

  

 pytorch GAN伪造手写体mnist数据集方式

  

形如上图的数字手写体就是mnist数据集。

  

<强>二,甘原理(生成对抗网络)

  

GAN网络一共由两部分组成:一个是伪造器(发电机,简称G),一个是判别器(Discrimniator,简称D)

  

一开始,G由服从某几个分布(如高斯分布)的噪音组成,生成的图片不断送给D判断是否正确,直到G生成的图片连D都判断以为是真的.D每一轮除了看过G生成的假图片以外,还要见数据集中的真图片,以前者和后者得到的损失函数值为依据更新D网络中的权值,因此G和D都在不停地更新权值。以下图为例:

  

 pytorch GAN伪造手写体mnist数据集方式

  

在v1时的G只不过是一堆噪声,见过数据集(真实图像)的D肯定能判断出G所生成的是假的。当然G也能知道D判断它是假的这个结果,因此G就会更新权值,到v2的时候,G就能生成更逼真的图片来让D判断,当然在v2时D也是会先看一次真图片,再去判断G所生成的图片。以此类推,不断循环就是氮化镓的思想。

  

<强>三,训练代码

        进口argparse   进口操作系统   进口numpy np   导入数学      进口torchvision。变换,变换   从torchvision。进口save_image跑龙套      从torch.utils。数据导入DataLoader   从torchvision导入数据集   从火炬。autograd导入变量      进口火炬。神经网络是神经网络   进口torch.nn。功能和F   进口火炬      操作系统。makedirs(“图像”,exist_ok=True)      解析器=argparse.ArgumentParser ()   解析器。add_argument (”——n_epochs”=int类型,默认=200,帮助=芭嘌怠钡氖贝?   解析器。add_argument (”——batch_size”=int类型,默认=64,帮助=芭康拇笮 ?   解析器。add_argument (- lr、类型=浮动,默认=0.0002,帮助=把堑?学习速率”)   解析器。add_argument (“- b1”,类型=浮动,默认=0.5,帮助=把堑?一阶衰减梯度势头”)   解析器。add_argument (”——b2”类型=浮动,默认=0.999,帮助=把堑?一阶衰减梯度势头”)   解析器。add_argument (”——n_cpu”=int类型,默认=8,帮助=笆康腸pu线程使用批处理的一代”)   解析器。add_argument (”——latent_dim”=int类型,默认=100,帮助=扒痹诘奈瓤占洹?   解析器。add_argument (”——img_size”=int类型,默认=28日帮助=懊扛鐾枷癯叽绱笮 ?   解析器。add_argument(”——渠道”,=int类型,默认=1,帮助=笆滞枷裢ǖ馈?   解析器。add_argument (”——sample_interval”=int类型,默认=400,帮助=笆奔浼涓羟昂笸枷裱尽?   选择=parser.parse_args ()   打印(选择)      img_shape=(opt.channels opt.img_size opt.img_size) #确定图片输入的格式为(1,28日28),由于mnist数据集是灰度图所以通道为1   如果torch.cuda.is_available cuda=True()错误         类发生器(nn.Module):   def __init__(自我):   超级(发电机,自我). __init__ ()      def块(in_feat、out_feat正常化=True):   层=(nn。线性(in_feat out_feat)]   如果正常:   layers.append (nn。BatchNorm1d (out_feat, 0.8))   layers.append (nn.LeakyReLU(0.2,原地=True))   返回层      自我。模型=nn.Sequential (   *块(选择。128年latent_dim正常化=False),   *块(128、256),   *块(256、512),   *块(512、1024),   神经网络。线性(1024年,int (np.prod (img_shape))),   nn.Tanh ()   )      def向前(自我,z):   img=self.model (z)   img=img.view (img.size (0) * img_shape)   返回img         类鉴别器(nn.Module):   def __init__(自我):   超级(鉴别器,自我). __init__ ()      自我。模型=nn.Sequential (   nn.Linear (int (np.prod (img_shape)), 512),   nn.LeakyReLU(0.2,原地=True),   神经网络。线性(512、256),   nn.LeakyReLU(0.2,原地=True),   神经网络。线性(256 1),   nn.Sigmoid (),   )      def向前(自我,img):   img_flat=img.view (img.size (0) 1)   效度=self.model (img_flat)   返回有效性         #损失函数   adversarial_loss=torch.nn.BCELoss ()      #发电机和鉴频器进行初始化   发电机发电机=()   鉴频器=鉴别器()      如果cuda:   generator.cuda ()   discriminator.cuda ()   adversarial_loss.cuda ()      #配置数据加载器   os.makedirs (“. ./. ./数据/mnist”, exist_ok=True)   dataloader=torch.utils.data.DataLoader (   datasets.MNIST (   “. ./. ./数据/mnist”,   火车=True,   下载=True,   变换=transforms.Compose (   [transforms.Resize (opt.img_size), transforms.ToTensor (), transforms.Normalize ([0.5], [0.5])]   ),   ),   batch_size=opt.batch_size,   洗牌=True,   )      #优化器   optimizer_G=torch.optim.Adam (generator.parameters (), lr=选择。lr,贝塔=(选择。b1, opt.b2))   optimizer_D=torch.optim.Adam (discriminator.parameters (), lr=选择。lr,贝塔=(选择。b1, opt.b2))      张量=torch.cuda。如果其他cuda torch.FloatTensor FloatTensor      # - - - - - - - - - - -   #培训   # - - - - - - - - - - -   if __name__==癬_main__”:   时代的范围(opt.n_epochs):   因为我(一个_)列举(dataloader):   #打印(imgs.shape)   #对抗地面真理   有效=变量(张量(imgs.size (0) 1) .fill_ (1.0), requires_grad=False) #全1   假=变量(张量(imgs.size (0) 1) .fill_ (0.0), requires_grad=False) #全0   #配置输入   real_imgs=变量(imgs.type(张量))      # - - - - - - - - - - - - - - - - - -   #火车发电机   # - - - - - - - - - - - - - - - - - -      optimizer_G.zero_grad() #清空G网络上一个批次的梯度      #样本噪声发生器输入   (张量(np.random z=变量。正常(0,1,(一个。形状[0],opt.latent_dim)))) #生成的噪音,均值为0方差为1维度为(64100)的噪音   #生成一批图像   gen_imgs=生成器(z)   #发电机损失措施愚弄鉴别器的能力   g_loss=adversarial_loss(鉴频器(gen_imgs),有效)      g_loss.backward () # g_loss用于更新G网络的权值,g_loss于D网络的判断结果有关   optimizer_G.step ()      # - - - - - - - - - - - - - - - - - - - - - - - -   #火车鉴频器   # - - - - - - - - - - - - - - - - - - - - - - - -      optimizer_D.zero_grad() #清空D网络上一个批次的梯度   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null

pytorch GAN伪造手写体mnist数据集方式