GANに自作イラストを学習させる[前編：実験]

# 概要
DCGANを用いた画像生成に取り組んだので、その記録のための記事になります。
技術的な解説というよりは、実験と考察が主な内容です。ご了承ください。

ゴール：自作イラストをデータセットに用い、GAN(DCGAN)に学習させて画像を生成する。

# データセット
趣味でアニメや漫画のキャラクターイラストを描いており、そのイラストを学習用画像に使用しました。

* 画像サイズ: 200*200
* チャンネル数: 1 （グレースケール）
* 枚数: 176
* 形式: png （透過なし）

2018年4月〜2019年6月までに描かれたものの中から、オリジナル（一次創作）の顔部分を中心に選出しています。
キャラクターの年齢・性別は特に区別していません。

![example.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261251/7675624d-3cb4-1e9b-3783-3ee36abee38f.png)


# 学習
ソースコードは[今さら聞けないGAN （2）　DCGANによる画像生成](https://qiita.com/triwave33/items/35b4adc9f5b41c5e8141)で公開されているものをお借りしました。
Generatorの畳み込み層が画像サイズの200*200に合うようパラメータを調整しています。
また、以下の学習条件を変え、3回ほど学習・画像生成を実行し実験していきます。

* 潜在変数の次元数
* 学習用画像枚数
* 学習回数
* Discriminator学習の正解ラベルに対するノイズ

## 1回目
学習条件

* 潜在変数の次元数: 5
* 学習用画像枚数: 176
* 学習回数: 7000
* ノイズ: 0 （補正なし）

### 7000イテレーション
![mnist_fromFixedValue_7000.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261251/bee15872-7dc6-dfa4-8704-05e017d003c6.png)

### 学習経過GIF
![1566452160jUKRxA9pUpJCBeA1566452158.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261251/93472004-88b4-d6d5-6b50-c7d8c1db4f0f.gif)

### 学習経過グラフ
![training_7000のコピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261251/1635d601-423f-4612-9e76-9af6c06e0bd3.png)

### 所見
もともと10000回学習をまわす予定だったのですが、誤操作で学習が中断されてしまい、7000回までの記録しか残っていません。（もっとも、7000回目の時点で芳しい成果ではないのですが……）
1500イテレーション頃にlossが大きくなり、精度があがらなかったDiscriminatorの学習が進む、という現象が見られました。勝手に「Discriminator革命」と呼んでいます。決定的な特徴量の獲得、人間的に表現すると「偽物を見破るコツを掴んだ」といったところでしょうか。偶然なのかトリガーがあったのか、原因はわかっていません……
後ほど考察しますが、今回の学習の問題点として以下のことが挙げられます。

* Discriminatorが強くなりすぎ、学習の拮抗が保たれなくなっている
* モード崩壊の傾向が見られる

1回目の結果をふまえて2回目の学習条件を調整しました。

## 2回目
学習条件

* 潜在変数の次元数: 5
* 学習用画像枚数: 176
* 学習回数: 10000
* ノイズ: [正] -0.3 〜 +0.2, [誤] 0 〜 +0.3

### 9500イテレーション
![mnist_fromFixedValue_9500.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261251/4c0c6aca-9767-51ec-318f-6417a8de8366.png)

### 学習経過GIF
![15664571007YoIbulQ3dMxmys1566456981.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261251/a60b4d1a-d75c-359b-84fc-4c3d389197be.gif)

### 学習経過グラフ
![training_9500のコピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261251/ff88c02c-880c-1536-7e8d-6776e8dad203.png)

### 所見
> Discriminatorが強くなりすぎ、学習の拮抗が保たれなくなっている

ということで、Discriminator学習の正解ラベルにノイズを加え、学習を不安定化させることで、Discriminatorが強くなりすぎないように調整しました。
結果として、GeneratorとDiscriminatorの学習は拮抗しているように見えます。
しかし、1回目と比べて2回目はモード崩壊がより顕著になり、生成画像のノイズも際立つようになっています。

## 3回目
学習条件

* 潜在変数の次元数: 10
* 学習用画像枚数: 352 （176枚を左右反転処理）
* 学習回数: 4000
* ノイズ: [正] -0.2 〜 0

### 3500イテレーション
![mnist_fromFixedValue_3500.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261251/b9499eca-7bfc-4df2-12c2-70ff56021bab.png)

### 学習経過GIF
![1566458241My7Ua2uLrFBlV5X1566458238.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261251/248d1803-b5b2-dc35-26f7-661a46301dfd.gif)

### 学習経過グラフ
![training_3500のコピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261251/b9817080-a683-7736-9d8a-d1e0b84740c9.png)

### 所見
> しかし、1回目と比べて2回目はモード崩壊がより顕著になり、

モード崩壊を避けるための対策として、学習用画像枚数を増やし、潜在変数の次元数を10に設定しました。
モード崩壊の傾向自体は未だにありますが、2回目よりは緩和されているように見えます。

> 生成画像のノイズも際立つようになっています。

生成画像が荒くなったのは「Discriminatorの学習を不安定化させすぎたため」と考え、ノイズの加え方を見直しました。
学習用画像の正解ラベルにのみノイズを加えるようにし、その幅も小さくなるよう調整しています。
結果、GeneratorとDiscriminatorの学習を拮抗させたままにすることには成功していますが、生成画像が鮮明になったとはいえない状態です。
原因としては、学習用画像枚数に対して学習の回数が不足していることが考えられます。
（なぜ4000イテレーションで学習を止めてしまったのか明確には覚えていないのですが、おそらく学習させるのに時間的な問題があったためと思われます……）

# 成果
ゴール：自作イラストをデータセットに用い、GAN(DCGAN)に学習させて画像を生成する。
→ *「元になったデータの特徴量を獲得しつつある」　と評価できる程度の成果は見られた*
　 が、**鮮明な画像は得られなかった。**

MVPをあげるなら、1回目の3000イテレーション頃は「それっぽい」かなと思います。
![item.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261251/13454ebc-fb41-f2bd-dd43-dd249d13648b.png)

# 一連の実験に関する反省点
* 学習回数が統一されていない。統一されていなければ比較にならない。
* 学習経過を記録するスパンが統一されていない。(500, 1000)

* * * 

長くなったので、後編：考察パートに続きます。
GANに自作イラストを学習させる[後編：考察]
https://qiita.com/gomahalmaki/items/d34286dcdb0bd49500f5

## 参考
* 今さら聞けないGAN （2）　DCGANによる画像生成 ( https://qiita.com/triwave33/items/35b4adc9f5b41c5e8141 )
* はじめてのGAN（ https://elix-tech.github.io/ja/2017/02/06/gan.html ）
* GAN(Generative Adversarial Networks)を学習させる際の14のテクニック ( https://qiita.com/underfitting/items/a0cbb035568dea33b2d7 )