直感DeepLearningを見てGANでMNIST画像を作成してみた

GANでMNIST作成

キュウゾウ

この記事をザックリまとめると、、
・直感DeepLearningという書籍がとても良い
・4章の「MNISTを偽造するための敵対的なGAN」を実装するのにつまづいた
・何とか実装できたので、誰でも実装できるように書籍の内容を補足した

これまで機械学習の初心者として勉強してきて、すごく役立ったなぁと思えるのは「Udemyの各動画」と「直感DeepLearningという書籍」です。

created by Rinker
オライリー・ジャパン
¥3,740 (2019/12/11 16:39:29時点 Amazon調べ-詳細)

直感DeepLearningは超初心者向けではないので、まずはUdemy等で勉強して「何もわからない超初心者を脱出して、基礎がわかる初心者」になったら読み進めてみても良いのではないかと思います。

私もこの本を読んで機械学習の、特にCNN(畳み込みニューラルネットワーク)について、だいぶ理解を深められました。

そして、今は4章のGANに取り組んでいるのですが、この章が「今までの章とは違って書籍通りに読み進めればOK」というわけにはいきませんでした

私はネットで情報を補完しながら何とか実装にたどりつけましたが、途中で諦めてしまう人も出てくるレベルだと思います。

なので、今後、直感ディープラーニングを読んで独学する方の為に、メモとして書き残しておきたいと思います!

Kerasのバージョンは必ず2.1.2

書籍にも書かれているとおり、Kerasのバージョンは必ず2.1.2にしておきましょう!

もちろん自分の目でエラーを確認してからで良いと思いますが、まずほぼ確実にこのバージョンが原因でのエラーに悩まされると思います。

kerasのバージョンを指定してインストールする方法は、

コード
pip install keras==2.1.2
です。

これを現在インストール済みのKerasをアンインストールなどせずに、そのまま実行すればバージョンを合わすことができます。

現在使っているKerasのバージョンは?

現在使っているKerasのバージョンを確認する方法は、Jupyter Notebook等で以下のprint文を実行するとわかります。

コード
print(keras.__version__)

キュウゾウ

まずはケラスのバージョンを書籍と同じにしよう

keras_adversarialのインストールはgithubから

Kerasのバージョンを合わせた後、次に解説する箇所が最も難関となるはずです。

直感ディープラーニングのP117に、

コード
from keras_adversarial・・・
とありますが、ここ一帯のエラーを消すのに苦労する可能性が高いので、じっくりいきましょう!

上記を書籍通りに書く前に、「keras_adversarial」をインストールする必要があるのですが、これを、

コード
pip install keras_adversarial
とやったら実行エラーが出ると思います。

調べると「git」から、

コード
pip install git+https://github.com/bstriner/keras-adversarial.git
のようにインストールする必要があるようです。

ただ、上記をコマンドプロンプトで打ってもエラーになります。

gitやgithubについては、私もこの時までずっと逃げてましたが、ここでようやくきちんと対応することにしました。

Windowsでgitコマンドを入力する前に

Git for Windowsをまずインストールする必要があります。

インストール方法は画像付きの解説ページがたくさんありますので、そちらをご参照ください。

基本的には考えすぎすにデフォルト設定で良く、Windows のコマンドプロンプトで使えるようにPATHの設定を通すところだけ間違えないようにしておけばOKと思います。

無事にインストールが済むと、上記のgitを含んだコマンドから「keras-adversarial.git」をインストールすることができると思います!

キュウゾウ

macでgitを使う方法はwinよりもハードル低いと思うのでネットでお調べください!

image_utilsはimportではなく直書きしよう

続いて、書籍P117の同じ箇所です。

keras_adversarialのimport箇所の一番下に、

コード
from image_utils import dim_・・・
という宣言もありますが、ここもやや難関です。

まず、image_utilsのインストール方法として、

コード
pip install image_utils
とやるとインストールはできるものの実行時にエラーになります。

どうやら「image_utils」は上記でインストールできるモノもあるようですが、今回のGANで使われているのは同名の別ファイルのことみたいです。

具体的にはkeras-adversarialのexamplesフォルダ内にある「image_utils.py」です。

なのでこちらを宣言してあげる必要があります。

宣言する方法は、上の「image_utils.py」の内容を全てコピーして、Jupyter Notebook等で、

コード
import keras.backend as K
import numpy as np
from keras.layers import Input, Reshape

def dim_ordering_fix(x):
・・・
と直接記述する方法が一番簡単だと思います。

なので「from image_utils import dim_・・・」部分はコメントにでもして、上記のように直接コードを書いてしまいましょう。

generator_samplerの関数定義が書籍では抜けている

私が持っている直感ディープラーニングでは「generator_sampler」の関数定義部分がごっそりと漏れています。

もちろん実行時にエラーになります。

なので、

コード
def generator_sampler(latent_dim, generator):
    def fun():
        zsamples = np.random.normal(size=(10*10, latent_dim))
        gen = dim_ordering_unfix(generator.predict(zsamples))
        return gen.reshape((10, 10, 28, 28))
    
    return fun
をご自身で定義しましょう!

上記のお手本がどこに書かれているかというと、「image_utils.py」と同じく、
keras-adversarial>examples>example_gan_convolutional.py
に原本のプログラムが置かれています。

GANの実行完了までにかかる時間はとてつもなく長いです

GANで生成された画像

書籍の「直感ディープラーニング」の内容に、ここまで修正を加えてようやくとエラーなしで実行ができました!

実行が始まると1エポック終わるごとに、「gan_convolutional」というフォルダ内に上記のような画像が生成されているはずです。

1エポック目

1エポック目

まずはGANが1エポック終了時に生成した画像です。

「これは何でしょう?」と聞かれたら数字と答えるとは思いますが、まだ形を成していない箇所も多いですよね。

0は簡単なのか初回から形ができている箇所も多いです。

70エポック目

70エポック目

続いて70エポック終了時に生成された画像です。

かなり完成形に近いですよね。

ただよく見ると、3、5、8、9の生成に苦戦している傾向があります。

今回はMNISTの数字画像を学習して、そのまま同じものをGANで生成していますが、ここから発展させるとAの特徴とBの特徴を組み合わせたような新しい画像が作れたりするようです。

個人的にGANへの興味が強いので、しばらくGANの研究を進めていきたいなと考えております。

実行終了までに長い時間がかかりました

GANのような画像を生成する機械学習は、「とんでもなく長い時間とコンピュータの容量を食う」ということを、今回身を持って体験しました。

ちなみにどれくらい時間がかかったかというと、1エポック終わるのに約1時間です。

100エポック回すプログラムだったので1日ずっと動かしてようやく1/4の進捗で、全て終わるまでに4日もかかる計算となります。

残念ながら3日目の71エポック目でJupyter Notebookにカーネルエラーが起こってしまい、途中終了となってしまいました。

長い時間がかかってしまったのは私が使っているのが普通のWindowsパソコン(CPU)ということもあります。
※普通に購入したPCはほぼCPUです

なので本格的にGANをやるならGPUマシンの必要性を強く感じました!

キュウゾウ

可能性が大きく魅力的なだけにGANの道はなかなかに険しそうです!
今後もがんばっていきます。