この記事について
この記事は、GANについて調べている私の取り入れた知識をテキトウにまとめておくためのものです。
ほんのコードを書くのは嫌なのでコーディングはしません。
役立つかどうかは不明。
使用した開発環境
Google Colaboratory
Python3
参考資料
GANの大まかな概要
GANはGenerate Adversarial Networkの略で日本語にすると敵対的生成ネットワークという。
たまに見かける「AIの書いた絵」を生成したりする技術。
GANの中身
GANはモデルの構造や活性化関数などとの考え方ではなく、学習手法の一つ。
教師あり学習、教師なし学習、強化学習と同じレイヤーの考え方。2つのモデルをぶつけ合って精度を上げていくのは強化学習に似ていると感じました。
学習方法
名前の通り、敵対する2つのモデルを交互に学習させていくことでAIを成長させていく学習手法。
用意するモデルは2つ。
- 識別機
- 生成機
識別機は本物の画像と偽物の画像を見分けるための学習モデル。
生成機は偽物の画像をランダムの配列から生成する学習モデル。
識別機の学習
真の画像を1、偽の画像を0とラベリングして識別機の学習を行う。
最初の段階では生成機が生成する画像というのはほぼノイズなので、容易に識別を行うことができる。
MNISTを例にすると以下のような学習になる。
生成機の学習
偽の画像を1とラベリングして生成機の学習を行う。
このとき識別機の学習は行わない。
偽の画像(0)を真の画像(1)と嘘をついて学習させることによって、偽の画像の精度を向上させていく。
学習モデル
全結合やCNNを使用して学習することを4章までで学びます。
CNNにすると全結合で発生していたノイズのような白い点々が無くなっていますね。
やはり画像処理にはCNNなのか。
また、こうしたところから分かる通り、GANはモデルの構造は考慮しません。つまりRNNやLSTMを使用したデータも生成することができるということです。
猫の画像でも試してみた
学習データが少ない(32×32の60枚の猫の画像)と生成画像がうまく学習できませんでした。
画像を少なくすればそっくりな画像が生成されるのかなと思ったのですが、そうでもないようですね……
MNISTのコードを流用したからソースコードミスということはないと思うので、学習回数を増やすか、画像を増やせば行けるのではないでしょうか。
猫の画像でもっと試してみた
- 学習データを探すのが面倒!
- 学習回数を増やすのは時間がかかりすぎる!
という怠け者精神で、物は試しと画像を1枚だけにしてみます。
使用したの画像
学習回数は10万回!
さぁ、その結果は!!!
そっくりな画像ができたー!!!!!
え、完璧じゃね?
今回は10万回学習して、1万回学習ごとに画像を表示していたのですが、1万回の段階ですでに猫が猫でした。
もっと細かく見ていく必要がありますね。
猫の画像でもっともっと試してみた
画像を2枚にして、毎回どちらかの画像を参考に学習をします。
学習結果がこちら↓
画像出力は200回毎2000回学習
学習用の画像が少ないと最終的にどっちか片方に寄るみたいですね。
繰り返すとだいたい400回目くらいでどちらかの画像に固定されます。
猫の画像でもっともっともっと試してみた
今度は画像を4枚使用して、さらに背景が黒いものを集めてみました。
構図も猫が前を見ているものだけですので、これなら面白いのができるのでは!?
また、学習にはランダムに二枚の画像を使用することにします。
前半のノイズが多い部分は飛ばします。
なかなか可愛い猫ができました!
少しずつ、与えていく画像データを増やしていくと猫が生成されて嬉しくなりますね!