目錄
一、背景介紹
二、生活化例子說明什么是對抗生成網絡
三、技術細節詳解
(一)基本概念
(二)訓練機制
(三)損失函數
一、背景介紹
????????對抗生成網絡(Generative Adversarial Networks, GANs)是由Ian Goodfellow等人在2014年提出的一種深度學習模型。它由兩個部分組成:一個生成器(Generator)和一個判別器(Discriminator)。GANs的初衷是解決生成模型中的難題,即如何讓機器能夠自動生成逼真的數據樣本,如圖像、音頻等。通過模擬人類大腦中創造新事物的過程,GANs能夠在沒有明確指導的情況下生成看似真實的數據。
二、生活化例子說明什么是對抗生成網絡
????????想象你正在參加一場藝術比賽,其中有一個特別的比賽項目:兩位藝術家進行合作與競爭。一位是“畫家”,另一位是“鑒賞家”。在這個比賽中,“畫家”負責創作藝術品,而“鑒賞家”的任務則是判斷這些作品是否為真跡還是贗品。“畫家”試圖盡可能地模仿原作,制造出難以區分真假的作品;與此同時,“鑒賞家”則努力提高自己的鑒別能力,以便準確地區分真偽。
隨著時間推移,“畫家”的技藝不斷提升,以至于連“鑒賞家”也難以分辨哪些是真正的藝術品,哪些是由“畫家”創造出來的復制品。這個過程實際上就是GANs的工作原理:生成器就像“畫家”,嘗試創造出看起來真實的樣本;判別器則扮演“鑒賞家”的角色,評估輸入數據的真實性,并反饋給生成器以改進其輸出質量。
三、技術細節詳解
(一)基本概念
-
生成器(Generator):生成器的目標是從隨機噪聲中生成數據樣本,使得判別器無法區分這些樣本與真實數據之間的差異。換句話說,生成器試圖欺騙判別器,使其相信生成的樣本是真實的。
-
判別器(Discriminator):判別器的任務是接收一組數據(可以是真實的也可以是由生成器生成的),并對其進行分類——確定每個輸入屬于真實數據集的概率。
(二)訓練機制
GANs的訓練過程是一個動態博弈的過程,生成器和判別器相互對立又相互促進。具體來說:
- 初始階段,生成器隨機產生數據,而判別器則基于現有的真實數據來判斷輸入的真實度。
- 隨著訓練的進行,生成器逐漸學會生成更加逼真的樣本,同時判別器也在不斷優化自己識別偽造樣本的能力。
- 最終的理想狀態是達到納什均衡,此時生成器生成的數據幾乎無法被辨別為偽造,而判別器也無法再進一步提高其準確性。
(三)損失函數
GANs的核心在于其獨特的損失函數設計,通常包括兩部分:
判別器的損失:旨在最大化對真實樣本和生成樣本的區分能力。
生成器的損失:目標是最小化判別器對生成樣本的正確性評分。
總損失:生成器和判別器交替更新各自的參數,直到達到平衡點。
下面給出一個簡單的GANs實現框架的Python代碼示例,使用PyTorch實現。這里假設我們想要生成手寫數字圖像。
import torch
from torch import nn, optim
from torchvision import datasets, transformsclass Generator(nn.Module):def __init__(self):super(Generator, self).__init__()self.main = nn.Sequential(nn.Linear(100, 256),nn.ReLU(True),nn.Linear(256, 28*28),nn.Tanh())def forward(self, input):return self.main(input).view(-1, 1, 28, 28)class Discriminator(nn.Module):def __init__(self):super(Discriminator, self).__init__()self.main = nn.Sequential(nn.Linear(28*28, 256),nn.ReLU(True),nn.Linear(256, 1),nn.Sigmoid())def forward(self, input):return self.main(input.view(input.size(0), -1))transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.5,), (0.5,))])
trainset = datasets.MNIST(root='./data', train=True, download=True, transform=transform)
trainloader = torch.utils.data.DataLoader(trainset, batch_size=64, shuffle=True)device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
netG = Generator().to(device)
netD = Discriminator().to(device)criterion = nn.BCELoss()
optimizerD = optim.Adam(netD.parameters(), lr=0.0002)
optimizerG = optim.Adam(netG.parameters(), lr=0.0002)fixed_noise = torch.randn(64, 100, device=device)for epoch in range(5): # 訓練5個epoch作為示例for i, data in enumerate(trainloader, 0):real_images, _ = datareal_images = real_images.to(device)batch_size = real_images.size(0)# 更新判別器netD.zero_grad()noise = torch.randn(batch_size, 100, device=device)fake_images = netG(noise)label_real = torch.full((batch_size,), 1., dtype=torch.float, device=device)label_fake = torch.full((batch_size,), 0., dtype=torch.float, device=device)output_real = netD(real_images).view(-1)lossD_real = criterion(output_real, label_real)lossD_real.backward()output_fake = netD(fake_images.detach()).view(-1)lossD_fake = criterion(output_fake, label_fake)lossD_fake.backward()optimizerD.step()# 更新生成器netG.zero_grad()output = netD(fake_images).view(-1)lossG = criterion(output, label_real)lossG.backward()optimizerG.step()print("完成一次GANs訓練循環")