第一篇就獻給 PyTorch Tutorials 了!Let’s get started!
熊秘書,為什麼選擇 PyTorch 呢?
2017年初,Facebook 在 Torch的基礎上,針對 Python 語言所開發的深度學習框架 — PyTorch,使用上就像 numpy、scipy 和 scikit-learn 一樣直覺,具備以下特點,因此深受研究人員和開發者的喜愛。
- 自動求導,加速開發過程
- 動態計算圖結構,迭代上支援不同維度的輸入
- 易編寫新的 Layer 在 GPU 上運行
- 提供大量模組容易組合
和 Tensorflow 相較而來,熊秘書認為 PyTorch 有更多模型設計上的靈活性,使用上更容易 Debug,而且 Facebook 開源專案幾乎都是以 PyTorch 進行開發,因此可以銜接上最前沿的技術。雖然不如 MXNet 的輕量化,還有分佈式訓練、Edge 部署的特點,對於開發人員最重要的就是實驗一個新的 idea 到底 work 不 work 啊!
📚小故事時間
熊秘書其實是從 Caffe 框架跳槽到 PyTorch 的。Caffe 的計算圖結構與 Tensorflow 相同,是靜態的,必須先定義好完整的一套模型,無法因應資料的維度進行模型的調整,因此對於音訊、文本等不定長度的資料,就必須填充補滿;另外,很多時候需要編寫自定義的 Loss 以及 Layer 函式,就需要用 C++ / CUDA 編寫新的 Layer 了。然而 Caffe 提供大量的預訓練模型[1],在圖像處理支援豐富,使用上像是以 command line 式的方法,進行資料的包裝以及訓練,因此較為適合不常更動網路架構的新手開發者使用哦!
組成 PyTorch 函式庫的小螺絲們
PyTorch 框架設計了 torch 和 torchvision 函式庫,依據資料的流動,可以用資料(Data)、模型(Model)、最佳化方法(Optimization)來概括一個深度學習模型的建立,而各個子函式庫各有職掌,詳細說明如下:
torch
於 PyTorch 框架中,資料類型定義為張量(Tensor),張量可以是純量、向量或是更高維度的矩陣,而 torch 函式庫負責張量在 CPU/GPU 的運算。處理張量的函式多與 numpy 套件相同,因此從事數值分析的同學們,在使用上會有些熟悉感。
- torch.autograd:負責所有可微張量的自動求導。
- torch.nn:建立深度神經網路的層(Layer)與模組(Module)。
- torch.optim:定義模型的學習方針,包含最佳化方法 SGD、Adam、RMSProp 等。
- torch.utils:包裝資料的方法及其他方便延伸操作的小工具。
- torch.onnx:開放神經網路交換格式(ONNX)[2]實現主流框架間的模型遷移,此函式庫轉換 PyTorch 模型為通用之形式。
torchvision
包含資料前處理與模型定義。
- torchvision.datasets:提供打包好的常用數據資料集(例如 MNIST、MS COCO、CIFAR 和 SVHN 等)。
- torchvision.transforms:定義資料增量(Data Augmentation)與正則化(Normalization)方法。
- torchvision.models:提供辨識模型的架構定義,以及使用 ImageNet 資料集[3]預訓練的權重檔,例如 Alexnet、VGG、ResNet、SqueezeNet、DenseNet 和 Inception v3,如此一來,能夠方便同學們實現遷移式學習(Transfer Learning),或是複製、修改某些特定的層。
📚什麼是遷移學習(Transfer Learning)?
一個深度神經網路通常具有百萬個參數,而這些參數需要藉由資料的輸入,在每一次的訓練迭代中,進行最佳化方法來更新模型的參數,而參數量越大,所需的資料量也越大。因此,對於資料有限的同學們,我們可以利用預訓練後的模型(影像領域通常是使用 ImageNet 大型資料集進行預訓練),複製大部分可以再利用的層的參數,作為模型的初始參數,需要被訓練的參數就減少了!雖然是針對完全不同的任務進行訓練,但是共用的層,通常是擷取影像特徵的卷積層,於 ImageNet 五花八門的大型資料集當中擷取特徵,是要比特定領域的擷取要難上許多呀!如此一來,在特定問題下,被降低規模的模型只需要再學習分辨特徵的分類器,即可以在資料量少的情況下,應用在特定領域上。
感謝您的閱讀,如果文章有益請在底下長按拍手
有任何問題歡迎在底下留言或是來信交流wanju.ts@gmail.com