キュウゾウ
・直感DeepLearningという書籍がとても良い
・4章の「MNISTを偽造するための敵対的なGAN」を実装するのにつまづいた
・何とか実装できたので、誰でも実装できるように書籍の内容を補足した
これまで機械学習の初心者として勉強してきて、すごく役立ったなぁと思えるのは「Udemyの各動画」と「直感DeepLearningという書籍」です。
直感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」をインストールすることができると思います!
キュウゾウ
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の実行完了までにかかる時間はとてつもなく長いです
書籍の「直感ディープラーニング」の内容に、ここまで修正を加えてようやくとエラーなしで実行ができました!
実行が始まると1エポック終わるごとに、「gan_convolutional」というフォルダ内に上記のような画像が生成されているはずです。
1エポック目
まずはGANが1エポック終了時に生成した画像です。
「これは何でしょう?」と聞かれたら数字と答えるとは思いますが、まだ形を成していない箇所も多いですよね。
0は簡単なのか初回から形ができている箇所も多いです。
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マシンの必要性を強く感じました!
キュウゾウ
今後もがんばっていきます。