IT

【初心者向け】CIFAR10でAutoEncoderをKerasを使って実装してみた

こんにちは。Toruです。

 

最近、MNISTというデータセットを使ってAutoEncoderを実装しているのですが、

他の人もたくさんやっているっていうことと、いまいち画像データが白黒ということもあり面白く無くなってしまいました。

 

なので今回はCIFAR10というデータセットとKerasというディープラーニングライブラリを使ってAutoEncoderを実装しました。

 

まあまあいい感じの結果が出たので、これを紹介していきたいと思います。

なるべく初心者の方にもわかりやすく説明していきますので、皆さんの参考にしていただけたら幸いです。

CAFAR10についての紹介

  • 50000の学習データと10000の評価データからなる32×32×3のデータセット
  • 中身は飛行機、車、鳥などの画像があり、それぞれを10種類のクラスに分かれている。
  • Kerasのデータセットに付属しているためmnistと同様、簡単に呼び出すことができる。

それではいきましょう



【結論】実装したAutoEncoderのプログラム

その前に、私の開発環境

AutoEncoderを実装していくにあたって、まずは私の開発環境について紹介しておきます。

今回はこの様な開発環境で進めていきます。

私の開発環境

  • CPU:Intel Core i7 9700
  • GPU:NVIDIA GeForce RTX 2070 Super
  • OS:Windows 10 Home
  • Python:3.6.1
  • TensorFlow-GPU:1.12.0
  • Keras:2.2.4

 

GPU環境の整え方

作成したAuto Encoderプログラム

早速結果となりますが、作成したプログラムはこちらになります。

 

そして上記プログラムを実行すると、結果はこうなりました。

 

それでは詳しく説明していきます。



プログラムの詳細

importライブラリとdefine関数

まずは定義したライブラリと関数について説明します。

まず初めにこれらのライブラリをインポートします。

これについては詳しく説明する必要はないと思います。

 

その下のnormalizer関数では画像のデータを0~1の間にノーマライズ(正規化)するために定義します。

なぜノーマライズが必要なのかというと、機械が学習するときに扱いやすい数字にするために変換します。

 

扱いやすい数字にするとどうなるかというと、重みの更新が効率化されたり、誤差が収束しやすくなります。

機械学習・ディープラーニングをする上では重要になってきますので正規化については理解できるようにしておきましょう。

  • 画像データを0~1の間にノーマライズ(正規化)する。
  • 正規化することで学習のスピードを上げることができる。
  • 正規化することで損失関数の誤差が収束しやすくなる。

main()関数内

main()関数内はネットワークのモデルを定義しています。

3行目でデータセットの読み込みをしています。

5〜8行目ではそれぞれのパラメータの設定をしています。

10,11行目では、28,29行目でデータを8:2に割り振るために、学習データと評価データをそれぞれ結合しています。

もともとの(学習データ:評価データ)=(50000:10000)で学習させていたのですが、これでも評価データが少なかったようで、損失関数の値が安定しなかったのでこの様にしました。

 

33行目以下はモデルの定義になります。

モデル内ではCNNを使い、過学習防止のために BatchNormalizetion() を使っています。

過学習防止策は BatchNormalizetion() の他に Dropout() が有名ですがBatchNormalizetionはDropoutよりも有効であると言われています。

35行目はInput層です。

少し工夫して重み、バイアスベクトルを初期化しています。

説明すると長くなるのでここでは割愛します。

 

後は普通のCNNですが、 BatchNormalizetion() は Activation(LeakyReLU) の次に定義する様にしています。

Convolutionのフィルターは64→128→64→32→16→3というふうに増減させています。

 

学習したときになかなか学習率が上がらなかったらフィルター数を増やすのがセオリーです。

 

また、このモデル内のパラメータは全てhyperasを使ってパラメータチューニングをし求めました。



おまけ

ちなみに、実行した結果などをグラフ化したり、学習した画像などを保存したりするプログラムを作成したのでそちらも合わせてご覧ください。

画像を保存するフォルダーを日時と時間から作成

学習した結果を保存するとき、ファイル名が被ってしまったりするのめんどくさいので学習した時間をフォルダー名にして学習ごとの結果をそのフォルダーに入れる様にします。

学習にかかった時間を表示

これは有名ですが、処理にかかった時間を表示します。

学習した画像や損失、正解率を画像、グラフで表示

上記のプログラム1行目~18行目では、ランダムに選んだ画像10枚の推論前、推論後を出力します。

出力された結果

こんな感じで出力されます。

上の段が入力された画像で、下の段がAutoEncoderされた画像です。

 

22行目以下は損失関数のグラフと正解率のグラフを出力するプログラムです。

こんな感じで出力されます。

 

モデルや学習結果、エポック数、学習率などの情報をテキストファイルで保存

 

ここでは先ほど作った学習時間ごとにフォルダーにモデルの情報と、パラメータなどの情報が記載されたテキストファイルが保存される様になっています。

こんな感じです。(アイコンが星になってるやつもありますが気にしないでください。)



まとめ

今回はCIFAR10を使ったAuto Encoderについて紹介しました。

昨今、AutoEncoder自体はそこまで使用するシーンは減ってきています。

私も、「Auto Eocderって何に使われてるの?」って聞かれたら少し悩んでしまいます。(笑)

 

しかし、これを応用すれば、今最先端の研究の一つである「超解像」ー例えば画素数の荒い画像を高画質な画像に変換したりーに利用できるのではないかと思います。(現在超解像度に関するサイトや文献は少ないので確かなことは言えませんが涙。)

現在私も超解像のプログラムを探求しています。

 

どこか情報交換できる場所とかないかな〜。あったら知りたいな〜。







ABOUT ME
Toru
24歳。会社資料の文章力を鍛えるためにブログ開設。機械学習・ディープラーニング勉強中。プログラミング、デバイス、PC、ガジェット類について紹介していきます。

COMMENT

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です