日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Pytorch:GAN生成对抗网络实现MNIST手写数字的生成

發布時間:2024/9/30 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Pytorch:GAN生成对抗网络实现MNIST手写数字的生成 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

github:https://github.com/SPECTRELWF/pytorch-GAN-study
個人主頁:liuweifeng.top:8090

網絡結構

最近在瘋狂補深度學習一些基本架構的基礎,看了一下大佬的GAN的原始論文,說實話一頭霧水,不是能看的很懂。推薦B站李宏毅老師的機器學習2021的課程,聽完以后明白多了。原始論文中就說了一個generator和一個discriminator的結構,并沒有細節的說具體是怎么去定義的,對新手不太友好,參考了Github的Pytorch-Gan-master倉庫的代碼,做了一下照搬吧,照著敲一邊代碼就明白了GAN的思想了。網上找了一張稍微好點的網絡結構圖:

因為生成對抗網絡需要去度量兩個分布之間的距離,原始的GAN并沒有一個很好的度量,具體細節可以看李宏毅老師的課。導致GAN的訓練會比較困難,而且整個LOSS是基本無變化的,但從肉眼上還是能清楚的看到生成的結果在變好。

數據集介紹

使用的是經典的MNIST數據集,后期會拿一些人臉數據集來做實驗。

generator

# 定義生成器 class Generator(nn.Module):def __init__(self):super(Generator, self).__init__()def block(in_feat, out_feat, normalize=True):layers = [nn.Linear(in_feat, out_feat)]if normalize:layers.append(nn.BatchNorm1d(out_feat, 0.8))layers.append(nn.LeakyReLU(0.2, inplace=True))return layersself.model = nn.Sequential(* block(opt.latent_dim,128,normalize=False),* block(128,256),* block(256,512),* block(512,1024),nn.Linear(1024,int(np.prod(image_shape))),nn.Tanh())def forward(self,z):img = self.model(z)img = img.view(img.size(0),*image_shape)return img

discriminator

class Discriminator(nn.Module):def __init__(self):super(Discriminator,self).__init__()self.model = nn.Sequential(nn.Linear(int(np.prod(image_shape)),512),nn.LeakyReLU(0.2, inplace=True),nn.Linear(512, 256),nn.LeakyReLU(0.2, inplace=True),nn.Linear(256,1),nn.Sigmoid(),)def forward(self, img):img_flat = img.view(img.size(0),-1)validity = self.model(img_flat)return validity

完整代碼:

# !/usr/bin/python3 # -*- coding:utf-8 -*- # Author:WeiFeng Liu # @Time: 2021/11/14 下午3:05import argparse import os import numpy as np import mathimport torchvision.transforms as transforms from torchvision.utils import save_imagefrom torch.utils.data import DataLoader from torchvision import datasets from torch.autograd import Variableimport torch.nn as nn import torch.nn.functional as F import torchos.makedirs('new_images', exist_ok=True)parser = argparse.ArgumentParser() # 添加參數parser.add_argument("--n_epochs", type=int, default=200, help="number of epochs of training") parser.add_argument("--batch_size", type=int, default=1024, help="size of the batches") parser.add_argument("--lr", type=float, default=0.0002, help="adam: learning rate") parser.add_argument("--b1", type=float, default=0.5, help="adam: decay of first order momentum of gradient") parser.add_argument("--b2", type=float, default=0.999, help="adam: decay of first order momentum of gradient") parser.add_argument("--n_cpu", type=int, default=8, help="number of cpu threads to use during batch generation") parser.add_argument("--latent_dim", type=int, default=100, help="dimensionality of the latent space") parser.add_argument("--img_size", type=int, default=28, help="size of each image dimension") parser.add_argument("--channels", type=int, default=1, help="number of image channels") parser.add_argument("--sample_interval", type=int, default=400, help="interval betwen image samples")opt = parser.parse_args() print(opt)image_shape = (opt.channels, opt.img_size, opt.img_size)cuda = True if torch.cuda.is_available() else False# 定義生成器 class Generator(nn.Module):def __init__(self):super(Generator, self).__init__()def block(in_feat, out_feat, normalize=True):layers = [nn.Linear(in_feat, out_feat)]if normalize:layers.append(nn.BatchNorm1d(out_feat, 0.8))layers.append(nn.LeakyReLU(0.2, inplace=True))return layersself.model = nn.Sequential(* block(opt.latent_dim,128,normalize=False),* block(128,256),* block(256,512),* block(512,1024),nn.Linear(1024,int(np.prod(image_shape))),nn.Tanh())def forward(self,z):img = self.model(z)img = img.view(img.size(0),*image_shape)return imgclass Discriminator(nn.Module):def __init__(self):super(Discriminator,self).__init__()self.model = nn.Sequential(nn.Linear(int(np.prod(image_shape)),512),nn.LeakyReLU(0.2, inplace=True),nn.Linear(512, 256),nn.LeakyReLU(0.2, inplace=True),nn.Linear(256,1),nn.Sigmoid(),)def forward(self, img):img_flat = img.view(img.size(0),-1)validity = self.model(img_flat)return validity# lossadversarial_loss = torch.nn.BCELoss()#初始化G和D generator = Generator() discriminator = Discriminator()if cuda:generator.cuda()discriminator.cuda()adversarial_loss.cuda()# loaddata os.makedirs("data/mnist",exist_ok=True) dataloader = torch.utils.data.DataLoader(datasets.MNIST("data/mnist",train = True,download=True,transform = transforms.Compose([transforms.Resize(opt.img_size),transforms.ToTensor(),transforms.Normalize([0.5],[0.5]),])),batch_size=opt.batch_size,shuffle = True )optimizer_G = torch.optim.Adam(generator.parameters(),lr=opt.lr,betas=(opt.b1,opt.b2)) optimizer_D = torch.optim.Adam(discriminator.parameters(),lr=opt.lr,betas=(opt.b1,opt.b2))Tensor = torch.cuda.FloatTensor if cuda else torch.FloatTensor#train for epoch in range(opt.n_epochs):for i ,(imgs,_) in enumerate(dataloader):valid = Variable(Tensor(imgs.size(0),1).fill_(1.0),requires_grad = False)fake = Variable(Tensor(imgs.size(0), 1).fill_(0.0), requires_grad=False)real_imgs = Variable(imgs.type(Tensor))optimizer_G.zero_grad()z = Variable(Tensor(np.random.normal(0,1,(imgs.shape[0],opt.latent_dim))))gen_imgs = generator(z)g_loss = adversarial_loss(discriminator(gen_imgs),valid)g_loss.backward()optimizer_G.step()#train Discriminatoroptimizer_D.zero_grad()real_loss = adversarial_loss(discriminator(real_imgs),valid)fake_loss = adversarial_loss(discriminator(gen_imgs.detach()),fake)d_loss = (real_loss+fake_loss)/2d_loss.backward()optimizer_D.step()print("[Epoch %d/%d] [Batch %d/%d] [D loss: %f] [G loss: %f]"% (epoch, opt.n_epochs, i, len(dataloader), d_loss.item(), g_loss.item()))batches_done = epoch * len(dataloader) + iif batches_done % opt.sample_interval == 0:save_image(gen_imgs.data[:1024], "new_images/%d.png" % batches_done, nrow=32, normalize=True)torch.save(generator.state_dict(),"G.pth") torch.save(discriminator.state_dict(),"D.pth")

結果

GAN網絡的訓練是比較困難的,我設置批大小為1024,訓練了兩百個epoch,給出一些結果。
第0次迭代:

基本上就是純純噪聲了,初始數據采樣來源于標準正態分布。

第400次迭代:

第10000次迭代:

第186800次迭代:

此時就已經基本有了數字的樣子了

總結

以上是生活随笔為你收集整理的Pytorch:GAN生成对抗网络实现MNIST手写数字的生成的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 爱看av| 草草地址线路①屁屁影院成人 | 蜜桃在线一区 | 国产成人在线看 | 国产福利片在线观看 | 亚洲综合色站 | 国产一区二区三区影视 | 亚洲综合免费观看高清完整版 | 97精品视频在线 | 新红楼梦2005锦江版高清在线观看 | 久操综合 | 色婷婷在线观看视频 | 91在线超碰 | www亚洲色图 | 日本一区二区三区四区视频 | 欧美自拍色图 | 国产精品一区二三区 | 狠狠五月 | 摸丰满大乳奶水www免费 | 欧美九九视频 | 欧美韩日一区二区 | 九九热九九热 | 国产精选一区二区三区 | 日本全黄裸体片 | 午夜不卡视频 | 荡女精品导航 | 日本资源在线 | 久草视频在线免费看 | 中文字幕在线免费看线人 | 亚洲精品高清在线 | 无码国产精品96久久久久 | 四虎图库 | 色爽 | 丁香花完整视频在线观看 | 椎名由奈av一区二区三区 | 91成人在线观看喷潮 | 亚洲在线视频免费观看 | 欧美精品一二三四 | 国产原创视频在线 | 肉嫁高柳家 高清 | 亚洲乱妇老熟女爽到高潮的片 | 李华月全部毛片 | 国产在线网站 | 国产毛片一区二区 | 可以看的av网站 | mm1313亚洲国产精品无码试看 | 精品黑人一区二区三区观看时间 | 亚洲国产精品久久久久久6q | jizz欧美大片 | 中文字幕一区二区三区夫目前犯 | 动漫av在线免费观看 | 人人超碰97 | 91在线播| 日韩久久免费视频 | 自拍偷拍麻豆 | 午夜三区 | 国产黄色网页 | 欧美在线资源 | 怎么可能高潮了就结束漫画 | 麻豆国产一区二区三区四区 | 波多野结衣国产在线 | 日韩精品视频一区二区在线观看 | 男插女视频免费 | 99爱免费视频 | 无码人妻一区二区三区在线 | 狠狠操在线观看 | 粉嫩av蜜桃av蜜臀av | 天天干天天做 | 国产精品久久久久久久久久久久久久久久久 | 国产一区免费 | 观看av免费| 欧美韩日| 欧美丰满老妇 | gogo人体做爰大胆视频 | 性色欲网站人妻丰满中文久久不卡 | 日韩精品――色哟哟 | 麻豆视频免费网站 | 国产精品高潮呻吟久久av黑人 | 亚洲精品免费在线 | 午夜丁香网 | 青青草国产精品视频 | 亚洲人人插 | 波多野结衣在线电影 | 日韩精品成人免费观看视频 | 日本va在线 | 亚洲第一黄色网址 | 国产草逼视频 | 亚洲一区二区成人 | 被灌满精子的波多野结衣 | 青青草视频在线观看免费 | 精品www久久久久久奶水 | 亚洲精品成人影视 | 久久综合一区二区三区 | 日韩精品国产精品 | 亚洲综合在线观看视频 | 美女一区二区三区视频 | 少妇被躁爽到高潮 | 爱操av| 涩色网|