ML_LEE_2022_hw3

作業題目

可進行的目標

Data augmentation (training)

Adv. Data augmentation - mixed up (training)

  • mixup (把兩個影像混再一起,變成多重label)

  • cross entropy loss function需要重寫

Module selection (搜尋torchvision.models)

  • AlexNet

  • VGG系列

  • ResNet

  • SqueezeNet

Cross validation

  • 每次訓練更換dataset

  • ensemble

upload successful


以下是我對這作業除了Base sample code以外所做的變化,針對上述目標,有做的我才會列出來

First Approach

Note: 因為這次作業放在kaggle上寫&跑,而kaggle設計在結束比賽之前不能公開notebook,所以不能內嵌frame= =,下面只能先直接貼上code代替

Data argumentation

  • 改動trains transform,新增兩個處理,一個是讓照片有0.6的可能水平翻轉,另一個則是把它做normalization
    • 針對個別batch算出mean,std做normalization的方法我沒找到,目前直接套網路上常用的3 channel RGB圖之平均值當參數 (mean = [0.5,0.5,0.5] std = [0.1, 0.1, 0.1])
         - 這樣做觸犯1個問題,我的normalization是單一標準對所有data做,還是對每個batch單獨這樣做?在這個case沒差,不過這是因為數字寫死,normalization做的實在有夠醜= =
         - 觸犯另一個問題是,我的layer之間有沒有再進行一次normalization呢?有待釐清
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      mean = [0.5, 0.5, 0.5]
      std = [0.1, 0.1, 0.1]


      train_tfm = transforms.Compose([
      # Resize the image into a fixed shape (height = width = 128)
      transforms.Resize((128, 128)),
      # You may add some transforms here.
      transforms.RandomHorizontalFlip(p=0.6),
      # ToTensor() should be the last one of the transforms.
      transforms.ToTensor(),
      transforms.Normalize(mean,std),
      ])

Module selection

  • 這裡我直接選用VGG11取代原本的自訂模型Classifier

Result

  • 跑了至少100 epoch,結果training acc達到0.97,validate acc卻只有0.1x而且不再有更好結果,明顯的overfitting = =
  • 可能要考慮加入cross validation
  • 可能是data augmentation太弱?
  • 可能是VGG11模型太強(彈性過高)
  • 我耍笨不小心把訓練的過程輸出洗掉了,沒有圖片QQ

Second Approach

Module Selection

  • 單純的把VGG11模型改回Classification

Result

  • 看起來好像沒什麼變化,看來不是VGG模型導致overfitting
  • 可能是normalization的部分出問題了,接下來嘗試把normalization改掉,用VGG train看看
    • 如果這樣成功的話,只能說應該是normalization把數字改成詭異的形狀了,算是一種人為mismatch吧

Third Approach

Transform

  • 移除normalization

Result

  • acc爆增回正常範圍了,看來真的是normalization的鍋qwq

  • 上面這是最高紀錄,valid acc 有70%,位於epoch 32,我後來一直跑到epoch 52都沒看到更好的分數,就先卡掉了(看起來進medium概率近乎於零= =)

  • 不過雖然70%比起之前的acc是大躍進,距離medium仍有一段距離,training acc也到達瓶頸,看起來是需要提高data augmentation的時候了

Forth Approach

  • 偷偷參考了一下學長的筆記,發現新招數「AutoAugmentation」,適用在Transform內
  • 這招的原理來自於這篇論文,可以從data裡面學到如何排Transform Augment
  • 同時也從學長的筆記學到,因為code裡面有用BatchNorm2d (batch Normalization),所以batchSize大一點會比較有利
    • 這好像就是元兇嗎orz,多做一次norm
         - 不過我只有在助教寫的Classification有看到norm,因為用的是VGG11,所以不確定是否仍然有用norm(沒看源碼XD)

Transform

  • 新增transforms.AutoAugment()
  • 新增transforms.RandomRotation(degrees = 32) //rotate+-32度

BatchSize

  • 修改為96

Result

  • 這次讓他跑了一整晚,充分認識到kaggel save&run的重要性= =
  • 直接掛網頁按run all如果網頁停止回應或是閒置過久就沒了
  • 這次訓練時間大約10hr,仍然沒有得到最終結果->網頁爆了
  • 練到了291 epoch,感覺valid的acc就上不去了… 只能止步medium嗎

Fifth Approach

  • 最後又重跑了一次training = =,沒有作任何更動,GPU quota還有18 hr 希望夠用…

Result (Finale)


= =凸

  • 最終在epoch 389的時候終止了,最好的epoch在252,其實已經很接近當初的150 patience了
  • 好在best model parameters有保存下來,接下來就是load model之後直接predict了

最終成果


Notebook連結

心得

這次作業是CNN的範例題,這次的圖像辨識題真的讓人思考到了如何去優化他,助教提供的sample code省去了start from scratch的痛苦,讓我們能專注在實作理論的部分

其實很多的技術(Batch normalization、crossEntropy+softmax、data Batch等等)都已經被函數包進去一次做好了,正常的時候是不會發現到他們的存在,這或許也間接印證了他們是十分有效提高命中率的方法吧。而真的需要實作的part其實不多,比較難的是要去翻出他們的document一一認識他們的結構並理解功能,這才是最難的部分

助教的sample code寫得蠻精美的,甚至有看出在自訂結構其實有保留空間讓學生自行切分training set跟valid set(可能是用於做cross validation用的),考量到讓學生改進而保留空間,真的厲害!除了實作理論與閱讀結構以外,最重要的估計就是看懂這個訓練過程的資料結構了吧~