如何利用 PyTorch 深度學習對抗癌症?《核心開發者親授!PyTorch深度學習攻略》

近年來備受矚目的PyTorch,是當前兩大深度學習函式庫之一,在ICLR 2020和CVPR 2020中,被學者引用的次數已經超過另外一個主流的深度學習函式庫Tensorflow。因而,市面上不乏相關教學書籍。

不同於書籍中過於順利的模型演練例子,真實世界的案例往往存在著各種碰壁情形,一般的操作書不可能涵蓋所有除錯技巧,當已知的解決方法行不通時,如何讓自已的武器庫擁有各種不同的解決方案,避免當模型表現不佳時不知所措?最好的方法就是,去研究一個重要且包含許多細節的應用實例。

《核心開發者親授!PyTorch 深度學習攻略》一書由淺至深,從如何載入各種資料型態,這是基本卻又十分重要的觀念,更以實用的觀點為主軸延伸至環境的佈署,不僅適合新手,也適合具有深度學習概念者學習。更利用智慧醫療的實際案例連接理論與現實世界,帶領讀者手把手完成專案:以病人的電腦斷層掃描(CT scan)影像為輸入,訓練出可自動偵測肺部腫瘤的模型。目標簡述如下:將人體的 CT 掃描圖當成輸入(備註:基本上,CT 掃描即 3D 的 X 光,其資料型別為 3D 的單色(單通道)影像陣列,意即由多張單色影像組成的立體掃描影像),讓模型尋找是否存在類似於腫瘤的組織,並在輸出結果中將其標示出來。以下是本書重點案例的精采節錄:


如何以病人的電腦斷層掃描(CT scan)影像為輸入,訓練出可自動偵測肺部腫瘤的模型

提早發現肺部腫瘤將有助於提高病患的存活率,但這並不是一件容易的事,尤其考慮到我們可能會碰上各式各樣的情況。目前,只有受過專業訓練的專家才有能力解讀 CT 掃描的結果。此任務依賴對細節的高度關注,且沒有腫瘤的例子佔了所有樣本中的絕大多數,因此偵測腫瘤的任務 就好比大海撈針。

雖然將肺癌診斷自動化是困難重重的,且有許多問題需要從零開始解決,但只要各位跟隨本書的腳步,那麼我們最終將克服所有困難!我們相信,在閱讀完第 2 篇以後,讀者將具備處理其他實際問題的能力。

之所以選擇肺部腫瘤偵測做為主題,是出於以下幾點原因。首先也是最關鍵的一點:該問題目前仍然無解!這有助於讓各位意識到:你可以利用 PyTorch 征服最尖端的課題。我們希望這個專案能讓大家對 PyTorch 建立信心,同時提升自己身為開發者的自信。研究該主題的另一項原因是: 雖然尚未有解決方案,但已有許多團隊正試圖克服此問題,且已取得了重大進展。換言之,該問題處在被攻克的邊緣,並非世紀難題。由於研究人員對於自動腫瘤偵測的高度關注,與之相關的高品質論文數量繁多,而這將成為我們的重要靈感來源。

雖說這裡的討論是以偵測肺部腫瘤為核心,但其中所用到的技巧卻是通用的。無論你手上的專案為何,關於搜集、預處理與呈現資料的知識都是不可或缺的。即便在本書中,關於預處理的描述局限於特定主題,但你更應該注意其背後的中心思想:該步驟是專案成功與否的關鍵。此外,從第 9 章到第 14 章,各位還會看到如何建立訓練迴圈、選取正確的表現評量指標、以及結合多個模型以獲得最終結果,這些都是能運用在其它問題上的通用技巧。

專案概述:肺部腫瘤偵測器

既然大家已經對 CT 掃描有所認識,現在就來討論專案的大致架構吧!從分析整個胸腔的 CT 掃描影像,到給出最後的肺部腫瘤診斷,模型一共需經歷 5 個步驟。模型首先會匯入 CT 資料 (第 1 步)並產生一個 CT 物件。該物件中不但有完整的 3D 掃描結果,還包含一個負責影像分割(segmentation,第 2 步)的模組,能將有異樣的體 素群進行分組(grouping,第 3 步),成為候選結節(nodules,9.4.2 節有 更詳細的說明)。

接下來,將候選結節的位置傳給分類模型(classification model,第 4 步),進而讓分類模型判斷它們是否是真正的結節。最終,分類模型判斷為結節的樣本會進一步餵給另一個分類模型,以用來判斷某個結節是否是惡 性腫瘤(第 5 步)。在上述任務中,惡性腫瘤的判斷尤其困難,因為這往往不是觀察 CT 影像就能看出來的。

將候選體素群分組(grouping)以形成小區塊,即『候選結節』,它們在 熱圖上以熱點的方式呈現。每個結節所在的位置由其中心點的索引值(I)、索引(R)與行索引(C)表示。這麼做可以簡化問題,讓分類器更好地進行處理。體素的分組和 PyTorch 沒有直接關係,這就是將此任務列成單獨步驟的原因。事實上,在涉及多階段處理的解決方法中,使用 與深度學習無關的步驟來連接深度學習模組是很常見的事情。

使用 3D 卷積模型將候選結節進行分類。3D 卷積和第 8 章說明的 2D 卷 積在概念上很類似。由於和用來判斷結節的關鍵特徵是區域性的,因此 卷積可以讓我們在偵測位置及大小不固定的物件時,不至於丟失關鍵訊息。這種做法有助於簡化任務,並減少我們在除錯時需要檢驗的項目。

將各候選結節的分類結果整合起來,並針對模型預測為結節的樣本做出最終診斷。和上一步中的結節分類器類似,此處的模型全憑影像資料來決定某個結節是良性結節還是惡性結節(腫瘤)。由於只要存在一個腫瘤 便算是癌症患者,所以在預測出每個結節為惡性的機率後,我們只要找 出其中的最大值即可。其它專案可能會使用不同的方法來總結個別的預 測結果,但由於這裡的問題為:『是否存在任何異樣?』,故取最大值的 做法非常合適。倘若我們想知道的資訊和數量有關,例如:『組織 A 和 組織 B 之間的比例為多少』,那就必須使用更適當的平均計算方法才行。

如想知道更多關於該癌症專案的實作技巧,歡迎參考《核心開發者親授!PyTorch深度學習攻略》一書。本書為PyTorch官方唯一推薦教材,可讓讀者認識更多的 PyTorch 實務技巧。

備註:結節(Nodules) 在肺部組織中增生的細胞會形成結節,結節可以是良性(benign)或惡性 (malignant)的,而惡性結節通常又稱為腫瘤,會造成癌症(cancer)。大約 有 40% 的肺部結節為惡性的,及早將它們診斷出來是很重要的,而這有賴於 類似此處所提的 CT 技術。

本文節錄自《核心開發者親授!PyTorch深度學習攻略》,由旗標科技授權轉載。