#はじめに
私は文系の私立大学生です。
機械学習初学者の中の更に初学者です。
そんくらいわかれや!とツッコミたくなる箇所があるかもしれませんが、お手柔らかにお願いします。
#ColaboratoryでDCGANを試みる
本記事は、私が学習した流れに沿って記述しています。
##まずColaboratoryに触れる
紆余曲折あって機械学習で画像生成にチャレンジ!となった私ですが、
GPUも積まれてないWindowsラップトップしかありませんでした。
そこでGoogle Colaboratoryの力をお借りすることにします。
こんな凄いサービスが無料で使えるなんて、いい時代ですね。
Colaboratory自体の使い方はこれらを参考に覚えました
[1. はじめに — ディープラーニング入門:Chainer チュートリアル]
(https://tutorials.chainer.org/ja/01_Welcome_to_Chainer_Tutorial.html)
[Google Colaboratoryで初めての機械学習 - Qiita]
(https://qiita.com/mafunity_/items/464d70915c1815e9a628)
[【秒速で無料GPUを使う】TensorFow(Keras)/PyTorch/Chainer環境構築 on Colaboratory - Qiita]
(https://qiita.com/tomo_makes/items/f70fe48c428d3a61e131)
##DCGANを試す
無事にColaboratoryが扱えるようになったので、
DCGANを導入して試してみましょう。ガッテン。
ページはこちらを参考にしました。
[Google ColaboratoryでLINEスタンプ画像生成に挑戦! - Qiita]
(https://qiita.com/enmaru/items/01c3abccd4b132865686)
[DCGANでポケモンとアイマスを作成したった - Qiita]
(https://qiita.com/yoyoyo_/items/4df8d78b5118190bbcd2#%E3%82%AA%E3%83%AA%E3%82%B8%E3%83%8A%E3%83%AB%E5%AD%A6%E7%BF%92)
###DCGAN-tensorflowをGithubからクローンする
この項目のコードは[DCGANでポケモンとアイマスを作成したった - Qiita]
(https://qiita.com/yoyoyo_/items/4df8d78b5118190bbcd2#%E3%82%AA%E3%83%AA%E3%82%B8%E3%83%8A%E3%83%AB%E5%AD%A6%E7%BF%92)を参考に記述しています。
Colaboratoryは最初contentディレクトリにいるので、rootディレクトリに移動してからgitクローンするのがオススメです。
%cd ../
!git clone https://github.com/carpedm20/DCGAN-tensorflow
contentディレクトリにクローンしても何一つ問題はありませんが、/content/DCGAN-tensorflow
となることを把握しましょう。
私は1時間くらい把握できずに「参考記事通りに行かねぇ!」ってほざいてました。
###MNISTを使ってデモ学習してみる
せっかくDCGANを入れたのですから、早速動かしてみたいですよね。
まずはデモ学習をしてみましょう。
デモ学習にあたり、みんな大好きMNISTを使います。
以下のコードでダウンロードできます。
!python download.py mnist
この方法でMNISTをダウンロードすると自動的にdataディレクトリが作成され、DCGAN-tensorflow/data/mnist
となります。
データセットを用意する際はdataディレクトリに置くことになりますので、いちいち作る手間が省けるわけですね。
ダウンロードが完了したら後は以下のコードを実行するだけです。
!python main.py --dataset mnist --input_height=28 --output_height=28 --train
これで貴方もDCGAN経験者ですね!
#本題:どこに詰まってたのか
ページを参考に、
- データセット(画像集)zipファイルの作成
- Google Driveのマウント
- データセット(画像集)zipファイルのディレクトリコピー&解凍
を完了し、
「いざ機械学習じゃー!」と走らせた私を待ち受けていたのはエラーでした。
MNISTは動いたのになんで・・・?
##NameError:name 'j' is not defined
意気揚々とウッキウキに実行させ、10秒ぐらいして止まりました。
「え!?な、なにごと!?!?」と実行文を見るとそこには
File "/DCGAN-tensorflow/utils.py", line 104, in transform
im = Image.fromarray(image[j:j+crop_h, i:i+crop_w])
NameError:name 'j' is not defined
というエラー文表示・・・。
当初の私は「Githubからクローンしたコードなのだから、コードが間違ってるわけない。MNISTは動いたんだし」と思い込み、ひたすら自分の非を考えました。
結果は[この更新]
(https://github.com/carpedm20/DCGAN-tensorflow/commit/62ce8ac3f2c84d6a85674d51a1a6f982bfeb1bcf#diff-04d2c9518498da64bfa9db44c6211645)が94-95行目の更新と同時に、そのまま104-105行目も同様の更新をしているものの、transform内にj(とi)の変数が定義されてないままというものでした。
今思えばなんてことはありません。エラー文が言ってることそのままです。
変数を新定義できる自信もありませんでしたので、前版のコードに書き換えたものをローカルで作成&Google Driveにアップして、こんな感じでDCGAN-tensorflowディレクトリにコピーしました。
!cp -f /content/drive/My\ Drive/utils.py /DCGAN-tensorflow/utils.py
##'scipy.misc' has no attribute 'imresize'
今度こそ動くはず!と思ったら早速のエラー文。かなしい。
どうやら前版コード
cropped_image = scipy.misc.imresize(image, [resize_height, resize_width])
return np.array(cropped_image)/127.5 - 1.
の「scipy.misc」が見当たらなかったそうです。
どこかの更新でいつの間にかオミットされてたんでしょうね。
今の私には必要なので手動で導入することにしました。
導入はこちらのページにお世話になりました。
[scipy.misc.imread の import エラー - Qiita]
(https://qiita.com/2480jiviolet/items/6ff51e0dd12f76c01ecd)
#コイツ・・・動くぞ・・・!
無事に画像ファイルだけを置いたディレクトリを読み込んで学習しはじめてくれました。
ただサンプルコードと先駆者の記事を真似てるだけの状況ですが、動くものはとても嬉しいですね。親父が熱中するわけだ・・・親父いないけど。
現在進行系で学習していますので、完了次第追記すると思います。
#追記:動きました
無事に画像だけが入ったディレクトリで学習・自動生成をすることができました。
使用した画像は3Dグラフィックのポケモンpng画像です。No.001~No.500のポケモン画像500枚を用いました。
実行は以下のコードで行いました。3行目は実行後の出力結果等をGoogle Driveに避難させるために記述しています。
画像の高さや拡張子指定など、パラメータを弄りたい方はこちらを参照してください。
[DCGAN-tensorflow/main.py at master · carpedm20/DCGAN-tensorflow]
(https://github.com/carpedm20/DCGAN-tensorflow/blob/master/main.py)
%cd /DCGAN-tensorflow
!python main.py --train --dataset PokemonAiSet --input_height=120 --output_height=120 --input_fname_pattern="*.png" --epoch=1000
!cp -r /DCGAN-tensorflow/out /content/drive/My\ Drive/samples-on-colab/PokemonAiOut
無事に実行できましたが、なぜか7倍の7000回学習をしていました・・・。epoch=1000なのになぜ?
ひとまず、動くものは動いたし生成もできたので良しとします。
##実際に生成できた画像
学習回数が200回ごとに生成されていますので、200,400,600,...,7000と並んでいます。
x200 | x400 | x600 | x800 | x1000 |
---|---|---|---|---|
200 | 400 | 600 | 800 | 1000 |
1200 | 1400 | 1600 | 1800 | 2000 |
2200 | 2400 | 2600 | 2800 | 3000 |
3200 | 3400 | 3600 | 3800 | 4000 |
4200 | 4400 | 4600 | 4800 | 5000 |
5200 | 5400 | 5600 | 5800 | 6000 |
6200 | 6400 | 6600 | 6800 | 7000 |