GANを使って猫の画像で遊んでみる

# この記事について
この記事は、GANについて調べている私の取り入れた知識をテキトウにまとめておくためのものです。

***ほんのコードを書くのは嫌なのでコーディングはしません。***

役立つかどうかは不明。

# 使用した開発環境
Google Colaboratory
Python3

# 参考資料
[実践GAN](https://www.amazon.co.jp/%E5%AE%9F%E8%B7%B5GAN-%E6%95%B5%E5%AF%BE%E7%9A%84%E7%94%9F%E6%88%90%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E3%81%AB%E3%82%88%E3%82%8B%E6%B7%B1%E5%B1%A4%E5%AD%A6%E7%BF%92-Compass-Books%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-Jakub/dp/4839967717/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=2NIO7GGXANBB7&keywords=%E5%AE%9F%E8%B7%B5gan&qid=1584599490&sprefix=%E5%AE%9F%E8%B7%B5GAN%2Caps%2C1011&sr=8-1)

# GANの大まかな概要
GANはGenerate Adversarial Networkの略で日本語にすると敵対的生成ネットワークという。
たまに見かける「AIの書いた絵」を生成したりする技術。

# GANの中身
GANはモデルの構造や活性化関数などとの考え方ではなく、学習手法の一つ。
教師あり学習、教師なし学習、強化学習と同じレイヤーの考え方。２つのモデルをぶつけ合って精度を上げていくのは強化学習に似ていると感じました。

# 学習方法
名前の通り、敵対する２つのモデルを交互に学習させていくことでAIを成長させていく学習手法。
用意するモデルは２つ。

* 識別機
* 生成機

識別機は本物の画像と偽物の画像を見分けるための学習モデル。
生成機は偽物の画像をランダムの配列から生成する学習モデル。

### 識別機の学習
真の画像を１、偽の画像を０とラベリングして識別機の学習を行う。
最初の段階では生成機が生成する画像というのはほぼノイズなので、容易に識別を行うことができる。

MNISTを例にすると以下のような学習になる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296240/75ce0c77-3860-8fa5-400d-3373e0f036c9.png)

### 生成機の学習
偽の画像を１とラベリングして生成機の学習を行う。
このとき識別機の学習は行わない。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296240/7bfcef17-7eec-b17e-0be7-a2f9d8cbf2f0.png)

偽の画像（０）を真の画像（１）と嘘をついて学習させることによって、偽の画像の精度を向上させていく。

### 学習モデル
全結合やCNNを使用して学習することを４章までで学びます。

全結合モデルによる生成画像
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296240/fb3fb588-8907-6270-4e98-d44ddc258340.png)

CNNモデルによる生成画像
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296240/d40f1c4d-23d5-caba-d760-e7534d8dbe4e.png)

CNNにすると全結合で発生していたノイズのような白い点々が無くなっていますね。
やはり画像処理にはCNNなのか。
また、こうしたところから分かる通り、GANはモデルの構造は考慮しません。つまりRNNやLSTMを使用したデータも生成することができるということです。

# 猫の画像でも試してみた
学習データが少ない（３２×３２の６０枚の猫の画像）と生成画像がうまく学習できませんでした。
画像を少なくすればそっくりな画像が生成されるのかなと思ったのですが、そうでもないようですね……

１００万回学習した猫
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296240/7c144335-7372-8c4c-a6a3-42da748d9002.png)

MNISTのコードを流用したからソースコードミスということはないと思うので、学習回数を増やすか、画像を増やせば行けるのではないでしょうか。

# 猫の画像でもっと試してみた
* 学習データを探すのが面倒！
* 学習回数を増やすのは時間がかかりすぎる！

という怠け者精神で、物は試しと画像を１枚だけにしてみます。
使用したの画像
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296240/3ef3de24-d09e-43b6-b444-83efa59f797d.png)

学習回数は１０万回！
さぁ、その結果は！！！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296240/00dfcd77-7348-e31a-3828-96ec6706ec85.png)

そっくりな画像ができたー！！！！！
え、完璧じゃね？

今回は１０万回学習して、１万回学習ごとに画像を表示していたのですが、１万回の段階ですでに猫が猫でした。
もっと細かく見ていく必要がありますね。

# 猫の画像でもっともっと試してみた
今度は種類を増やします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296240/b2013deb-e3d2-fca1-58b2-a523b0029c05.png)

画像を２枚にして、毎回どちらかの画像を参考に学習をします。
学習結果がこちら↓
画像出力は２００回毎２０００回学習

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296240/a71c0c5e-2ab2-c1bd-447c-bd04751290f1.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296240/4726310e-aa3c-77cd-4e9f-df67658ce7f1.png)

学習用の画像が少ないと最終的にどっちか片方に寄るみたいですね。
繰り返すとだいたい４００回目くらいでどちらかの画像に固定されます。


# 猫の画像でもっともっともっと試してみた
今度は画像を４枚使用して、さらに背景が黒いものを集めてみました。
構図も猫が前を見ているものだけですので、これなら面白いのができるのでは！？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296240/8d09f325-7cc7-0a03-c7d0-81bcdcdaaccb.png)
また、学習にはランダムに二枚の画像を使用することにします。

学習結果がこちら↓
画像出力は２００回毎２０００回学習
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296240/8b673305-dcfc-33dd-e9b4-a2824aa033cc.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296240/a21dd97c-c1c8-2082-e0f4-0b6e1878fb9d.png)

前半のノイズが多い部分は飛ばします。
なかなか可愛い猫ができました！
少しずつ、与えていく画像データを増やしていくと猫が生成されて嬉しくなりますね！

# **G A N は い い ぞ ！！！！！！**