本文把文章標題取名成PyTorch深度學習工具箱的用意是在於:

日常在進行PyTorch模型訓練的時候,如果想知道模型的好壞,我們會用不少方式去評估。例如:train/val loss、train/val accuracy、Confusion Matrix、per class accuracy、F1 Score、t-SNE視覺化、GradCAM、觀看模型分類時,判斷錯誤的圖片,及其原始圖片路徑。

然而,目前大多數research公開的程式碼當中,幾乎找不太到有一個將前述評估方法整合在一起的程式。也因此,如果我們想要得到這些資訊,就必須到Google搜尋,找別人是怎麼完成這些功能的,往往花上不少時間。

在本文當中,我將彙整過去寫過關於這些主題的文章及程式碼,製作成一個目錄,供讀者及自己查詢使用:

1.使用TensorBoard視覺化train/val loss、train/val accuracy

2. Confusion Matrix和per class accuracy

3. F1 Score(imblanced dataset可用macro和weighted)

4. t-SNE視覺化

5. GradCAM

6. 觀看模型預測時,判斷錯誤的圖片
這個功能將預測錯誤的圖片保存到TensorBoard的log當中,再從中使用Tensorflow==1.13.1版本還原出來到資料夾中,有兩篇文章需要參考。


7.檢查模型的參數量及模型檔案大小

8.列出分類錯誤之原始圖片路徑?

9.讓訓練結果具有再現性(Reproducibility)

10.將模型的多個Label輸出改成只有2種輸出

11.快速使用一些基於PyTorch所開發的套件

12.降低訓練模型所需的時間

13.計算資料集的mean和std,用來作為Normalize的參數

14.計算Overkill和Leakage


一般在進行CNN模型訓練的時候,通常都會對dataset的圖片進行normalize,而經常會看到一組數字:

mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]

這組數字是針對ImageNet所設計的,一般來說照常使用此組數字即可


Just note that you need to use your own mean and std if your dataset is not similar to ImageNet. In the 3-channel case you have mentioned, you are using mean and std from ImageNet which works for most of the datasets that are similar but if you are using datasets such as medical image processing, then you need to obtain proper mean and std regarding your own dataset.
如果我們自己的資料集與ImageNet差異很大,或許就可以考慮針對自己的Dataset來計算mean和std,作為normalize的參數。

另一個討論串當中,有人比較

(a)ImageNet的mean和std
(b)自己資料集中的mean和std

最終準確度的差別,發現使用自己dataset中所計算的mean和std來作為Normalize參數,準確度比較高,細節可

具體上該怎麼計算mean和std呢?可以參考

以下是我根據自己的dataset重新整合的程式碼:

計算後得到的mean和std

mean: [0.385, 0.406, 0.410]
std: [0.222, 0.224, 0.220]

參考資料


在Striving for Simplicity: The All Convolutional Net這一篇論文當中,作者透過將神經網路中的池化層摘除,並改用stride=2卷積層的方法,來達到同樣降低圖片長寬尺寸的目的。並發現在這樣的設定下,模型在CIFAR-10和CIFAR-100上的分類錯誤率有明顯的下降。但該方法的缺點是會造成模型的計算量和參數量提升。

本文嘗試將該方法應用在ResNet架構上。詳細PyTorch程式碼如下所示:

第241行和第248行將pooling layer改用stride=2的卷積層(定義在180、181行)


在2021年3月份的時候,曾寫過,介紹了使用pdb進行除錯的方法。

今天早上看到pudb這個工具,有著更完整的debug功能,可直接在Terminal中開啟使用,且能直接顯示出所有程式碼一行一行中的變數,也能直接新增breakpoint(鍵盤b鍵)

安裝

pip install pudb

import

只要在程式碼的第一行import以下內容,下次使用python fileName.py的時候就能開啟Debug模式

import pudb; pu.db

GUI畫面中的Variables、Stack、Breakpoints差異

Variables會顯示程式碼中的變數實際數值

Stack會分成兩部分,預設都會有module,module為實際程式碼運作到第幾行;而當程式進入function之後會顯示function的名稱。使用鍵盤的上下左右鍵可將畫面中的highlight進行切換

Breakpoints則是斷點的部份,可使用b進行設定

範例

# 1.將以下程式碼保存成test.pyimport pudb; pu.dbdef sum(n):
result = 0
for i in range(n):
result = result + i
return result
if __name__ == "__main__":
y1 = sum(10)
y2 = sum(100)
y3 = sum(100)
# 2.執行python test.py指令# 3.此時會進入到GUI的Debug介面# 4.使用n進入程式碼的下一行、當進入到y1 = sum(10)這一行時,可使用s進入函數當中。使用n可在函數當中進入下一行,此時右側Variables的框框中會出現result, i, n的數值。

快捷鍵

Ctrl+p: 打開屬性設置
n: next,也就是執行一步 (一定要用)
s: step into,進入函數內部 (常用,可直接進到function當中,搭配n觀看變數變化)
f: finsh current function,結束當前函數?
c: continue,繼續執行
b: break point,在游標所在行添加或消除斷點 (常用)
t: to cursor,運行到游標位置
: 開啟python命令行 (在當下行輸入python程式)
: 開啟幫助視窗 (常用,查詢快捷鍵)
o: output screen,打開輸出視窗/控制台 (觀看程式的output)
m: module,打開模組
q: quit,退出PUDB (離開pudb)
/: 搜尋
,/. 搜索下一個/上一個

參考資料


Reddit原文

介紹

今天早上在微信公眾號看到這篇文章,介紹了模型訓練提升速度的方法,提升的幅度相當驚人,可作為參考。

以下整理出文章提出的6個方法(其中1個方法只是再度提升batch size;另一個則是再度降低神經網路的大小,因此8個合併成6個):

一、Early Stopping

二、 Reduce network size

三、
這一點比較特別,作者直接把dataset保存成一個*.pt結尾的PyTorch檔案,藉此大幅度提升訓練速度。我覺得可作為降低大資料集訓練時間所嘗試的一個方法

四、Increase batch size

五、
這個方法也相當特別,起初先用接近0的learning rate進行訓練,逐漸加大learning rate,當訓練到中間epoch的時候(例如有90個epoch,45個epoch為中間值),此時的學習率為最大值,接著繼續遞減直到訓練結束。

六、Fine Tuning
持續調整參數,得到最終結果,詳細可參考


本文紀錄一些基於PyTorch的深度學習Library

pprp/SimpleCVReproduction

Reproduce simple cv project including attention module, classification, object detection, segmentation, keypoint detection, tracking etc.

pprp/awesome-attention-mechanism-in-cv

PyTorch Implementation of Attention Module and Plug&Play Module

facebookresearch/detectron2

支援Mask RCNN、Faster RCNN

jacobgil/pytorch-grad-cam

可以用來進行grad-cam視覺化的library,可參考這篇文章:

xmu-xiaoma666/External-Attention-pytorch

這個library將深度學習中的各種Attention機制包成一個套件,使用上相當方便。例如

from attention.SEAttention import SEAttention
import torch

input=torch.randn(50,512,7,7)
se = SEAttention(channel=512,reduction=8)
output=se(input)
print(output.shape)

thuml/Transfer-Learning-Library

這個framework將不同Domain Adaptation Task的演算法整合在一起,詳細可到裡面了解細節

facebookresearch/DomainBed

這個framework整合了很多個不同的Domain Generalization演算法,只要給定資料集的路徑、選擇的演算法,即可進行模型的訓練

python3 -m domainbed.scripts.train\
--data_dir=./domainbed/data/MNIST/\
--algorithm IGA\
--dataset ColoredMNIST\
--test_env 2

Domain adaptation is further classified as homogenous and heterogeneous DA [102]. The source and target domains have similar or same dimensionality feature spaces in homogenous DA and different feature spaces in heterogeneous DA. Domain generalization can also be classified as homogenous and heterogeneous DG [103]. In homogenous DG, label data is …


以下內容來自,本文僅作筆記摘錄:

除了此方式之外,這個問題裡面的很多回答都相當的好,值得學習。

Random sample from DataLoader

Assuming DataLoader(shuffle=True) was used in its construction, a single random example can be drawn from the DataLoader with:

example = next(iter(dataloader))[0]

Random sample from Dataset

If that is not the case, you can draw a single random example from the Dataset with:

idx = torch.randint(len(dataset), (1,))
example = dataset[idx]

Yanwei Liu

Machine Learning | Deep Learning |

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store