pix2pix_cycleGAN-likeモデルができたよ♬ 

これまで、pix2pix(encoder-decoder版)は[女性](https://qiita.com/MuAuan/items/0df02cec6cba414937a8)や[猫顔](https://qiita.com/MuAuan/items/568d0668f9d14765b8fa)学習した後、いろいろなものに適用すると、すべてテンソルが記憶した顔で表現することを見てきた。

これは、一種の記憶であって、それは入力情報から適当に変換して、それらを出現させている。
今回のコードは以下に置いた
[MuAuan/cycleGAN-like](https://github.com/MuAuan/cycleGAN-like)
#cycleGANモデルの原理
　pix2pixのチームは、昨年cycleGANを発明した。
[junyanz/pytorch-CycleGAN-and-pix2pix](https://github.com/junyanz/pytorch-CycleGAN-and-pix2pix)
それは、以下のようにあらわされる。
```L(G,F,DX,DY ) =LGAN(G,DY ,X,Y ) +LGAN(F,DX,Y,X) + λLcyc(G,F), 
G∗,F∗ = arg min max L(G,F,Dx,Dy ).
　　　　　　　G,F Dx,Dy
```ここで重要なことは、Generator(GとF)は異なるGeneratorであり、このモデルでは入力の画像XとCycleで得られた画像X'とのloss `λLcyc(G,F)`を最小化する。

形式的に以下のように記載できる。
X ⇒ G(Dx) ⇒ Y' ⇒ F(Dy) ⇒ X'  min(X'-X)

【参考】cycleGANの説明は以下が詳しい
[GANで犬を猫にできるか~cycleGAN編(1)~](https://qiita.com/itok_msi/items/b6b615bc28b1a720afd7)
cycleGAN元論文
[Unpaired Image-to-Image Translation using Cycle-Consistent Adversarial Networks](https://arxiv.org/abs/1703.10593)
#pix2pix-cycleGAN-likeモデル
上記の表記で言えば、以下のようなシンプルなモデルである。
      X ⇒ G(Dx) ⇒ Y'
      Y ⇒ G(Dy) ⇒ X'
cycleGANとの最大の違いは、Generator　GとFを同一のGeneratorとし、上記サイクルを何の制限もなく（もちろん当初の制限（X⇒Y'の変換時のロスを最小化するmini(Y'-Y)）繰り返すことにより収束させるものである。この手法は厳密にいえば、異なる変換を連続させるているだけであるが、同じGを使って収束させることにより、一つのGでX⇒YとY⇒Xの変換を実施できるようになる。
#実施したこと
###１．猫・犬顔　⇒　男性顔　⇒　猫・犬顔の実施
ここでは、データ数は何個でもいいが、今回の例はそれぞれのデータ数は、１０個である。
なお、上段：入力　中断：出力　下段：ターゲット元絵
####①猫・犬顔　⇒　男性顔
![current_batch_validation1600.png](https://qiita-image-store.s3.amazonaws.com/0/233744/9d326108-03e5-68c1-caaa-6adf3b01765e.png)
####②男性顔　⇒　猫犬顔
上記となるべく同じ男性画像を選びたいが、個数が少ないため同じ画像は得られない。以下の図を見るとわかるが、適当にフィッティングされているわけではなく、それぞれ男性顔に対して同一の猫・犬顔が対応していることがわかる。
![current_batch_validation1_1300.png](https://qiita-image-store.s3.amazonaws.com/0/233744/fbf460ca-744b-ed67-f98a-b65b5bc88745.png)

###２．難しそうな画像サイクル　猫・犬顔⇒飛行機⇒猫・犬顔の実施
####①猫・犬顔　⇒　飛行機
![current_batch_validation1_2000.png](https://qiita-image-store.s3.amazonaws.com/0/233744/1b6f2a87-aaf9-dade-8900-8dc0e22e69f5.png)
####②飛行機　⇒　猫・犬顔
複雑な変換だと思うが、こちらも取り違えずに相手に巡り合えている。
![current_batch_validation1500.png](https://qiita-image-store.s3.amazonaws.com/0/233744/352f8a16-a225-170b-0854-6ccb4ffced81.png)
###３．やっぱり複雑と言えば、名画　⇒　男性顔　⇒　名画
この回は、データ数２０個ずつでやりました。
時間2.89s／epoch 10000epoch
####①名画　⇒　男性顔
![current_batch_training8000.png](https://qiita-image-store.s3.amazonaws.com/0/233744/9a9bf492-217c-53c4-6551-6b51f8ad06d6.png)
![current_batch_validation4200.png](https://qiita-image-store.s3.amazonaws.com/0/233744/8de573d8-d597-7977-71f9-10dfa1db9fe9.png)

####②男性顔　⇒　名画
一応、対応はしており、サイクリックになっている。
それにしても、名画のほうがよほど緻密な印象を受けるが、その情報をテンソルの記憶が吸収しているように見える。
![current_batch_training1_8000.png](https://qiita-image-store.s3.amazonaws.com/0/233744/d892f63c-a95b-f033-543a-d231108449a2.png)
![current_batch_validation1_7700.png](https://qiita-image-store.s3.amazonaws.com/0/233744/bdc8070a-d2ff-205b-2047-3e1fad6b8d9b.png)
###４．最後に
この２つの画像ペア間の整合性は一体どこから来るのだろうか？
cycleGANもたぶん同様な結果を得ていると思うが、今回１０個ずつと２０個ずつのグループで実施したが、フィッティングに要する時間はそれぞれ以下の通り
１０個グループ　　３００sec／２０００epoch=1.5sec/epoch
２０個グループ　　2.89sec/epoch
ということで、倍のデータに対してほぼ倍の時間を要している。
このことから、フィッティングは相対で実施しており、当初それぞれのフォルダーにごっちゃに入れられているが、何かを見て相対ペアとしてフィッティングしているものと考えられる。
また、今回の結果はpix2pix(encoder-decoder版)での結果を示したがpix2pix(u-net版)でも以下のとおり、同様な収束性を示した。
![current_batch_training1_2000.png](https://qiita-image-store.s3.amazonaws.com/0/233744/858cbae2-3df6-cc82-36fe-d9051f10cb61.png)
![current_batch_validation2000.png](https://qiita-image-store.s3.amazonaws.com/0/233744/f10a072e-f327-54ca-9c51-2b6a81f09c90.png)

#まとめ
１．cycleGANとは異なるモデルとして、さらにシンプルな
    pix2pix_cycleGAN-likeモデルを提案した
２．このモデルを使うと容易に画像間の変換ができる
３．グループペア間の変換を実施したが、特にペアで与えなくても自ら相対ペアを構成してフィッティングしているようだ
#課題
１．相対ペアの構成が何に基づいてなされるのかは、依然不明である。
２．このモデルによって得られるGの表現力はどの領域まで適用できるのだろうか