コードノート

コードノートはwebを中心にテクノロジー・クリエイティブを伝えるWebメディアです。コードリンク代表、片岡亮が執筆しています。

Google Colaboratoryで学ぶ、ディープラーニングのDCGANによる教師無し画像生成

f:id:moba13:20120718190846j:plain
以前、こちらの記事に書いたようにディープラーニングについて専門家でもない僕がゆるく非IT系な方向けに話す、という勉強会をしたのですが、まさかの第2回も開催したのでその内容も公開することにします。

blog.codelink.co.jp

前回は、単にどんなディープラーニングの技術が実際にあるかをまとめて紹介するだけだったのですが、今回は実践編として既存のディープラーニングプログラムを動かす、ということをしました。

サンプルコードをgithubからコピーして動かすだけとはいえ、数年前だったら環境構築で全員挫折していただろうに、今は学習環境が整っていて素敵ですね。

概要の説明なども含め、1~2時間ほどで一応みなさん実行できました。

GANって何?

= 敵対的生成ネットワーク(Generative adversarial networks)

前回の記事にも書いてますが、以下のようにAIが入力した画像を学習し、オリジナルの画像を生成するよ!という技術です。

詳細な説明記事はweb上にたぶん100万記事ぐらいあります。

概略だけ言えば、ジェネレーター(画像の生成器)とディスクリミネータ(画像の識別器)という2つのモデルを作成し、ジェネレーターは本物っぽい偽画像を作り、ディスクリミネータはそれが偽物かどうか見抜く、というバトルを繰り替えす中でお互い成長し、最終的にまるで本物のような画像が作れるという、青春バトルものマンガのようなAIです。

本来的な学習ステップとしていきなりGANをやるのは、行程をすっ飛ばしまくっていますが、仕事でもないしおもろいことやらないとみんな眠いよね!というチョイスでした。

また、上記の例はGANの中でも、styleGANという新しめな技術でさらにその中でも学習がうまくいったものを公開しているように見受けられます。

今回は、styleGANでなく最初期に公開されたDCGANという、GANを作るチュートリアルの時にはほぼこれが出てくるってやつを使いました。モデル構造もシンプルなので理解しやすいですが、その分そんなにはうまく画像は生成されません。

僕がポケモンやドラクエのモンスターを数時間学習させたものでもこんなもんです。

手書き文字ぐらいのシンプルなものなら、割と良い具合に。

論文自体は2015年11月に公開され、使ってみました!みたいな記事も一番出てきますね。APIとして公開されているGANもDCGANによるものが、現状まだ多い気がします。

arxiv.org

実装されたコードはこちらのものを利用しました。

github.com

TensorFlowで書かれたもので、今ではkerasやchainer、PyTorchといったより手軽にコードを書けるディープラーニング用のライブラリ製のものもたくさんgithub等で公開されていますが、このTensorFlow製のものがオプションも豊富で使いやすかったため採用しました。

Python2で書かれているので、実行環境がPython3だとそのまま使えないのだけが詰まりどころでしょうか。

model.pyを見ればジェネレーターもディスクリミネータも、畳み込み層を4層入れてるだけなんだなぁとか、ぼんやりはわかって面白いです。

必要な事前準備

GANの学習のためには、事前に「AI君、キミはこれらの画像を元に、新しい画像を作ってね!」という画像の準備が必要です。

最低でも100枚ほど、精度を上げるためには数千枚あった方が良いです。細かいことを言うとこんなかんじ

・画像フォーマットの統一 (今回はpngに統一でやりました)
・画像の大きさの統一 (デフォルトでは108px×108px)
・exif情報の削除 (Photoshopのバッチ処理で画像加工時などについてしまうケースもあります。)
・zipに圧縮(フォルダごと圧縮でなく、画像をすべて選択の上、圧縮してください。サブディレクトリが発生しないように。unzip時にオプションで解決しても良いけど)

この準備が手間ですが、ディープラーニングはデータ集めが大事っていうのはこういうことなのだなぁというぷち体験ができます。

勉強会では、インターネットの大海に転がっていたポケモンの画像一覧などを共有しましたが、さすがに公に2次配布するのは色々よろしくなさそうなので、ここでは控えておきます。

研究用に公開されている画像も多くあり、「機械学習 データセット」などでググれば商用で無ければ自由に使える画像データも多く手に入るはずです。

無料のディープラーニング学習環境 Google Colab

いざディープラーニングをやろう!と言っても、自身のmacでその実行環境を作るだとか、さらに高速な学習完了を作るためにはハイスペGPUを搭載したパソコン(25万円~ できれば100万円ぐらい)を購入する必要がある、という準備が必要で詰みます。

そんな中、2018年頃登場したのが、Google Colaboratory(通称 : Google Colab)です。

colab.research.google.com

ブラウザさえあれば、環境構築不要・無料で機械学習の学習環境が作れる??マジかよGoogle最高すぎでは???と界隈ではかなり話題となっていました。

ブラウザ経由でクラウド上にあるGoogleのPCを使うイメージなので、windowsの方でもmacと同様に使うことができます。

無料な分、12時間ごとに全データの削除がかかるといった制限はあるのですが、勉強に使うだけであれば十分ですね。

また、Colab上に記載したコマンドはノートブックとして共有も可能で、チュートリアル的なものを作成するのも容易です。今回は、この機能を使ってみなさんにポチポチと実行してもらいました。

書籍では、こちらの本がディープラーニングの各種プログラムを実行するためのColabノートブックをたくさん制作されていて良かったです。

■図解速習DEEP LEARNING | Amazon

巷で話題の技術書典で販売されていたものを書籍版として加筆したもののようですね。

DCGANを実践するためのGoogleColabノートブック

というわけで、僕が作成したDCGANを実行するためのノートブックを公開しておきます。

colab.research.google.com

上記ファイルを開き、画面左上の「PLAYGROUNDで開く」をクリックすれば、ご自身のColab環境で学習をすることができます。

ただこの内容も、下記記事を参考にしたものであり、僕が作ったと言えるものではありません。追加で生成結果画像をGifアニメ化するコードを追加してあるぐらいです。

qiita.com

この記事の制作者様、DCGANのコード制作者様、DCGANの論文制作者様、GoogleColabの制作者様、TensorFlowの制作者様、Pythonの制作者様、Linuxの制作者様、各種PCパーツの製作者様方..etc に感謝の念を遠隔で送ってから使いましょう。
基本は、このファイル内にある各コマンドにカーソルを合わせると出てくる再生ボタン(「▼」を横にしたようなボタン)を押していけば、実行できるようになっています。コマンドを編集した後であれば、Shift+Enterで実行。

書き換えが必要な部分は捕捉コメントを書いてあるので、それに沿って変更し実行してください。

が、プログラムをしたことが無い方はどこかしらでエラーが出て詰まります。

勉強会でも基本的にほぼそのサポートをするのがメインでしたが、エラーの内容を見て適宜「ls」コマンドでファイルの存在を確認したり、「pwd」コマンドで自分が今いるフォルダを確認しながら、実行していってください。

cd、mkdir、cp、unzip、ls、pwd、git clone ぐらいのコマンドならなんとなく知っているよ、という人であれば余裕だと思います。

簡易Q&A

Q.プログラムの学習が完了したっぽいけど、「/home/DCGAN-tensorflow/out/(学習結果フォルダ)/samples」に結果画像が1つも出ないんですが?

A. 画像枚数が少なく学習回数が少ないと、結果を出力するまでのポイントに届かず、結果を出す前に学習が終わっている可能性があります。

なので、学習を実行するコマンドを下記のように書き換え、学習回数増加と、画像を出力する頻度減をしてみてください。

!python2 main.py --dataset (データセットフォルダ名) --input_fname_pattern="*.png" --epoch=100 --sample_freq=100 --train --crop

--epochが学習回数。(サンプルだと25になってる)
--sample_freqが結果画像を出力する頻度。(デフォルトだと200になってる)

Q.もっと長く学習させて良い結果を作りたいです。

A.学習を開始するコマンド内の「--epoch=25」を「--epoch=10000」などに書き換えて実行すればokです。(これで1万回学習を実行)

ただ、たくさん学習する際にはいくつか補足が必要なので解説します。

1.Colabの時間制限問題

GoogleColabは無料で使えるのですが、その代わり12時間ごとにデータがすべて削除されるという制限があります。

そのため、学習は最高でも数万回程度が限度かと思います。(画像の枚数で前後)

また画像の枚数が数百枚程度だと、epoch3000回程度であまり画像が代わり映えしなくなってきます。通称「過学習」

2.ブラウザ開きっぱなしが必要問題

GoogleColabは12時間がリセットかかるのと合わせ、1時間半画面を開いてなくてもリセットがかかるという制限があります。

また画面を開いていたとしても、別のタブを開いていたり、ブラウザ以外のアプリを見ていても10分ほどでセッションが切れる(キミ、画面もう見てないよねという判定)がされます。

なので、長時間学習する際には、Colabの画面を開いたまま他の作業はせず放置する必要があります。また、その間PCがスリープモードになってもダメなので、PCの設定を変えPCを放置してもスリープしない設定に変更してください。

3.学習完了するまで、結果の確認できない問題

基本的には、学習が完了するまで結果の画像を確認するコマンドを実行することができません。

しかし、何時間も学習を持つのも寂しいので、途中で都度結果を確認する方法があります。(放置したまま12時間経ってしまって、データ消えちゃうとより寂しい。)

それは、学習しているタブとは別に、もう一つ別タブでGoogleClabを開き、そこでコマンドを実行するという方法です。

これなら、学習を進める処理と平行して、都度学習した結果を確認できます。そのためのノートブックも公開してあるので、ご利用ください。

colab.research.google.com

4.学習中にブラウザが落ちる問題

長時間、学習をさせているとブラウザがメモリを大量に消費しブラウザが落ちるという問題を確認しています。

(Windowsだとブラウザが固まる、macだと「PCの容量が足りません」的なメッセージが出る。)

この問題は、学習のログである
[ 1 Epoch:[ 0/50] [ 0/ 11] time: 5.4089, d_loss: 7.00813675, g_loss: 0.00110264
みたいな表示が溜まると、起きてしまう問題のようです。

そのため、元のプログラムからこのログ表示をしないように変更したファイルをアップしたので、そちらに上書きを行い実行してみてください。

(print文をコメントアウトしただけのgithubに公開するまでもないものをdropboxで共有しているものなので、そのうち消してしまっているかもしれません。)

この処理は、先ほど貼ったColabノートブックの「KTP-学習中に平行して実行結果を確認する用.ipynb」の一番最後、「modelファイル上書き」という部分に記載してあります。

 

以上!