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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人工智能 > pytorch >内容正文

pytorch

Pytorch:GAN生成对抗网络实现二次元人脸的生成

發布時間:2024/9/30 pytorch 100 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Pytorch:GAN生成对抗网络实现二次元人脸的生成 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

github:https://github.com/SPECTRELWF/pytorch-GAN-study

網絡結構

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

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

數據集介紹

使用的是網絡上的二次元人臉數據集,數據集鏈接:
網盤鏈接:https://pan.baidu.com/s/1MFulwMQJ78U2MCqRUYjkMg
提取碼:58v6
其中包含16412張二次元人臉圖像,每張圖片的分辨率為96*96,


只需要在我上一篇文章MNIST手寫數字生成的基礎上修改一下dataload就行,完整代碼可以去github下載

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 Variable from dataloader.face_loader import face_loader import 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=1000, help="number of epochs of training") parser.add_argument("--batch_size", type=int, default=256, 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=96, help="size of each image dimension") parser.add_argument("--channels", type=int, default=3, help="number of image channels") parser.add_argument("--sample_interval", type=int, default=100, 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()transforms = transforms.Compose([transforms.Resize(opt.img_size),transforms.ToTensor(),transforms.Normalize([0.5,0.5,0.5],[0.5,0.5,0.5]), ]) # loaddata train_data = face_loader(transforms) dataloader = torch.utils.data.DataLoader(train_data,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[:256], "new_images/%d.png" % batches_done, nrow=16, normalize=True)torch.save(generator.state_dict(),"G.pth") torch.save(discriminator.state_dict(),"D.pth")

結果

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

第1000次迭代:

這個時候其實就有了人臉的一些基本輪廓了,但細節不好,細節處理是GAN的缺點之一。

第10000次迭代:

第20000次迭代:

第30000次迭代:

第40000次迭代:

從第20000次迭代之后從肉眼上看上去就沒什么進步了。

與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

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

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

主站蜘蛛池模板: 国产一区二区三区影视 | 免费国产成人 | 在线观看免费黄网站 | 亚洲乱亚洲 | 18禁肉肉无遮挡无码网站 | 五十路妻| 操人网| 国产精品污www一区二区三区 | 精品91久久久 | 国产精品无码乱伦 | 女仆乖h调教跪趴1v1 | 成人免费看片'在线观看 | 91网页版 | www.777奇米| 99热国产 | 筱田优全部av免费观看 | 欧美成人一区二免费视频软件 | 青娱乐超碰 | 色综合av综合无码综合网站 | 国产精品欧美大片 | 国产专区一区二区三区 | av免费久久 | 大黄网站在线观看 | 91爱爱视频 | 日韩国产精品一区二区三区 | 一级特黄aa | av福利站| 澳门黄色录像 | 日韩欧美亚洲国产精品字幕久久久 | 成人在线影片 | 久久精品视频观看 | 超碰伊人久久 | 天堂久久精品忘忧草 | 欧美剧场| 久久露脸国语精品国产91 | 成人在线观看国产 | 夜夜爽av | 色无极影院亚洲 | 精品五月天 | 蜜桃av导航 | 在线视频h| 国产精品无码一区二区三区免费 | 国产91专区 | 粉嫩久久99精品久久久久久夜 | 欧美大片在线 | 人妻丰满熟妇av无码区不卡 | 河北彩花中文字幕 | 日韩综合网站 | 欧美美女一级片 | 一边吃奶一边摸做爽视频 | 轻轻色在线观看 | 日韩黄色短片 | 91丨porny丨国产入口 | 色多多视频在线观看 | 91在线色 | 天堂在线中文8 | 久久精品三级 | 国产无遮挡a片又黄又爽 | 古代玷污糟蹋np高辣h文 | 性欧美精品中出 | jizz性欧美17 | 色天使在线视频 | 伊在线久久丫 | 黄色骚视频 | 亚洲在线第一页 | 老牛嫩草二区三区观影体验 | 国产精品第四页 | 女同亚洲精品一区二区三 | 欧美二区在线 | 一区一区三区产品乱码 | 亚洲免费av电影 | 久久久久在线视频 | 亚洲欧美国产高清va在线播放 | 中国女人真人一级毛片 | a视频在线 | 91天天射| 国产区二区| 国产精选视频 | 日本69式三人交 | av在线超碰| 亚洲综合视频一区 | 激情五月婷婷 | 中文字幕日韩电影 | 久久久久国产精品一区 | 熟妇人妻系列aⅴ无码专区友真希 | 老熟妻内射精品一区 | 国产91精品久久久久 | 假日游船法国满天星 | 四虎永久在线精品 | 日本少妇裸体做爰 | 无码专区久久综合久中文字幕 | 国精无码欧精品亚洲一区蜜桃 | 福利一区二区 | 51国产视频 | 亚洲加勒比在线 | 狠狠躁夜夜躁人人爽天天高潮 | 内射一区二区 | 色婷婷97 | 国产无遮挡又黄又爽在线观看 |