---
# System prepended metadata

title: 問題與解決方向

---

# 問題與解決方向
## 發現的問題
在6/9時候，冠傑發現一個單純的CNN只要把lr調小，層數多幾層來訓練，其實test acc就可以到百分之七十幾了(這個數據其實和我們的Disentangling GAN數據是差不多的)，一直以來以為單純CNN的效果會不好(可能只有三、四十)，但發現只要調一下就發現可以到達跟Disentangling GAN效果差不多，所以很匪夷所思

## 問題釐清
### dataset
有四種 dataset
.npy名稱中的  345_1_ => train: 3,4,5  test: 1 
![](https://i.imgur.com/AA8putr.png)
### 可能性
有幾種可能性需要一步一步嘗試，究竟為什麼單純的CNN會有現在之問題
1. 幾層CNN (參數數量)
    * C64 C64 C128 F D128 D256 D64 D4
    * C64 C128 F D128 D4
2. lr 
    * Adam(lr=0.001)
    * Adam(lr = 0.0001)
3. 訓練次數, test acc

### 實驗結果
#### 使用data為 train:012 test:5
#### fit(batch_size=64)
* 較多層CNN(做了3次平均下來的結果)
    * lr=0.0001

        * 當train acc在0.9946時， test acc為0.62127
            :::spoiler 圖

            ![](https://i.imgur.com/IIXTRYJ.png) 

            ![](https://i.imgur.com/dUh2BkW.png) 

            ![](https://i.imgur.com/DMQqW8q.png) 

            :::
            * 上面三次測試結果+還做過很多次只是沒有紀錄的經驗，其實測出來的test acc很不穩定，基本上會在0.5x~0.6x附近震盪，甚至最爛有到0.49過
        * 多次嘗試下來，train acc在八十幾的時候， test acc會為最佳，大概在0.7x
         
    * lr = 0.001，較多層CNN
        * 跟lr=0.0001比就只是會影響訓練速度和穩定
* 較簡單CNN
    * lr = 0.0001，較簡單CNN
        * 當 train acc=0.9945時， test acc = 0.6338
            :::spoiler 圖
            ![](https://i.imgur.com/LuhgZpP.png)
            
            ![](https://i.imgur.com/wMtiidC.png)
            
            ![](https://i.imgur.com/Fo2mnYd.png)            
            :::
        * 多次嘗試下來，train acc在八十幾的時候， test acc會為最佳，大概在0.7x

    * lr = 0.001，較簡單CNN
        * 跟lr=0.0001比就只是會影響訓練速度和穩定

### 實驗結論
1. 用較複雜CNN或是較簡單CNN，哪個效果會比較好?
    * 從上面的測試得知，其實結果差不多，只是差在訓練速度上面，較複雜CNN比較快 
2. 關於 lr 選擇上:
    * 就是訓練速度和訓練穩定 有差
3. overfit:
    * pure CNN 會有overfit的問題，train acc只要上到九十幾以後，test acc就會開始往下掉
4. 不穩定:
    * 這裡的不穩定講的是在test acc表現方面，在較多層CNN，當train acc在0.9946時那點有說到

## 希望改善
1. overfit:
希望能夠改善overfit這個問題，雖然說overfit這問題最直接的方式就是增加數據還有減少參數(減少dense)，但是目前數據的方面無法做到，所以或許disentangling GAN能夠幫助我們
2. test acc:

## disentangling GAN
因為我們的數據，動作特徵是主要的特徵，所以很容易分辨出動作，但是我們想要分辨身分，因此運用GAN去做特徵分離，希望能夠把身分特徵抽取出來，而不要動作特徵
* 模型:
    model1: 
    ::: spoiler 圖示
    ![](https://i.imgur.com/KShg59X.jpg)

    :::
    model2: (這個效果沒有model1好，棄用)
    ::: spoiler 圖示
    ![](https://i.imgur.com/UBJlz87.jpg)
    :::
    model3: 
        為model1 + id_discriminator
* 與單純CNN比較方法: 
    固定好 encoder 和 id_classifier，這兩個層數和參數各方面用的和上面單純CNN(較少層CNN)的一樣，藉此來比較


### model1測試結果 (之後再重測)
012_5 disentangling GAN
![](https://i.imgur.com/hTzuhuD.png)
* 最後當訓練到batch 4999時，test acc都會到5x
345_1 disentangling GAN

012_5 pure CNN

### model2 測試結果
012_5
結果與pure CNN 差不多，甚至還差一點點
所以不打算用

### 發現都是3號這個人不見
* 嘗試將3號拿掉只留012號
    * disentangling GAN model2
        ![](https://i.imgur.com/TKPCCrA.png)
    
        ![](https://i.imgur.com/Ngcumca.png)
        
        ![](https://i.imgur.com/qLdWETj.png)

    * disentangling GAN model3
        ![](https://i.imgur.com/WAHNYkq.png)

    * pure CNN
        ![](https://i.imgur.com/VPhF3Ba.png)
   
        ![](https://i.imgur.com/TPntUKD.png)
        
        ![](https://i.imgur.com/Mh9Ejbl.png)
        
        ![](https://i.imgur.com/Qy7JFst.png)
        



        
* 把原本的0號拿掉(所以原本的123變成012)
    * disentangling GAN
        ![](https://i.imgur.com/Bo51rQ0.png)
        
        ![](https://i.imgur.com/Lv2YRQg.png)
        
        ![](https://i.imgur.com/qbgfIgv.png)
    * pure cnn
        ![](https://i.imgur.com/aA0lv7D.png)

        ![](https://i.imgur.com/LXOX767.png)
        
        







* 結論:
    * 3號真的比較難辨識
    * disentangling GAN 是有效的
* 辦法: 就是再加入一個 3號discirminator，專門用來區分是不是3號這個人
    * 但是這種方法很不好，因為這是從結果推論回來的方法，最終還是不能解決不一般化的問題
    * 所以不打算用
## model3 測試結果
* disentangling GAN 012_5
![](https://i.imgur.com/zldgkPm.png)
* 中間大概在batch 1800的時候，classifier的acc就會到1左右，可id_discriminator只有7x%
* 中間的過程(就是id_discriminator還沒訓練到acc1時)，test acc都滿低的會掉到5x、6x

![](https://i.imgur.com/CuID8nE.png)
pure CNN
![](https://i.imgur.com/hBMOZH9.png)

* 猜測:
    * 大概在batch為1800的時候開始，classifier的acc就會到接近1，但是因為加了id_discriminator(這時候acc才大概7x%)，所以encoder還會有方向的繼續學習，就會往能分清楚(同個人不同動作)和(不同人同個動作)

    
## 對於dataset的了解，動作特徵和身分特徵的關聯性
我們將ID的feature分成兩個部分討論:
1. 與action的feature交集
2. 沒有與action的feature交集
下述實驗當中，都是把三號測試者拿掉地狀況

### 實驗描述

如果我們假設第二部分較第一部分大(交集處較小):則將action_discriminator的loss取**負號**後當作feedback傳回去encoder。其結果如下圖:
* ![](https://i.imgur.com/YnnHodR.png)

又如果我們假設第一部分較第二部分大(交集處較大):則將action_discriminator的loss取**正號**後當作feedback傳回去encoder。其結果如下圖:
* ![](https://i.imgur.com/Es6zXYT.png)

### 實驗結論

一開始都沒有太顯著的差別，但是在batch60時，兩個模型開始有差別

## 在Distangling裡面discriminator的feedback影響性

### 讓discriminator回傳亂數
![](https://i.imgur.com/AaQReiO.png)
加上discriminator可以使模型結果更加穩定


## 用 tsne視覺化
* train data: 不同顏色不同同人
![](https://i.imgur.com/rcuMjvO.png)
* data: 不同顏色不同速度
![](https://i.imgur.com/lz290wn.png)

疑惑點: 
發現train data 同個人會被分成2團，原本想說或許是因為動作012相差很大，所以會因動作被分成兩團，但沒想到本不是



## 疑點

![](https://i.imgur.com/cSgjLo5.png)
![](https://i.imgur.com/EYSE8BQ.png)

yellow：0號 red：1號 blue:2號 black:3號
在t-SNE的圖上可以看到黑色自己幾乎是獨立一塊，但是classifer出來的結果卻幾乎都被分到藍色去