以下の内容はhttps://cysec148.hatenablog.com/entry/2025/04/08/063029より取得しました。


第24回:GAN(敵対的生成ネットワーク)の基本概念と構造

Hello there, ('ω')ノ

🧠 はじめに:GAN(敵対的生成ネットワーク)とは?

GAN(Generative Adversarial Network:敵対的生成ネットワーク) とは、
2つのニューラルネットワーク生成器識別器)を競わせながら
リアルなデータを生成するためのモデル です。

GANの基本的な構成:
- 生成器(Generator, G):
 ランダムノイズから データを生成 するネットワーク
- 識別器(Discriminator, D):
 生成データと実データを 判別するネットワーク

GANの応用分野:
- 画像生成・変換(Image Generation/Transformation)
- スタイル変換(Style Transfer)
- 超解像(Super-Resolution)
- アニメーション・ゲームキャラクター生成
- 医療画像のデータ拡張


📚 1. GANの基本概念と仕組み


🎨 ① GANのアーキテクチャ

GANは、生成器(G)識別器(D) の2つのネットワークが
互いに競争しながら 学習を行います。


🎯 【GANの基本構造】

[ノイズ z] → [生成器 G] → [生成データ x'] → [識別器 D] → [判別結果(本物/偽物)]
                                      ↑
                              [実データ x] → [識別器 D] → [判別結果(本物/偽物)]

1. 生成器(Generator, G):
- ランダムノイズ z から データ x' を生成 するネットワーク
- 目標:識別器 D を騙すリアルなデータ生成

2. 識別器(Discriminator, D):
- 実データ x生成データ x' を見分けるネットワーク
- 目標:本物と偽物の判別精度を高める

3. 競争(Adversarial Process):
- 生成器 GD を騙すデータ を生成
- 識別器 DG の生成データを見破る よう学習


🔥 ② GANの学習の流れ

GANの学習は、ミニマックスゲーム(Minimax Game) として定式化されます。


📚 【GANの学習ステップ】

  1. 生成器 G がノイズ z からデータ x' を生成
  2. 識別器 D が x' と本物のデータ x を見分ける
  3. D は誤った判別結果に対して勾配を更新(Dの精度向上)
  4. G は D を騙すためによりリアルなデータを生成(Gの精度向上)
  5. この競争が繰り返されることで、G と D の性能が向上

📊 【GANの目的関数】

GANは以下の ミニマックス目的関数 を最適化します。

[ \min_G \max_D V(D, G) = \mathbb{E}{x \sim p{\text{data}}(x)} [\log D(x)] + \mathbb{E}_{z \sim p_z(z)} [\log (1 - D(G(z)))] ]

目的:
- D は本物のデータ x を本物と判定し(D(x) → 1)、G が生成した偽物 x' を偽物と判定する(D(G(z)) → 0)
- G は D を騙して D(G(z)) → 1 に近づける


📚 ③ 生成器(Generator, G)の役割

生成器(G) は、
ランダムノイズ z(潜在変数) から データ x' を生成 するネットワークです。


📚 【生成器の数式】

[ G(z) : z \to x' ]

  • z: ランダムノイズ(ガウス分布や一様分布からサンプリング)
  • x': 生成されたデータ(偽物)

🎯 【生成器の目標】

D を騙すリアルなデータを生成
ノイズ空間から実データの分布に近い分布を学習
D の精度が上がるにつれて G も強化される


📚 ④ 識別器(Discriminator, D)の役割

識別器(D) は、
本物データ x偽物データ x' を見分けるネットワークです。


📚 【識別器の数式】

[ D(x) : x \to [0, 1] ]

  • D(x): x が本物である確率(0〜1の範囲)

🎯 【識別器の目標】

本物データ x には 1 を出力
生成データ x' には 0 を出力
G の生成データを見破り続けることで精度向上


📊 2. GANの損失関数と最適化


📚 ① GANの損失関数の定義

GANの目的は、D と G のミニマックスゲーム を最適化することです。


📚 【GANの目的関数】

[ \min_G \max_D V(D, G) = \mathbb{E}{x \sim p{\text{data}}(x)} [\log D(x)] + \mathbb{E}_{z \sim p_z(z)} [\log (1 - D(G(z)))] ]

D の目的:
- 本物のデータ x には 1(正解) を返し、
- 生成データ G(z) には 0(偽物) を返す

G の目的:
- D を騙して D(G(z)) を 1 に近づける


📚 ② 生成器の損失関数(Generator Loss)

[ L_G = -\mathbb{E}_{z \sim p_z(z)} [\log D(G(z))] ]

G の目標:
- D を騙して D(G(z)) を 1 に近づける
- G が生成する偽物データの信頼度を最大化


📚 ③ 識別器の損失関数(Discriminator Loss)

[ L_D = -\left( \mathbb{E}{x \sim p{\text{data}}(x)} [\log D(x)] + \mathbb{E}_{z \sim p_z(z)} [\log (1 - D(G(z)))] \right) ]

D の目標:
- 本物のデータ x には D(x) → 1、偽物データ G(z) には D(G(z)) → 0


🤖 3. GANの実装(PyTorchで画像生成)


📚 ① 必要なライブラリのインストール

pip install torch torchvision matplotlib numpy

📚 ② 生成器と識別器の定義

import torch
import torch.nn as nn

# 生成器(Generator)の定義
class Generator(nn.Module):
    def __init__(self, latent_dim, output_dim):
        super(Generator, self).__init__()
        self.model = nn.Sequential(
            nn.Linear(latent_dim, 256),
            nn.LeakyReLU(0.2),
            nn.Linear(256, 512),
            nn.LeakyReLU(0.2),
            nn.Linear(512, output_dim),
            nn.Tanh()
        )

    def forward(self, z):
        return self.model(z)

# 識別器(Discriminator)の定義
class Discriminator(nn.Module):
    def __init__(self, input_dim):
        super(Discriminator, self).__init__()
        self.model = nn.Sequential(
            nn.Linear(input_dim, 512),
            nn.LeakyReLU(0.2),
            nn.Linear(512, 256),
            nn.LeakyReLU(0.2),
            nn.Linear(256, 1),
            nn.Sigmoid()
        )

   

 def forward(self, x):
        return self.model(x)

📚 ③ 損失関数と最適化の設定

# ハイパーパラメータの設定
latent_dim = 100  # ノイズ次元
img_dim = 28 * 28  # MNIST画像サイズ(28x28)

# モデルの初期化
generator = Generator(latent_dim, img_dim)
discriminator = Discriminator(img_dim)

# 損失関数と最適化
criterion = nn.BCELoss()  # バイナリクロスエントロピー
lr = 0.0002
g_optimizer = torch.optim.Adam(generator.parameters(), lr=lr)
d_optimizer = torch.optim.Adam(discriminator.parameters(), lr=lr)

📚 ④ GANの学習ループ

import torchvision
from torchvision import datasets, transforms
from torch.utils.data import DataLoader

# データセットの読み込み(MNIST)
transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.5,), (0.5,))])
dataset = datasets.MNIST(root="./data", train=True, transform=transform, download=True)
dataloader = DataLoader(dataset, batch_size=64, shuffle=True)

# 学習ループ
num_epochs = 100
for epoch in range(num_epochs):
    for real_imgs, _ in dataloader:
        batch_size = real_imgs.size(0)

        # 本物データのラベル
        real_labels = torch.ones(batch_size, 1)
        fake_labels = torch.zeros(batch_size, 1)

        # ① 識別器の学習
        real_imgs = real_imgs.view(batch_size, -1)
        outputs = discriminator(real_imgs)
        d_loss_real = criterion(outputs, real_labels)

        z = torch.randn(batch_size, latent_dim)
        fake_imgs = generator(z)
        outputs = discriminator(fake_imgs.detach())
        d_loss_fake = criterion(outputs, fake_labels)

        d_loss = d_loss_real + d_loss_fake
        d_optimizer.zero_grad()
        d_loss.backward()
        d_optimizer.step()

        # ② 生成器の学習
        outputs = discriminator(fake_imgs)
        g_loss = criterion(outputs, real_labels)

        g_optimizer.zero_grad()
        g_loss.backward()
        g_optimizer.step()

    print(f"Epoch [{epoch+1}/{num_epochs}], D Loss: {d_loss.item():.4f}, G Loss: {g_loss.item():.4f}")

学習完了!


🎨 ⑤ 生成画像の表示

import matplotlib.pyplot as plt

# 生成した画像の可視化
def show_generated_images(epoch, generator, latent_dim):
    z = torch.randn(64, latent_dim)
    generated_images = generator(z).view(-1, 1, 28, 28).detach()
    grid = torchvision.utils.make_grid(generated_images, nrow=8, normalize=True)
    plt.imshow(grid.permute(1, 2, 0).cpu().numpy(), cmap="gray")
    plt.title(f"Generated Images at Epoch {epoch}")
    plt.axis("off")
    plt.show()

# 生成画像の表示
show_generated_images(num_epochs, generator, latent_dim)

リアルな画像生成が成功しました!


📚 4. GANの応用と活用法


🎯 ① 画像生成(Image Generation)

応用:
- アニメキャラクター、風景画像、リアルな顔画像の生成
- 新しいデザインパターンの生成

ユースケース:
- アバター生成、アート作品、3Dモデルの作成


📚 ② スタイル変換(Style Transfer)

応用:
- 画像のスタイル変換やアート作品風の画像生成
- 画像の特定の特徴を別の画像に適用

ユースケース:
- 写真のアニメ化、絵画風変換、スケッチ変換


📊 ③ 超解像(Super-Resolution)

応用:
- 低解像度画像を高解像度に変換
- ピクセル情報の補完・高精度化

ユースケース:
- 医療画像解析、衛星画像解析、監視カメラ映像の強化


🤖 ④ データ拡張(Data Augmentation)

応用:
- 生成データによるデータ拡張と学習精度向上
- 不足データの補完によるモデル精度の向上

ユースケース:
- 医療画像、NLPタスク、異常検知モデルの補強


🎁 まとめ:GANの基本概念と構造を理解しよう!

GANは、生成器(G)と識別器(D)の競争を通じて、リアルなデータを生成する強力な生成モデル。
ミニマックスゲームを通じて、GはDを騙すリアルなデータを生成することで精度向上を実現する。
画像生成、スタイル変換、超解像、データ拡張など、GANの応用分野は多岐にわたる。
PyTorchでGANの実装と学習ループを構築し、生成画像の可視化までをマスターしよう!

Best regards, (^^ゞ




以上の内容はhttps://cysec148.hatenablog.com/entry/2025/04/08/063029より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14