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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

基于GAN的动漫头像生成

發布時間:2023/12/18 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于GAN的动漫头像生成 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

GAN的原理

GAN是一種典型的生成網絡模型,它類似于編解碼結構,通過訓練,他能夠生成不同于訓練集的各種圖片。

首先先訓練判別器,把真圖通過判別器的輸出和真標簽作損失,把假圖通過判別器的輸出和假標簽作損失,讓它具備判別真圖和假圖的能力。然后再訓練生成器,把生成器生成的假圖通過判別器的輸出和真標簽作損失。經過反復的訓練,讓判別器難以分辨生成圖的真假,也就是讓它判別為真或為假的概率各為0.5

數據集下載

網上下載的動漫頭像數據集有很多不清晰的奇異樣本,對此我做了清洗,剩下的都是符合標準的,可直接下載
百度網盤:https://pan.baidu.com/s/1–zFrJdg1gtW2wJ6wtWQsQ
密碼:bu55

網絡結構

生成網絡

相當于一個編碼器

class NetD(nn.Module):# 構建一個判別器,相當與一個二分類問題, 生成一個值def __init__(self):super(NetD, self).__init__()ndf = opt.ndfself.main = nn.Sequential(# 輸入96*96*3nn.Conv2d(3, ndf, 5, 3, 1, bias=False),nn.LeakyReLU(negative_slope=0.2, inplace=True),# 輸入32*32*ndfnn.Conv2d(ndf, ndf * 2, 4, 2, 1, bias=False),nn.BatchNorm2d(ndf * 2),nn.LeakyReLU(0.2, True),# 輸入16*16*ndf*2nn.Conv2d(ndf * 2, ndf * 4, 4, 2, 1, bias=False),nn.BatchNorm2d(ndf * 4),nn.LeakyReLU(0.2, True),# 輸入為8*8*ndf*4nn.Conv2d(ndf * 4, ndf * 8, 4, 2, 1, bias=False),nn.BatchNorm2d(ndf * 8),nn.LeakyReLU(0.2, True),# 輸入為4*4*ndf*8nn.Conv2d(ndf * 8, 1, 4, 1, 0, bias=True),nn.Sigmoid() # 分類問題)def forward(self, x):return self.main(x).view(-1)

生成器

相當于一個解碼器

class NetG(nn.Module):# 定義一個生成模型,通過輸入噪聲來產生一張圖片def __init__(self):super(NetG, self).__init__()ngf = opt.ngfself.main = nn.Sequential(# 假定輸入為一張1*1*opt.nz維的數據(opt.nz維的向量)nn.ConvTranspose2d(opt.nz , ngf * 8, 4, 1, 0, bias=False),nn.BatchNorm2d(ngf * 8),nn.ReLU(inplace=True),# 輸入一個4*4*ngf*8nn.ConvTranspose2d(ngf * 8, ngf * 4, 4, 2, 1, bias=False),nn.BatchNorm2d(ngf * 4),nn.ReLU(True),# 輸入一個8*8*ngf*4nn.ConvTranspose2d(ngf * 4, ngf * 2, 4, 2, 1, bias=True),nn.BatchNorm2d(ngf * 2),nn.ReLU(True),# 輸入一個16*16*ngf*2nn.ConvTranspose2d(ngf * 2, ngf, 4, 2, 1, bias=False),nn.BatchNorm2d(ngf),nn.ReLU(inplace=True),# 輸入一個32*32*ngfnn.ConvTranspose2d(ngf, 3, 5, 3, 1, bias=False),nn.Tanh()# 輸出一張96*96*3)def forward(self, x):return self.main(x)

GAN網絡結構設計要點

1、在D網絡中用stride卷積(stride>1)代替pooling層,在G網絡中用conv2d_transpose代替上采樣層
2、在G和D網絡中直接將BN應用到所有層會導致樣本震蕩和模型不穩定,通過在G網絡輸出層和D網絡輸入層不采用BN層可以有效防止這種現象
3、不使用全連接層作為輸出
4、G網絡中除了輸出層用tanh激活,其他層都是用ReLu激活
5、D網絡中都使用LeakyReLu激活

網絡模型訓練

訓練細節

1、預處理環節,將圖像scale到tanh的[-1,1]
2、所有的參數初始化由(0,0.02)的正態分布中隨機得到
3、LeakyReLu的斜率是0.2(默認)
4、優化器Adam的learning rate=0.0002,momentum參數betas的beta1從0.9降為0.5,beta2默認,防止震蕩和不穩定
5、可以G網絡訓練1次,然后D網絡訓練1次,如此反復;也可以G網絡先訓練幾次后,D網絡再訓練1次,如此反復。前者效果出得較快,后者較慢。
訓練代碼

# opt參數 ngf=96 ndf=96 nz=256 img_size=96 batch_size=100 num_workers=4 netg_path=r"網絡參數/netg_5.pt" netd_path=r"網絡參數/netd_5.pt" lr1=0.0002 lr2=0.0002 beta1=0.5 epochs=200 d_every=1 g_every=5 save_every=20 from torchvision.utils import save_image import Nets import torch from torch.utils.data import DataLoader import opt import torch.nn as nn import datasetif __name__=="__main__":# 1. 加載數據dataset = dataset.Dataset()dataloader = DataLoader(dataset,batch_size=opt.batch_size,shuffle=True,num_workers=opt.num_workers,drop_last=True)# 2.初始化網絡netg, netd = Nets.NetG(), Nets.NetD()# 3. 設定優化器參數optimize_g = torch.optim.Adam(netg.parameters(), lr=opt.lr1, betas=(opt.beta1,0.999))optimize_d = torch.optim.Adam(netd.parameters(), lr=opt.lr2, betas=(opt.beta1,0.999))loss_func = nn.BCELoss()# 4. 定義標簽, 并且開始注入生成器的輸入noisetrue_labels = torch.ones(opt.batch_size)fake_labels = torch.zeros(opt.batch_size)noises = torch.randn(opt.batch_size, opt.nz, 1, 1)# 6.訓練網絡netg.train()netd.train()for epoch in range(opt.epochs):for i, img in enumerate(dataloader):real_img = img# 訓練判別器if i % opt.d_every == 0:optimize_d.zero_grad()# 真圖real_out = netd(real_img)error_d_real = loss_func(real_out, true_labels)error_d_real.backward()# 隨機生成的假圖noises = noises.detach()fake_image = netg(noises).detach()fake_out = netd(fake_image)error_d_fake = loss_func(fake_out, fake_labels)error_d_fake.backward()optimize_d.step()# 計算losserror_d = error_d_fake + error_d_realprint("第{0}輪: 判別網絡 損失:{1} 對真圖評分:{2} 對生成圖評分:{3}".format(epoch+1,error_d.item(),real_out.data.mean(),fake_out.data.mean()))# 訓練生成器if i % opt.g_every == 0 and i>0:optimize_g.zero_grad()noises.data.copy_(torch.randn(opt.batch_size, opt.nz, 1, 1))fake_img = netg(noises)output = netd(fake_img)error_g = loss_func(output, true_labels)error_g.backward()optimize_g.step()print(" 生成網絡 損失:{0}".format(error_g.item()))# 7.保存模型和圖片if i % opt.save_every == 0 and i>0:fix_noises = torch.randn(opt.batch_size, opt.nz, 1, 1)fix_fake_image = netg(fix_noises)# save_image(real_img.data*0.5+0.5, "./img/{0}-{1}-real_img.jpg".format(epoch, i), nrow=10)save_image(fix_fake_image.data*0.5+0.5, "./image/{0}-{1}-fake_img.jpg".format(epoch, i), nrow=10)torch.save(netd.state_dict(), opt.netd_path)torch.save(netg.state_dict(), opt.netg_path)

效果展示

生成網絡隨機生成的頭像

總結

以上是生活随笔為你收集整理的基于GAN的动漫头像生成的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 国产一线天粉嫩馒头极品av | 亚洲成在线观看 | 色男人影院| 久久久久亚洲av成人人电影 | 国产精品天美传媒沈樵 | 日本一区三区 | 久久久久久久久蜜桃 | 91精品国产色综合久久不卡98 | 精品人妻互换一区二区三区 | 中文字幕人妻一区二区三区在线视频 | 超碰www | 一级影片在线观看 | 麻豆一区产品精品蜜桃的特点 | 午夜精品久久久久久久久久久久久 | 动漫美女揉胸 | 色狠狠久久av大岛优香 | 国产一区二区三区在线 | 99视频免费在线观看 | 极品美女一区二区三区 | 国产精品福利片 | 一级少妇女片 | 九色porny原创自拍 | 成人mv在线观看 | 国产精品av一区 | 欧美成人影音 | a√在线观看 | 伊人久久一区二区 | 国产大片中文字幕 | 97视频一区二区三区 | 久久人人爽人人爽人人 | www.av777| 伊人激情影院 | 人人曰 | 骚av在线 | www.亚洲激情| 东方av在线免费观看 | 超碰97成人 | 国产网站视频 | 一本久道久久 | 97超碰导航 | 国产激情视频一区二区三区 | 欧美成年人视频 | 国产一区二区三区四区视频 | 污漫网站 | 一起操在线 | 男人天堂2019| √8天堂资源地址中文在线 欧美精品在线一区二区 | 欧美综合视频在线观看 | 日韩在线观看免费av | 精品少妇一区二区三区免费观 | 日本高清免费aaaaa大片视频 | 一本大道久久a久久综合婷婷 | 不卡的av在线免费观看 | 2019国产精品 | 中国国产精品 | 精品久久BBBBB精品人妻 | 日本 奴役 捆绑 受虐狂xxxx | 亚洲黄色免费电影 | 亚洲综合图片一区 | 亚洲最新视频 | 疯狂做爰高潮videossex | 爱爱的网站 | 激情啪啪网站 | 欧洲精品久久久 | 毛片内射久久久一区 | 女人被男人躁得好爽免费视频 | 国产熟女高潮一区二区三区 | 亚洲精品二区 | 无码国产精品一区二区高潮 | 国产51精品| jizjiz中国少妇高潮水多 | 极品美女高潮出白浆 | 国产乱码精品一区二区三 | 久久精品99久久久久久久久 | 亚洲天堂一区二区在线 | 色综合999 | 性视频播放免费视频 | 91成人在线观看喷潮动漫 | 91精品欧美| 向日葵视频在线 | 欧美色图3p| 中文字幕日本在线 | 欧色图| 一区二区免费播放 | 欧美丰满少妇人妻精品 | 福利在线网站 | 波多野结衣一区二区 | 四虎影院新网址 | 91黄瓜| 欧美日韩欧美日韩在线观看视频 | 华人永久免费视频 | 久热精品在线观看视频 | 无人在线观看的免费高清视频 | аⅴ资源新版在线天堂 | 福利午夜视频 | 欧美第一夜| 成人免费看类便视频 | 久久人妻一区二区 | 亚洲美女高潮久久久 |