原始生成對抗網(wǎng)絡(luò)Generative Adversarial Networks GAN包含生成器Generator和判別器Discriminator,數(shù)據(jù)有真實數(shù)據(jù)groundtruth,還有需要網(wǎng)絡(luò)生成的“fake”數(shù)據(jù),目的是網(wǎng)絡(luò)生成的fake數(shù)據(jù)可以“騙過”判別器,讓判別器認(rèn)不出來,就是讓判別器分不清進(jìn)入的數(shù)據(jù)是真實數(shù)據(jù)還是fake數(shù)據(jù)。總的來說是:判別器區(qū)分真實數(shù)據(jù)和fake數(shù)據(jù)的能力越強(qiáng)越好;生成器生成的數(shù)據(jù)騙過判別器的能力越強(qiáng)越好,這個是矛盾的,所以只能交替訓(xùn)練網(wǎng)絡(luò)。
需要搭建生成器網(wǎng)絡(luò)和判別器網(wǎng)絡(luò),訓(xùn)練的時候交替訓(xùn)練。
首先訓(xùn)練判別器的參數(shù),固定生成器的參數(shù),讓判別器判斷生成器生成的數(shù)據(jù),讓其和0接近,讓判別器判斷真實數(shù)據(jù),讓其和1接近;
接著訓(xùn)練生成器的參數(shù),固定判別器的參數(shù),讓生成器生成的數(shù)據(jù)進(jìn)入判別器,讓判斷結(jié)果和1接近。生成器生成數(shù)據(jù)需要給定隨機(jī)初始值
線性版:
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): def __init__(self): super(discriminator,self).__init__() self.dis=nn.Sequential( nn.Linear(784,300), nn.LeakyReLU(0.2), nn.Linear(300,150), nn.LeakyReLU(0.2), nn.Linear(150,1), nn.Sigmoid() ) def forward(self, x): x=self.dis(x) return x class generator(nn.Module): def __init__(self,input_size): super(generator,self).__init__() self.gen=nn.Sequential( nn.Linear(input_size,150), nn.ReLU(True), nn.Linear(150,300), nn.ReLU(True), nn.Linear(300,784), nn.Tanh() ) def forward(self, x): x=self.gen(x) return x if __name__=="__main__": criterion=nn.BCELoss() num_img=100 z_dimension=100 D=discriminator() G=generator(z_dimension) trainset, testset, trainloader, testloader = loadMNIST(num_img) # data d_optimizer=optim.Adam(D.parameters(),lr=0.0003) g_optimizer=optim.Adam(G.parameters(),lr=0.0003) ''' 交替訓(xùn)練的方式訓(xùn)練網(wǎng)絡(luò) 先訓(xùn)練判別器網(wǎng)絡(luò)D再訓(xùn)練生成器網(wǎng)絡(luò)G 不同網(wǎng)絡(luò)的訓(xùn)練次數(shù)是超參數(shù) 也可以兩個網(wǎng)絡(luò)訓(xùn)練相同的次數(shù) 這樣就可以不用分別訓(xùn)練兩個網(wǎng)絡(luò) ''' count=0 #鑒別器D的訓(xùn)練,固定G的參數(shù) epoch = 100 gepoch = 1 for i in range(epoch): for (img, label) in trainloader: # num_img=img.size()[0] real_img=img.view(num_img,-1)#展開為28*28=784 real_label=torch.ones(num_img)#真實label為1 fake_label=torch.zeros(num_img)#假的label為0 #compute loss of real_img real_out=D(real_img) #真實圖片送入判別器D輸出0~1 d_loss_real=criterion(real_out,real_label)#得到loss real_scores=real_out#真實圖片放入判別器輸出越接近1越好 #compute loss of fake_img z=torch.randn(num_img,z_dimension)#隨機(jī)生成向量 fake_img=G(z)#將向量放入生成網(wǎng)絡(luò)G生成一張圖片 fake_out=D(fake_img)#判別器判斷假的圖片 d_loss_fake=criterion(fake_out,fake_label)#假的圖片的loss fake_scores=fake_out#假的圖片放入判別器輸出越接近0越好 #D bp and optimize d_loss=d_loss_real+d_loss_fake d_optimizer.zero_grad() #判別器D的梯度歸零 d_loss.backward() #反向傳播 d_optimizer.step() #更新判別器D參數(shù) #生成器G的訓(xùn)練compute loss of fake_img for j in range(gepoch): fake_label = torch.ones(num_img) # 真實label為1 z = torch.randn(num_img, z_dimension) # 隨機(jī)生成向量 fake_img = G(z) # 將向量放入生成網(wǎng)絡(luò)G生成一張圖片 output = D(fake_img) # 經(jīng)過判別器得到結(jié)果 g_loss = criterion(output, fake_label)#得到假的圖片與真實標(biāo)簽的loss #bp and optimize g_optimizer.zero_grad() #生成器G的梯度歸零 g_loss.backward() #反向傳播 g_optimizer.step()#更新生成器G參數(shù) print('Epoch [{}/{}], d_loss: {:.6f}, g_loss: {:.6f} ' 'D real: {:.6f}, D fake: {:.6f}'.format( i, epoch, d_loss.data[0], g_loss.data[0], real_scores.data.mean(), fake_scores.data.mean())) showimg(fake_img,count) # plt.show() count += 1
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。
網(wǎng)站名稱:Pytorch使用MNIST數(shù)據(jù)集實現(xiàn)基礎(chǔ)GAN和DCGAN詳解-創(chuàng)新互聯(lián)
分享地址:http://www.2m8n56k.cn/article0/ceggoo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站建設(shè)、做網(wǎng)站、全網(wǎng)營銷推廣、網(wǎng)站排名、營銷型網(wǎng)站建設(shè)、微信小程序
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:[email protected]。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容