【DCGAN-Keras入門】付加情報無しに出力画像コントロールする♪

今回、出力画像をコントロールしたいということで、そもそも種ノイズはどこまで減らせるかをやってみました。コントロールした結果、いわゆるあの演算画像も得られたので記事にします。つまり、今回は「付加的なデータ付与無しに、二次元の場合について出力画像コントロールを実施できる」ことを示す。
以下がとりあえず、種ノイズ二次元で出力コントロールして得られた結果です。
パラメータに依存して画像が徐々に変化する様子がわかります。
![2D_control_Output_22000.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233744/19c557e4-e81f-e1ba-ec87-65d22550f58f.gif)
###やったこと
・種ノイズの次元を減らしてみる
・種ノイズを指定して出力画像をコントロールする
###・種ノイズの次元を減らしてみる
コードは以下に置きました。
・[DCGAN-Keras/keras-dcgan_trial_paper_final.py](https://github.com/MuAuan/DCGAN-Keras/blob/master/keras-dcgan_trial_paper_final.py)
前回のコードと同じですが、いろいろ試してすっきりしました。
今回変更した部分は以下の種ノイズの次元です。
まず、generator_modelの入力の次元を変更します。

```py
def generator_model():
    model = Sequential()
    model.add(Dense(8*8*128, input_shape=(2,))) #1024,100 10
```
これに合わせて、乱数の発生個所を変更します。

```py
    for i in range(0 * 1000,31 * 1000):
        batch_images = image_batch(batch_size)
        noise = np.random.uniform(size=[batch_size, 2], low=-1.0, high=1.0) #ここの次元を32*32 10などと変更
        generated_images = generator.predict(noise)
        X = np.concatenate((batch_images, generated_images))
        y = [1] * batch_size + [0] * batch_size
        d_loss = discriminator.train_on_batch(X, y)
        noise = np.random.uniform(size=[batch_size, 2], low=-1.0, high=1.0) #ここの次元を32*32 10などと変更
        g_loss = discriminator_on_generator.train_on_batch(noise, [1] * batch_size)
```
これで学習すると以下のような結果が得られます。
以下は１０Dの場合です。かなり精緻な画像が得られます。
![2D_Output_.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233744/a1651b19-6f00-85e2-e0af-174b519a5d1a.gif)
ちなみに１Dでも以下のように種類は少なく感じますが、一応まともな画像が得られます。
![1D_Output_.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233744/740688e1-d390-7636-6440-fba57a0c8ab6.gif)
ということで、二次元でも同様に出力画像が得られます。
###・種ノイズを指定して出力画像をコントロールする
出力はdef generate(BATCH_SIZE=55, ite=10000, nice=False):を使う。

```
>python keras-dcgan_trial_paper_final.py --mode generate --iteration 22000
```
ここで変更したのは

```py
def generate(BATCH_SIZE=55, ite=10000, nice=False):
    g = generator_model()
    g.compile(loss='binary_crossentropy', optimizer=Adam(lr=0.0002, beta_1=0.5))
    g.load_weights('./gen_images/generator_%d.h5'%ite)
。。。
 else:
        for i in range(10):
            noise = np.random.uniform(size=[BATCH_SIZE, 2], low=-1.0, high=1.0) #ここの次元を32*32 10などと変更
            for j in range(25):
                noise[j]=np.array((-1+j/25, -1+i/10))  #(-1+i/10, -1+j/25)
            print('noise[0]',noise[0])
            plt.imshow(noise[0].reshape(2,1)) #32,32
            plt.pause(0.01)
            generated_images = g.predict(noise)
            plt.imshow(generated_images[0])
            plt.pause(0.01)
            #image_noise = combine_images(noise.reshape(BATCH_SIZE,2,1,))
            #image_noise.save("./gen_images/generate_noise_%05d_%d.png" % (ite,i))
            image = combine_images(generated_images)
            image.save("./gen_images/generate4_%05d_%d.png" % (ite,i))
            print(i)
```
ここで変更したのは以下の部分です。
簡単にベクトルが与えることができるので二次元でやってみました。
二行目は種ノイズ・ベクトルの初期化のために入れています。

```py
        for i in range(10):
            noise = np.random.uniform(size=[BATCH_SIZE, 2], low=-1.0, high=1.0) #ここの次元を32*32 10などと変更
            for j in range(25):
                noise[j]=np.array((-1+j/25, -1+i/10))  #(-1+i/10, -1+j/25)
```
の部分です。これで種ノイズとして以下のような数値配列を与えています。

```
noise[0] [-1. -1.]
0
noise[0] [-1.  -0.9]
1
noise[0] [-1.  -0.8]
2
noise[0] [-1.  -0.7]
3
noise[0] [-1.  -0.6]
4
noise[0] [-1.  -0.5]
5
noise[0] [-1.  -0.4]
6
noise[0] [-1.  -0.3]
7
noise[0] [-1.  -0.2]
8
noise[0] [-1.  -0.1]
9
```
これらの出力画像として、最初に示した画像が得られます。
###まとめ
・種ノイズの次元を変えて出力画像の変化を見た結果、精緻さが次元依存している
・種ノイズは1次元でも画像が得られる
・付加的なデータ付与無しに、二次元の場合について出力画像コントロールを実施した

・いろいろなGANを試してみようと思う
・以下に参考を貼っておく
【参考】
・[続・GANによる二次元美少女画像生成](https://medium.com/@crosssceneofwindff/%E7%B6%9A-gan%E3%81%AB%E3%82%88%E3%82%8B%E4%BA%8C%E6%AC%A1%E5%85%83%E7%BE%8E%E5%B0%91%E5%A5%B3%E7%94%BB%E5%83%8F%E7%94%9F%E6%88%90-a32fbe808eb0)
・[eriklindernoren/Keras-GAN](https://github.com/eriklindernoren/Keras-GAN)