国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

PyTorch訓(xùn)練簡單的生成對抗網(wǎng)絡(luò)GAN

這篇具有很好參考價值的文章主要介紹了PyTorch訓(xùn)練簡單的生成對抗網(wǎng)絡(luò)GAN。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

原理

同時訓(xùn)練兩個網(wǎng)絡(luò):辨別器Discriminator 和 生成器Generator
Generator是 造假者,用來生成假數(shù)據(jù)。
Discriminator 是警察,盡可能的分辨出來哪些是造假的,哪些是真實的數(shù)據(jù)。

目的:使得判別模型盡量犯錯,無法判斷數(shù)據(jù)是來自真實數(shù)據(jù)還是生成出來的數(shù)據(jù)。

GAN的梯度下降訓(xùn)練過程:

PyTorch訓(xùn)練簡單的生成對抗網(wǎng)絡(luò)GAN,Deep Learning,DL Papers,pytorch,生成對抗網(wǎng)絡(luò),人工智能
上圖來源:https://arxiv.org/abs/1406.2661

Train 辨別器: m a x max max l o g ( D ( x ) ) + l o g ( 1 ? D ( G ( z ) ) ) log(D(x)) + log(1 - D(G(z))) log(D(x))+log(1?D(G(z)))

Train 生成器: m i n min min l o g ( 1 ? D ( G ( z ) ) ) log(1-D(G(z))) log(1?D(G(z)))

我們可以使用BCEloss來計算上述兩個損失函數(shù)

BCEloss的表達式: m i n ? [ y l n x + ( 1 ? y ) l n ( 1 ? x ) ] min -[ylnx + (1-y)ln(1-x)] min?[ylnx+(1?y)ln(1?x)]
具體過程參加代碼中注釋

代碼

import torch
import torch.nn as nn
import torch.optim as optim
import torchvision
import torchvision.datasets as datasets
from torch.utils.data import DataLoader
import torchvision.transforms as transforms
from torch.utils.tensorboard import SummaryWriter  # to print to tensorboard

class Discriminator(nn.Module):
    def __init__(self, img_dim):
        super(Discriminator, self).__init__()
        self.disc = nn.Sequential(
            nn.Linear(img_dim, 128),
            nn.LeakyReLU(0.1),
            nn.Linear(128, 1),
            nn.Sigmoid(),
        )

    def forward(self, x):
        return self.disc(x)
    
class Generator(nn.Module):
    def __init__(self, z_dim, img_dim): # z_dim 噪聲的維度
        super(Generator, self).__init__()
        self.gen = nn.Sequential(
            nn.Linear(z_dim, 256),
            nn.LeakyReLU(0.1),
            nn.Linear(256, img_dim), # 28x28 -> 784
            nn.Tanh(),
        )
    
    def forward(self, x):
        return self.gen(x)
    
# Hyperparameters
device = 'cuda' if torch.cuda.is_available() else 'cpu'
lr = 3e-4 # 3e-4是Adam最好的學(xué)習(xí)率
z_dim = 64 # 噪聲維度
img_dim = 784 # 28x28x1
batch_size = 32
num_epochs = 50

disc = Discriminator(img_dim).to(device)
gen = Generator(z_dim, img_dim).to(device)

fixed_noise = torch.randn((batch_size, z_dim)).to(device)
transforms = transforms.Compose( # MNIST標準化系數(shù):(0.1307,), (0.3081,)
    [transforms.ToTensor(), transforms.Normalize((0.1307, ), (0.3081,))] # 不同數(shù)據(jù)集就有不同的標準化系數(shù)
)

dataset = datasets.MNIST(root='dataset/', transform=transforms, download=True)
loader = DataLoader(dataset, batch_size=batch_size, shuffle=True)

opt_disc = optim.Adam(disc.parameters(), lr=lr)
opt_gen = optim.Adam(gen.parameters(), lr=lr)
# BCE 損失
criterion = nn.BCELoss()

# 打開tensorboard:在該目錄下,使用 tensorboard --logdir=runs
writer_fake = SummaryWriter(f"runs/GAN_MNIST/fake")
writer_real = SummaryWriter(f"runs/GAN_MNIST/real")
step = 0

for epoch in range(num_epochs):
    for batch_idx, (real, _) in enumerate(loader):
        real = real.view(-1, 784).to(device) # view相當(dāng)于reshape
        batch_size = real.shape[0]

        ### Train Discriminator: max log(D(real)) + log(1 - D(G(z)))
        noise = torch.randn(batch_size, z_dim).to(device)
        fake = gen(noise) # G(z)
        disc_real = disc(real).view(-1) # flatten
        # BCEloss的表達式:min -[ylnx + (1-y)ln(1-x)]

        # max log(D(real)) 相當(dāng)于 min -log(D(real))
        # ones_like:1填充得到y(tǒng)=1, 即可忽略  min -[ylnx + (1-y)ln(1-x)]中的后一項
        # 得到 min -lnx,這里的x就是我們的real圖片
        lossD_real = criterion(disc_real, torch.ones_like(disc_real))

        disc_fake = disc(fake).view(-1)
        # max log(1 - D(G(z))) 相當(dāng)于 min -log(1 - D(G(z)))
        # zeros_like用0填充,得到y(tǒng)=0,即可忽略  min -[ylnx + (1-y)ln(1-x)]中的前一項
        # 得到 min -ln(1-x),這里的x就是我們的fake噪聲
        lossD_fake = criterion(disc_fake, torch.zeros_like(disc_fake))
        lossD = (lossD_real + lossD_fake) / 2

        disc.zero_grad()
        lossD.backward(retain_graph=True)
        opt_disc.step()

        ### Train Generator: min log(1-D(G(z))) <--> max log(D(G(z))) <--> min - log(D(G(z)))
        # 依然可使用BCEloss來做
        output = disc(fake).view(-1)
        lossG = criterion(output, torch.ones_like(output))
        gen.zero_grad()
        lossG.backward()
        opt_gen.step()

        if batch_idx == 0:
            print(
                f"Epoch [{epoch}/{num_epochs}] \ "
                f"Loss D: {lossD:.4f}, Loss G: {lossG:.4f}"
            )

            with torch.no_grad():
                fake = gen(fixed_noise).reshape(-1, 1, 28, 28)
                data = real.reshape(-1, 1, 28, 28)
                img_grid_fake = torchvision.utils.make_grid(fake, normalize=True)
                img_grid_real = torchvision.utils.make_grid(data, normalize=True)

                writer_fake.add_image(
                    "Mnist Fake Images", img_grid_fake, global_step=step
                )

                writer_real.add_image(
                    "Mnist Real Images", img_grid_real, global_step=step
                )

                step += 1

結(jié)果

訓(xùn)練50輪的的損失

Epoch [0/50] \ Loss D: 0.7366, Loss G: 0.7051
Epoch [1/50] \ Loss D: 0.2483, Loss G: 1.6877
Epoch [2/50] \ Loss D: 0.1049, Loss G: 2.4980
Epoch [3/50] \ Loss D: 0.1159, Loss G: 3.4923
Epoch [4/50] \ Loss D: 0.0400, Loss G: 3.8776
Epoch [5/50] \ Loss D: 0.0450, Loss G: 4.1703
...
Epoch [43/50] \ Loss D: 0.0022, Loss G: 7.7446
Epoch [44/50] \ Loss D: 0.0007, Loss G: 9.1281
Epoch [45/50] \ Loss D: 0.0138, Loss G: 6.2177
Epoch [46/50] \ Loss D: 0.0008, Loss G: 9.1188
Epoch [47/50] \ Loss D: 0.0025, Loss G: 8.9419
Epoch [48/50] \ Loss D: 0.0010, Loss G: 8.3315
Epoch [49/50] \ Loss D: 0.0007, Loss G: 7.8302

使用

tensorboard --logdir=runs

打開tensorboard:

PyTorch訓(xùn)練簡單的生成對抗網(wǎng)絡(luò)GAN,Deep Learning,DL Papers,pytorch,生成對抗網(wǎng)絡(luò),人工智能
可以看到效果并不好,這是由于我們只是采用了簡單的線性網(wǎng)絡(luò)來做辨別器和生成器。后面的博文我們會使用更復(fù)雜的網(wǎng)絡(luò)來訓(xùn)練GAN。

參考

[1] Building our first simple GAN
[2] https://arxiv.org/abs/1406.2661文章來源地址http://www.zghlxwxcb.cn/news/detail-653583.html

到了這里,關(guān)于PyTorch訓(xùn)練簡單的生成對抗網(wǎng)絡(luò)GAN的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • PyTorch深度學(xué)習(xí)實戰(zhàn)(31)——生成對抗網(wǎng)絡(luò)(Generative Adversarial Network, GAN)

    PyTorch深度學(xué)習(xí)實戰(zhàn)(31)——生成對抗網(wǎng)絡(luò)(Generative Adversarial Network, GAN)

    生成對抗網(wǎng)絡(luò) ( Generative Adversarial Networks , GAN ) 是一種由兩個相互競爭的神經(jīng)網(wǎng)絡(luò)組成的深度學(xué)習(xí)模型,它由一個生成網(wǎng)絡(luò)和一個判別網(wǎng)絡(luò)組成,通過彼此之間的博弈來提高生成網(wǎng)絡(luò)的性能。生成對抗網(wǎng)絡(luò)使用神經(jīng)網(wǎng)絡(luò)生成與原始圖像集非常相似的新圖像,它在圖像生成中應(yīng)用

    2024年01月22日
    瀏覽(24)
  • 使用PyTorch構(gòu)建GAN生成對抗網(wǎng)絡(luò)源碼(詳細步驟講解+注釋版)01 手寫字體識別

    使用PyTorch構(gòu)建GAN生成對抗網(wǎng)絡(luò)源碼(詳細步驟講解+注釋版)01 手寫字體識別

    前面的博客講了如何基于PyTorch使用神經(jīng)網(wǎng)絡(luò)識別手寫數(shù)字 使用PyTorch構(gòu)建神經(jīng)網(wǎng)絡(luò) 下面在此基礎(chǔ)上構(gòu)建一個生成對抗網(wǎng)絡(luò),生成對抗網(wǎng)絡(luò)可以模擬出新的手寫數(shù)字數(shù)據(jù)集。 生成對抗網(wǎng)絡(luò)(GAN)是一種用于生成新的照片,文本或音頻的模型。它由兩部分組成:生成器和判別器

    2024年02月02日
    瀏覽(32)
  • 人工智能(pytorch)搭建模型11-pytorch搭建DCGAN模型,一種生成對抗網(wǎng)絡(luò)GAN的變體實際應(yīng)用

    人工智能(pytorch)搭建模型11-pytorch搭建DCGAN模型,一種生成對抗網(wǎng)絡(luò)GAN的變體實際應(yīng)用

    大家好,我是微學(xué)AI,今天給大家介紹一下人工智能(pytorch)搭建模型11-pytorch搭建DCGAN模型,一種生成對抗網(wǎng)絡(luò)GAN的變體實際應(yīng)用,本文將具體介紹DCGAN模型的原理,并使用PyTorch搭建一個簡單的DCGAN模型。我們將提供模型代碼,并使用一些數(shù)據(jù)樣例進行訓(xùn)練和測試。最后,我們將

    2024年02月08日
    瀏覽(100)
  • PyTorch訓(xùn)練深度卷積生成對抗網(wǎng)絡(luò)DCGAN

    PyTorch訓(xùn)練深度卷積生成對抗網(wǎng)絡(luò)DCGAN

    將CNN和GAN結(jié)合起來,把監(jiān)督學(xué)習(xí)和無監(jiān)督學(xué)習(xí)結(jié)合起來。具體解釋可以參見 深度卷積對抗生成網(wǎng)絡(luò)(DCGAN) DCGAN的生成器結(jié)構(gòu): 圖片來源:https://arxiv.org/abs/1511.06434 model.py 訓(xùn)練使用的數(shù)據(jù)集:CelebA dataset (Images Only) 總共1.3GB的圖片,使用方法,將其解壓到當(dāng)前目錄 圖片如下圖所

    2024年02月12日
    瀏覽(25)
  • 深度學(xué)習(xí)進階篇[9]:對抗生成網(wǎng)絡(luò)GANs綜述、代表變體模型、訓(xùn)練策略、GAN在計算機視覺應(yīng)用和常見數(shù)據(jù)集介紹,以及前沿問題解決

    深度學(xué)習(xí)進階篇[9]:對抗生成網(wǎng)絡(luò)GANs綜述、代表變體模型、訓(xùn)練策略、GAN在計算機視覺應(yīng)用和常見數(shù)據(jù)集介紹,以及前沿問題解決

    【深度學(xué)習(xí)入門到進階】必看系列,含激活函數(shù)、優(yōu)化策略、損失函數(shù)、模型調(diào)優(yōu)、歸一化算法、卷積模型、序列模型、預(yù)訓(xùn)練模型、對抗神經(jīng)網(wǎng)絡(luò)等 專欄詳細介紹:【深度學(xué)習(xí)入門到進階】必看系列,含激活函數(shù)、優(yōu)化策略、損失函數(shù)、模型調(diào)優(yōu)、歸一化算法、卷積模型、

    2024年02月08日
    瀏覽(29)
  • 【計算機視覺|生成對抗】生成對抗網(wǎng)絡(luò)(GAN)

    【計算機視覺|生成對抗】生成對抗網(wǎng)絡(luò)(GAN)

    本系列博文為深度學(xué)習(xí)/計算機視覺論文筆記,轉(zhuǎn)載請注明出處 標題: Generative Adversarial Nets 鏈接:Generative Adversarial Nets (nips.cc) 我們提出了一個通過**對抗(adversarial)**過程估計生成模型的新框架,在其中我們同時訓(xùn)練兩個模型: 一個生成模型G,捕獲數(shù)據(jù)分布 一個判別模型

    2024年02月12日
    瀏覽(35)
  • 了解生成對抗網(wǎng)絡(luò) (GAN)

    了解生成對抗網(wǎng)絡(luò) (GAN)

    ????????Yann LeCun將其描述為“過去10年來機器學(xué)習(xí)中最有趣的想法”。當(dāng)然,來自深度學(xué)習(xí)領(lǐng)域如此杰出的研究人員的贊美總是對我們談?wù)摰闹黝}的一個很好的廣告!事實上,生成對抗網(wǎng)絡(luò)(簡稱GAN)自2014年由Ian J. Goodfellow和共同作者在《

    2024年02月12日
    瀏覽(20)
  • 生成式對抗網(wǎng)絡(luò)GAN

    生成式對抗網(wǎng)絡(luò)GAN

    Generative Adversarial Nets 由伊恩·古德費洛(Ian J.Goodfellow)等人于2014年發(fā)表在Conference on Neural Information Processing Systems (NeurIPS)上。NeurIPS是機器學(xué)習(xí)和計算神經(jīng)科學(xué)領(lǐng)域的頂級國際學(xué)術(shù)會議之一。 圖像生成: 論文地址:styleGAN styleGAN2 圖像生成是生成模型的基本問題,GAN相對先前的

    2024年01月16日
    瀏覽(17)
  • GAN生成對抗網(wǎng)絡(luò)介紹

    GAN生成對抗網(wǎng)絡(luò)介紹

    GAN 全稱是Generative Adversarial Networks,即 生成對抗網(wǎng)絡(luò) 。 “生成”表示它是一個生成模型,而“對抗”代表它的訓(xùn)練是處于一種對抗博弈狀態(tài)中的。 一個可以自己創(chuàng)造數(shù)據(jù)的網(wǎng)絡(luò)! 判別模型與生成模型 判別模型(Discriminative Model) 主要目標是對給定輸入數(shù)據(jù)直接進行建模,

    2024年01月17日
    瀏覽(24)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包