【AIプログラミング】GAN(生成的敵対ネットワーク)について勉強をする、PyTorchのチュートリアル2

AIプログラミング

今回から実際にプログラミングに入っていきます。

実装して理解が深まるといいね。

PyTorchのチュートリアルでDCGANを行っています。

まずはデータセットの準備から始まりますが、データセットの画像数が多いので、GoogleColaboではなく、自分のマシンにデータをダウンロードし、Anaconda環境にて実行を行いました。ちょっといろいろ時間がかかり、データの確認のみとなってしまいました^^;

第一回のGANについて大枠を勉強した記事もご参照ください。

こんな人の役に立つかも

・機械学習プログラミングを勉強している人

・PyTorchでDCGANプログラミングを行っている人

・PyTorchのDCGANチュートリアルの日本語が見たい人

スポンサーリンク

DCGANプログラムの準備

まずは必要ライブラリのimport

以下のように、必要ライブラリをimportします。そして、ランダムシード用の整数999を設定しています。

from __future__ import print_function
#%matplotlib inline
import argparse
import os
import random
import torch
import torch.nn as nn
import torch.nn.parallel
import torch.backends.cudnn as cudnn
import torch.optim as optim
import torch.utils.data
import torchvision.datasets as dset
import torchvision.transforms as transforms
import torchvision.utils as vutils
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
from IPython.display import HTML

# Set random seed for reproducibility
manualSeed = 999
#manualSeed = random.randint(1, 10000) # use if you want new results
print("Random Seed: ", manualSeed)
random.seed(manualSeed)
torch.manual_seed(manualSeed)

プログラム入力パラメータ

次に、プログラムの入力パラメータを設定します。

  • dataroot – 「celeba」データを配置した場所のパスを指定します。
  • workers – 「データローダー」でデータをロードする際のワーカースレッドの数を設定します。データローダーはスレッドを複数立てて処理ができる、ということでしょうか、デフォルトで利用します^^;
  • batch_size – 訓練時のバッチサイズを設定します。DCGANの論文では128を設定しています。
  • image_size – 訓練画像のサイズです。この実装では64×64がデフォルトです。他のサイズを設定したい場合、ディスクリミネータとジェネレータの構成を変更しなければいけません。その際は、こちらの記事で詳細を要確認とのことです。
  • nc -入力画像のカラーチャンネル数です。通常はカラー画像の場合、RGBの3チャンネルです。
  • nz – 潜在ベクトル「z」の長さです。ジェネレータに入力するデータの長さになります。
  • ngf – ジェネレータを介して運ばれる機能マップの深さに関連します。よくわかりませんので、実装過程で要調査です。
  • ndf – ディスクリミネータを介して伝播される特徴マップの深さを設定します。
  • num_epochs – 訓練のエポック数です。
  • lr -学習率です。DCGANの論文によると、0.0002が望ましいそうです。
  • beta1 – Adam最適化アルゴリズムの「beta1」ハイパーパラメータです。論文によると、0.5が望ましいそうです。
  • ngpu – 利用可能なGPUの数です。0のとき、CPUで動作します。0以上の値のとき、指定した数のGPUで動作します。
# Root directory for dataset
dataroot = "./data/celeba"

# Number of workers for dataloader
workers = 2

# Batch size during training
batch_size = 128

# Spatial size of training images. All images will be resized to this
#   size using a transformer.
image_size = 64

# Number of channels in the training images. For color images this is 3
nc = 3

# Size of z latent vector (i.e. size of generator input)
nz = 100

# Size of feature maps in generator
ngf = 64

# Size of feature maps in discriminator
ndf = 64

# Number of training epochs
num_epochs = 5

# Learning rate for optimizers
lr = 0.0002

# Beta1 hyperparam for Adam optimizers
beta1 = 0.5

# Number of GPUs available. Use 0 for CPU mode.
ngpu = 1

データセットの準備

PyTorchのDCGANチュートリアルで利用するデータセットは「celebA」と呼ばれる有名人の顔を集めたデータとなります。

「img_align_celeba.zip」を右クリックからダウンロードして、展開します。1.4Gありますので、ダウンロード、展開ともに結構じかんがかかりました。また、今回はAnaconda環境で自分のマシンにダウンロードしてプログラミングをしています。

私のテスト環境では、「C:\Users\ユーザー名\Python\celeba」

として、JupyterNotebookのノートの保存場所と同じ階層に入れることにしました。

そのため、先の「dataroot 」にて、同階層の「celeba」を参照するように「./celeba」という階層を指定しています。

チュートリアルのように、「celeba」というフォルダの下にダウンロードしました。「img_align_celeba」フォルダを配置する必要があるようなので、その点は注意です。

# We can use an image folder dataset the way we have it setup.
# Create the dataset
dataset = dset.ImageFolder(root=dataroot,
                           transform=transforms.Compose([
                               transforms.Resize(image_size),
                               transforms.CenterCrop(image_size),
                               transforms.ToTensor(),
                               transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5)),
                           ]))
# Create the dataloader
dataloader = torch.utils.data.DataLoader(dataset, batch_size=batch_size,
                                         shuffle=True, num_workers=workers)

# Decide which device we want to run on
device = torch.device("cuda:0" if (torch.cuda.is_available() and ngpu > 0) else "cpu")

#自分のデバイスの確認用
print(device)

# Plot some training images
real_batch = next(iter(dataloader))
plt.figure(figsize=(8,8))
plt.axis("off")
plt.title("Training Images")
plt.imshow(np.transpose(vutils.make_grid(real_batch[0].to(device)[:64], padding=2, normalize=True).cpu(),(1,2,0)))

上のプログラムで、CUDAでの実行が可能な場合、自動的にGPUでの実行としてくれるようです。print文で今の環境がGPUで動作しているのかを確認するための1文のみ追加しました。

cuda:0
訓練データの確認結果

上のように、有名人の顔写真の羅列が表示されれば、正常にデータの読み込みができています。

意外とファイルの配置に時間がかかりました・・・次回から実装パートに入ります。

タイトルとURLをコピーしました