運(yùn)用深度學(xué)習(xí)技術(shù)進(jìn)行圖像和視頻分析,并將它們用于自動(dòng)駕駛汽車、無(wú)人機(jī)等多種應(yīng)用場(chǎng)景中已成為研究前沿。近期諸如《A Neural Algorithm of Artistic Style》等論文展示了如何將藝術(shù)家的風(fēng)格轉(zhuǎn)移并應(yīng)用到另一張圖像中,而生成新的圖像。其他如《Generative Adversarial Networks》(GAN)以及「Wasserstein GAN」等論文為開(kāi)發(fā)能學(xué)習(xí)生成類似于我們所提供的數(shù)據(jù)的模型做了鋪墊。因此,它們?cè)诎氡O(jiān)督學(xué)習(xí)領(lǐng)域打開(kāi)了新世界的大門(mén),也為將來(lái)的無(wú)監(jiān)督學(xué)習(xí)奠定了基礎(chǔ)。
盡管這些研究領(lǐng)域處于通用圖像層面,但我們的目標(biāo)是將它們應(yīng)用于醫(yī)學(xué)圖像以輔助醫(yī)療。我們需要從基礎(chǔ)開(kāi)始。本文第一部分將從圖像處理的基礎(chǔ)、醫(yī)學(xué)圖像格式化數(shù)據(jù)的基礎(chǔ)以及一些可視化的醫(yī)療數(shù)據(jù)談起。而后一部分文章將深入探究卷積神經(jīng)網(wǎng)絡(luò),并使用 Keras 來(lái)預(yù)測(cè)肺癌。
基本圖像處理
(利用 python 實(shí)現(xiàn))
圖像處理庫(kù)有很多,但 OpenCV(開(kāi)源計(jì)算機(jī)視覺(jué)庫(kù),open computer vision)憑借其廣泛的支持且可用于 C++、java 和 python 的優(yōu)點(diǎn)而成為主流。而我更偏向于使用 jupyter notebook 導(dǎo)入 OpenCV。
你可以使用 pip install opencv-python,也可以從 opencv.org 網(wǎng)站直接進(jìn)行安裝。
安裝 opencv
現(xiàn)在打開(kāi) Jupyter notebook 并確認(rèn)能夠?qū)?cv2。你還需要 numpy 和 matplotlib 庫(kù)來(lái)在 notebook 內(nèi)查看圖片。
現(xiàn)在來(lái)檢查能否打開(kāi)并通過(guò)鍵入下述代碼在筆記本上查看圖像。
通過(guò) OpenCV 進(jìn)行圖像加載的示例
基本人臉識(shí)別
我們來(lái)做點(diǎn)有意思的事情吧,比如人臉識(shí)別。我們將使用一種最初由 Rainer Lienhart 開(kāi)發(fā)的正面人臉識(shí)別器,它使用了基于開(kāi)源 xml 殘基(stump-based)的 20x20 柔和 adaboost 算法。
關(guān)于 Haar-cascade 檢測(cè)的詳細(xì)范例:http://docs.opencv.org/trunk/d7/d8b/tutorial_py_face_detection.html
使用 OpenCV 進(jìn)行人臉識(shí)別
在文檔區(qū)使用 opencv 進(jìn)行圖像處理的例子不勝枚舉。
我們已經(jīng)了解了圖像處理的基礎(chǔ),下面來(lái)了解醫(yī)學(xué)圖像格式吧。
醫(yī)學(xué)圖像數(shù)據(jù)格式
醫(yī)學(xué)圖像以數(shù)字成像和通信(DICOM)為存儲(chǔ)與交換醫(yī)學(xué)圖像數(shù)據(jù)的標(biāo)準(zhǔn)解決方案。該標(biāo)準(zhǔn)的第一版發(fā)布于 1985 年,之后有少許修改;它使用了文件格式和通信協(xié)議如下。
文件格式:所有患者的醫(yī)療圖像都以 DICOM 文件格式進(jìn)行保存。該格式不僅具有與圖像相關(guān)的數(shù)據(jù)(如用于捕獲圖像的設(shè)備和醫(yī)療處理情境),還具有關(guān)于患者的 PHI (受保護(hù)的健康信息,protected health information),如姓名、性別、年齡等。醫(yī)療影像設(shè)備可以創(chuàng)建 DICOM 文件,而醫(yī)生可以使用 DICOM 查看器以及可顯示 DICOM 圖像的計(jì)算機(jī)應(yīng)用程序來(lái)讀取并診斷從圖像獲得的結(jié)果。
通信協(xié)議:DICOM 通信協(xié)議用于搜索檔案中的成像研究,并將成像研究恢復(fù)到工作站來(lái)顯示。連接到醫(yī)院網(wǎng)絡(luò)的全部醫(yī)學(xué)成像應(yīng)用程序都使用 DICOM 協(xié)議來(lái)交換信息,其中大部分信息是 DICOM 圖像,但還包括患者和手術(shù)信息。此外還有更先進(jìn)的網(wǎng)絡(luò)命令用于控制并跟蹤治療、調(diào)整進(jìn)程、報(bào)告狀態(tài),并在醫(yī)生和成像設(shè)備之間共享工作負(fù)載。
現(xiàn)有篇博文很細(xì)致地描述了 DICOM 標(biāo)準(zhǔn),此處為鏈接:http://dicomiseasy.blogspot.com/
分析 DICOM 圖像
Pydicom 是一個(gè) python 包,它很適合分析 DICOM 圖像。本節(jié)將闡述如何在 Jupyter notebook 上呈現(xiàn) DICOM 圖像。
安裝 Pydicom 使用:pip install pydicom。
安裝 pydicom 包之后,回到 Jupyter notebook 進(jìn)行操作。在 notebook 中導(dǎo)入 dicom 包以及其他包,如下所示:
我們也能使用 pandas、scipy、skimage 以及 mpl_toolkit 等其他的包來(lái)進(jìn)行數(shù)據(jù)處理與分析。
你可以在線獲得很多免費(fèi)的 DICOM 數(shù)據(jù)集,但下述數(shù)據(jù)集在入門(mén)階段定能有所幫助:
Kaggle Competitions and Datasets:它是我的最愛(ài)。請(qǐng)查閱肺癌競(jìng)爭(zhēng)和糖尿病視網(wǎng)膜病變的數(shù)據(jù):https://www.kaggle.com/c/data-science-bowl-2017/data
Dicom Library:面向教育和科學(xué)的 DICOM 庫(kù),其提供免費(fèi)的在線醫(yī)療 DICOM 圖像或視頻文件共享服務(wù)。
Osirix Datasets:提供通過(guò)各種成像模式獲取的大量人類數(shù)據(jù)集。
Visible Human Datasets:在這里可視化人類計(jì)劃的一部分?jǐn)?shù)據(jù)可以免費(fèi)利用,這很奇怪,因?yàn)楂@取這些數(shù)據(jù)既不免費(fèi)也不輕松。
The Zubal Phantom:該網(wǎng)站免費(fèi)提供 CT 和 MRI 這兩種男性的多個(gè)數(shù)據(jù)集。
請(qǐng)下載 dicom 文件并加載到 jupyter notebook 中。
現(xiàn)在將 DICOM 圖像加載到列表中。
第一步:在 Jupyter 中進(jìn)行 DICOM 圖像的基本查看操作
在第一行加載第一個(gè) DICOM 文件來(lái)提取元數(shù)據(jù),這個(gè)文件將賦值為 RefDs,其文件名會(huì)列在 lstFilesDCM 列表的頂端。
然后來(lái)計(jì)算 3D NumPy 數(shù)組的總維度,它等于在笛卡爾坐標(biāo)軸中(每個(gè)切片的像素行數(shù)*每個(gè)切片的像素列數(shù)*切片數(shù))。最后,使用 PixelSpacing 和 SliceThickness 屬性來(lái)計(jì)算三個(gè)軸之間的像素間距。我們將把數(shù)組維度儲(chǔ)存在 ConstPixelDims 中,把空間儲(chǔ)存在 ConstPixelSpacing [1] 中。
第二步:查看 DICOM 格式的細(xì)節(jié)
CT 掃描中的測(cè)量單位是亨氏單位(Hounsfield Unit,HU),它是輻射強(qiáng)度的度量。CT 掃描儀經(jīng)過(guò)高度校準(zhǔn)以精確測(cè)量。
每個(gè)像素都被分配了一個(gè)數(shù)值(CT 號(hào)),它是包含在相應(yīng)體素(corresponding voxel)中的所有衰減值的平均數(shù)。將這個(gè)數(shù)字與水的衰減值進(jìn)行比較,并以任意單位中的亨氏單位(HU)為刻度進(jìn)行顯示。
這個(gè)刻度將水的衰減值(HU)標(biāo)為 0。CT 數(shù)量的范圍是 2000HU,但一些現(xiàn)代掃描儀具有較高的 HU 范圍,最高可達(dá) 4000。每個(gè)數(shù)字表示在光譜的其中一端會(huì)出現(xiàn)+1000(白色)和-1000(黑色)的灰色陰影。
一些掃描儀具有圓柱形掃描范圍,但其輸出圖像卻是矩形。落在這些邊界之外的像素具有-2000 的固定值。
第一步通常是將這些值設(shè)置為 0。接著,通過(guò)與重新縮放的斜率相乘并添加截距來(lái)返回到亨氏單位(斜率和截距均很方便地存儲(chǔ)在掃描的元數(shù)據(jù)中!)。
下部分將會(huì)用到 Kaggle 的肺癌數(shù)據(jù)集,并使用 Keras 卷積神經(jīng)網(wǎng)絡(luò)進(jìn)行建模;它將以上文所提供的的信息為基礎(chǔ)。
在上一部分文章中,我們介紹了一些使用 OpenCV 進(jìn)行圖像處理的基礎(chǔ)知識(shí),以及 DICOM(醫(yī)學(xué)數(shù)字影像和通訊)圖像基礎(chǔ)。下面我們將從卷積神經(jīng)網(wǎng)絡(luò)(Convolutional Neural Nets)的視角來(lái)談一談深度學(xué)習(xí)基礎(chǔ)。在第三部分文章里,我們將以 Kaggle 的肺癌數(shù)據(jù)集為實(shí)例,來(lái)研究一下在一個(gè)肺癌 DICOM 圖像中要尋找的關(guān)鍵信息,并使用 Kera 開(kāi)發(fā)出一個(gè)預(yù)測(cè)肺癌的模型。
卷積神經(jīng)網(wǎng)絡(luò) (CNN) 基礎(chǔ)
為了理解卷積神經(jīng)網(wǎng)絡(luò)的基礎(chǔ),我們首先要搞清楚什么是卷積。
什么是卷積?
那么在泛函分析中,卷積(Convolution)是通過(guò)兩個(gè)函數(shù) f 和 g 生成第三個(gè)函數(shù)的一種數(shù)學(xué)算子,表征函數(shù) f 與 g 經(jīng)過(guò)翻轉(zhuǎn)和平移的重疊部分的面積。所以在簡(jiǎn)單定義下,設(shè) f(x)、g(x) 是 R 上的兩個(gè)可積函數(shù),作積分:
則代表卷積。理解這個(gè)定義的簡(jiǎn)單方式就是把它想象成應(yīng)用到一個(gè)矩陣上的滑動(dòng)窗方程。
有著 3×3 過(guò)濾器的卷積
在上面的圖片中,應(yīng)用到矩陣上的滑動(dòng)窗是綠色,而滑動(dòng)窗矩陣則是紅色。輸出就是卷積特征矩陣。下面的圖片顯示了兩個(gè)矩形脈沖(藍(lán)色和紅色)的卷積運(yùn)算及其結(jié)果。
Jeremy Howard 在他的 MOOC 上用一個(gè)電子表格解釋了卷積,這是理解基礎(chǔ)原理的一種很好的方式。現(xiàn)在有兩個(gè)矩陣,f 和 g。f 和 g 進(jìn)行卷積運(yùn)算的結(jié)果,是第三個(gè)矩陣「Conv layer 1」,它由兩個(gè)矩陣的點(diǎn)積給出。如下所示,這兩個(gè)矩陣的點(diǎn)積是一個(gè)標(biāo)量。
兩個(gè)矩陣的點(diǎn)積
現(xiàn)在讓我們按照 Jeremy 的建議用電子表格來(lái)演示一下,輸入矩陣是函數(shù) f(),滑動(dòng)窗矩陣是過(guò)濾器方程 g()。那么這兩個(gè)矩陣元素的乘積和就是我們要求的點(diǎn)積,如下所示。
讓我們把這個(gè)擴(kuò)展到一個(gè)大寫(xiě)字母「A」的圖片。我們知道圖片是由像素點(diǎn)構(gòu)成的。這樣我們的輸入矩陣就是「A」。我們選擇的滑動(dòng)窗方程是一個(gè)隨機(jī)的矩陣 g。下圖顯示的就是這個(gè)矩陣點(diǎn)積的卷積輸出。
什么是卷積神經(jīng)網(wǎng)絡(luò) (CNN) ?
在我看來(lái),一個(gè)簡(jiǎn)單的卷積神經(jīng)網(wǎng)絡(luò) (CNN) 就是一系列神經(jīng)網(wǎng)絡(luò)層。每一層都對(duì)應(yīng)著一個(gè)特定的函數(shù)。每個(gè)卷積層是三維的(RGB),所以我們用體積作為度量。更進(jìn)一步的,CNN 的每一層都通過(guò)一個(gè)微分方程向另一層傳遞一個(gè)體積量的激活。這個(gè)微分方程被稱為激活函數(shù)或傳遞函數(shù)。
CNN 的實(shí)體有多種:輸入,濾波器(或核函數(shù))、卷積層、激活層、池化層、以及批量歸一化層。這些層在不同排列和不同規(guī)則下的組合形成了不同的深度學(xué)習(xí)算法。
輸入層:通常一個(gè) CNN 的輸入是一個(gè) n 維陣列。對(duì)于一個(gè)圖像來(lái)說(shuō),就是三個(gè)維度的輸入——長(zhǎng)度,寬度和深度(即顏色通道)。
過(guò)濾器或核函數(shù):正如下面這張來(lái)自 RiverTrail 的圖像所示,一個(gè)過(guò)濾器或核函數(shù)會(huì)滑到圖像的每個(gè)位置上并計(jì)算出一個(gè)新的像素點(diǎn),這個(gè)像素點(diǎn)的值是它經(jīng)過(guò)的所有像素點(diǎn)的加權(quán)和。在上面的電子表格例子中,我們的過(guò)濾器就是 g,它經(jīng)過(guò)了 f 的輸入矩陣。
卷積層:輸入矩陣和過(guò)濾器的點(diǎn)積形成的一個(gè)新矩陣,稱為卷積矩陣或卷積層。
下面的網(wǎng)址中有一個(gè)很好的解釋填補(bǔ)、跨步和轉(zhuǎn)置是如何工作的視覺(jué)圖表。
激活層:
激活函數(shù)可根據(jù)是否飽和分為兩種類型。
飽和激活函數(shù)都是雙曲型和雙曲正切型,而非飽和激活函數(shù)都是修正線性單元(ReLU)及其變體函數(shù)。使用非飽和激活函數(shù)有兩方面的優(yōu)勢(shì):
雙曲函數(shù):把一個(gè)實(shí)數(shù)值輸入擠壓到 [0,1] 區(qū)間范圍內(nèi)
σ(x) = 1 / (1 + exp(?x))
雙曲正切函數(shù):把一個(gè)實(shí)數(shù)值輸入擠壓到 (-1,1)區(qū)間內(nèi)
tanh(x) = 2σ(2x) ? 1
ReLU
ReLU 代表單調(diào)線性單元(Rectified Linear Unit)。它是輸入為 x 的最值函數(shù) (x,0),比如一個(gè)卷積圖像的矩陣。ReLU 接著把矩陣 x 中的所有負(fù)值置為零,并保持所有其他值不變。ReLU 是在卷積之后計(jì)算出來(lái)的,因此會(huì)出現(xiàn)一個(gè)非線性的激活函數(shù),如雙曲正切或雙曲函數(shù)。Geoff Hinton 在他的 nature 論文里第一次討論這個(gè)問(wèn)題。
ELUs
指數(shù)線性單元(Exponential linear units)試圖使平均激活接近于零,這樣就能加速學(xué)習(xí)。ELUs 也能通過(guò)正值認(rèn)定避免消失梯度的出現(xiàn)。研究顯示,ELUs 比 ReLUs 有更高的分類準(zhǔn)確性。
來(lái)源:http://image-net.org/challenges/posters/JKU_EN_RGB_Schwarz_poster.pdf[(1×96×6, 3×512×3, 5×768×3, 3×1024×3, 2×4096×FC, 1×1000×FC) 層 × 單元 × 接受域或完全連接(FC)的堆疊構(gòu)成的 15 層 CNN。2×2 的最大池化,每次堆疊后有 2 步幅,第一個(gè) FC 之前有 3 層的空間金字塔池。]
來(lái)源:維基百科
滲漏 ReLU
ReLU 中的負(fù)值部分完全被拋棄,與之相反,滲漏 ReLU 給負(fù)值部分賦了一個(gè)非零斜率。滲漏修正線性激活在聲子模型(Maas et al., 2013)中第一次被引入。數(shù)學(xué)上,我們有
來(lái)源:卷積網(wǎng)絡(luò)中修正激活的經(jīng)驗(yàn)主義演化
其中 ai 是在 (1, 正無(wú)窮) 區(qū)間內(nèi)的固定參數(shù)。
參數(shù)化修正線性單元 (PReLU)
PReLU 可被視為滲漏 ReLU 的一個(gè)變體。在 PReLU 中,負(fù)值部分的斜率是從數(shù)據(jù)中學(xué)習(xí)得來(lái)的,而非預(yù)先定義好的。PReLU 的創(chuàng)作者們聲稱它是 ImageNet 歸類(Russakovsky et al., 2015) 任務(wù)中(機(jī)器)超越人類水平的關(guān)鍵因素。它與滲漏 ReLU 基本相同,唯一的區(qū)別就是 ai 是通過(guò)反向傳播訓(xùn)練學(xué)習(xí)到的。
隨機(jī)滲漏修正線性單元 (RReLU)
隨機(jī)滲漏單調(diào)線性單元 (RReLU) 也是滲漏 ReLU 的一種變體。在 RReLU 中,負(fù)值部分的斜率是在給定訓(xùn)練范圍內(nèi)的隨機(jī)取值的,然后在測(cè)試中固定下來(lái)。RReLU 最顯著的特征是在訓(xùn)練過(guò)程中,aji 是一個(gè)從一致分布 U(l,u) 上取樣得到的隨機(jī)數(shù)。正式數(shù)學(xué)表達(dá)如下:
下面顯示了 ReLU, 滲漏 ReLU, PReLU 和 ReLU 的對(duì)比。
ReLU, 滲漏 ReLU, PReLU 和 ReLU,對(duì)于 PReLU,ai 是學(xué)習(xí)到的;而對(duì)于滲漏 ReLU,ai 是固定的。對(duì)于 RReLU,aji 是一個(gè)在給定區(qū)間內(nèi)取樣的隨機(jī)變量,在測(cè)試中保持不變。
噪聲激活函數(shù)
這些都是拓展后包括了 Gaussian 噪聲(Gaussian noise)的激活函數(shù)。
來(lái)源:維基百科
池化層
池化層的目標(biāo)是逐漸地減少矩陣的尺寸,以減少網(wǎng)絡(luò)中參數(shù)的數(shù)量和計(jì)算,這樣也就能控制過(guò)擬合。池化層在輸入的每個(gè)深度切片上獨(dú)立操作,并使用最大化和平均運(yùn)算來(lái)重置其空間尺寸。最常見(jiàn)的形式,一個(gè)采用了步幅 2,尺寸 2x2 過(guò)濾器的池化層,同時(shí)沿著寬度和高度,以幅度 2 將輸入中的每個(gè)深度切片向下取樣,丟棄了激活值的 75%。在此情況下,每個(gè)最大值運(yùn)算都取了 4 個(gè)數(shù)字(某些深度切片中的小 2x2 區(qū)域)的最大值。深度方向的維度保持不變。更一般的來(lái)說(shuō),池化層就是:
注意:這里我們把 2 x 2 window 滑動(dòng)了兩個(gè)細(xì)胞(也被叫做步幅),并取了每個(gè)區(qū)域的最大值。
批歸一化層:
批歸一化是歸一化每個(gè)中間層的權(quán)重和激活函數(shù)的有效方式。批歸一化有兩個(gè)主要的好處:
1. 對(duì)一個(gè)模型加入批歸一化能使訓(xùn)練速度提升 10 倍或更多
2. 由于歸一化極大降低了偏遠(yuǎn)輸入的小數(shù)字過(guò)度影響訓(xùn)練的能力,它也能降低過(guò)擬合。
全連接層:
全連接層是一個(gè)傳統(tǒng)的多層感知器(Multi Layer Perceptron),它在輸出層使用了一個(gè)Softmax 函數(shù)。「全連接」這個(gè)術(shù)語(yǔ)就說(shuō)明了前一層和后一層的每個(gè)神經(jīng)元都是連接起來(lái)的。Softmax 函數(shù)即對(duì)數(shù)函數(shù)(logistic function)的一般化情況,它把一個(gè)取值區(qū)間為任意實(shí)數(shù)的 K 維向量「擠壓」成一個(gè)取值區(qū)間在(0,1)內(nèi)且和為1的 K 維向量。
Sofxmax 激活一般被用于最終的完全連接層,隨著它的值在 0 和 1 之間不停變化,得到概率。
現(xiàn)在我們對(duì) CNN 中不同的層次都有了一定的概念。運(yùn)用這些知識(shí)我就能開(kāi)發(fā)出肺癌探測(cè)所需的深度學(xué)習(xí)算法。
第三部分
在最后一部分中,我們將透過(guò)卷積神經(jīng)網(wǎng)絡(luò)討論一些深度學(xué)習(xí)的基礎(chǔ)知識(shí)。在本文中,我們將側(cè)重于使用 Keras 和 Theano 的基礎(chǔ)深入學(xué)習(xí)。我們將給出兩個(gè)范例,一個(gè)使用 Keras 進(jìn)行基本預(yù)測(cè)分析,另一個(gè)使用 VGG 的圖像分析簡(jiǎn)單樣例。
我已經(jīng)意識(shí)到這個(gè)話題的廣度和深度,它需要更多的文章來(lái)解讀。在之后的文章中,我們將討論處理中 DICOM 和 NIFTI 在醫(yī)學(xué)成像格式中的不同,進(jìn)一步擴(kuò)大我們的學(xué)習(xí)范圍并對(duì)如何對(duì) 2 維肺分割分析使用深度學(xué)習(xí)進(jìn)行討論。然后轉(zhuǎn)到 3 維肺分割。我們同樣會(huì)討論如何在深度學(xué)習(xí)之前進(jìn)行醫(yī)學(xué)圖像分析以及我們現(xiàn)在可以如何做。我非常開(kāi)心也非常感謝我的新合作伙伴將這一切聚在一起——Flavio Trolese(4Quant 的合作伙伴)、 Kevin Mader(4Quant 的聯(lián)合創(chuàng)始人)以及 Cyriac Joshy(瑞士蘇黎世聯(lián)邦理工的講師)。
在本文中,我們將要討論 Keras 并使用兩個(gè)范例來(lái)展示如何使用 Keras 進(jìn)行簡(jiǎn)單的預(yù)測(cè)分析任務(wù)以及圖像分析。
什么是 Keras?
Keras 網(wǎng)站是這么介紹的——Keras 是 Theano 和 TensorFlow 的深度學(xué)習(xí)庫(kù)。
Keras API 在 Theano 和 TensorFlow 之上運(yùn)行
Keras 是高級(jí)的神經(jīng)網(wǎng)絡(luò) API,由 Python 編寫(xiě)并可以在 TensorFlow 和 Theano 之上運(yùn)行。其開(kāi)發(fā)目的是使快速實(shí)驗(yàn)成為可能。
什么是 Theano 和 TensorFlow?
James Bergstra 博士等人在 Scipy 2010 發(fā)布的 Theano 是一個(gè) CPU 和 GPU 數(shù)學(xué)表達(dá)式編譯器。它是一個(gè) Python 庫(kù),允許你有效地定義、優(yōu)化和評(píng)估涉及多維數(shù)組的數(shù)學(xué)表達(dá)式。Theano 由 Yoshua Bengio 等一些高級(jí)研究員和蒙特利爾學(xué)習(xí)算法研究所(MILA)共同完成。在 Scipy 2010 上一個(gè)非常棒的 Theano 教程。下圖顯示了截至 2010 年,Theano 在 GPU 和 CPU 與其他工具的對(duì)比。該結(jié)果最初在《Theano: A CPU and GPU Math Compiler in Python》一文中發(fā)表。
還有一些在 Theano 之上的建立其它的庫(kù),包括 Pylearn2 和 GroundHog(同樣由 MILA 開(kāi)發(fā))、Lasagne、Blocks 和 Fuel.
TensorFlow 由 Google Brain 團(tuán)隊(duì)的研究員與工程師開(kāi)發(fā)。其被開(kāi)發(fā)用于進(jìn)行機(jī)器學(xué)習(xí)和深度神經(jīng)網(wǎng)絡(luò)研究,但是該系統(tǒng)也足以適用于其它領(lǐng)域。如其網(wǎng)站介紹的那樣,TensorFlow 是一個(gè)使用數(shù)據(jù)流圖的數(shù)值計(jì)算開(kāi)源軟件庫(kù)。圖中的節(jié)點(diǎn)表示數(shù)學(xué)運(yùn)算,圖的邊表示在其之間傳遞的多維數(shù)據(jù)數(shù)組(張量)。代碼的可視化如下圖所示。
TensorFlow:在異構(gòu)分布式系統(tǒng)上的大規(guī)模機(jī)器學(xué)習(xí)
使用 Keras 的預(yù)測(cè)分析示例
在這個(gè)示例中,我們將使用 UCI 網(wǎng)站的 Sonar 數(shù)據(jù)集構(gòu)建一個(gè)簡(jiǎn)單的預(yù)測(cè)模型。在下面的代碼中,我們將會(huì)直接從 UCI 網(wǎng)站中得到數(shù)據(jù)并以 60:40 的比例將其分為訓(xùn)練集與測(cè)試集。我們?cè)陬A(yù)測(cè)模型中使用 Keras 并在標(biāo)簽編碼中使用 sklearn。
在下一段代碼中,我們讀取數(shù)據(jù)集,并使用上面定義的函數(shù)查看數(shù)據(jù)。我們打印數(shù)據(jù)集,并找出需要編碼的因變量。
我們使用 scikit-learn 中的 LabelEncoder 進(jìn)行標(biāo)簽編碼,將 R 和 M 隱藏到數(shù)字 0 和 1 中。這樣的操作被稱為 one-hot 編碼。one-hot 編碼可將分類特征轉(zhuǎn)換為對(duì)算法更友好的格式。在這個(gè)示例中,我們使用使用「R」值 和「M」值分類我們的 Y 變量。使用標(biāo)簽編碼器,它們分別被轉(zhuǎn)換為「1」和「0」。
scikit-learn 中的 LabelEncoder
然后使用 Keras 創(chuàng)建模型:
無(wú)預(yù)處理的簡(jiǎn)單模型的精確度為 81.64%
使用 Keras 的圖像分析示例
為了用 Keras 解釋圖像處理,我們將使用來(lái)自 Kaggle 比賽的數(shù)據(jù)——狗和貓(https://www.kaggle.com/c/dogs-vs-cats)。該比賽的目的在于開(kāi)發(fā)一種算法以區(qū)分圖像是否包含狗或貓。這個(gè)任務(wù)對(duì)人、狗和貓來(lái)說(shuō)很簡(jiǎn)單,但是計(jì)算機(jī)卻很難做到。在該項(xiàng)挑戰(zhàn)中,有 25,000 張標(biāo)記狗和貓的照片可用于訓(xùn)練,并且在測(cè)試集中有 12,500 張照片,我們必須在挑戰(zhàn)中嘗試為其加上標(biāo)簽。根據(jù) Kaggle 網(wǎng)站,當(dāng)該項(xiàng)比賽開(kāi)始時(shí)(2013 年底):
當(dāng)前最佳:目前的文獻(xiàn)顯示,機(jī)器分類器在該任務(wù)上可以達(dá)到 80% 以上的準(zhǔn)確度。那么如果我們能夠超過(guò) 80%,我們將在 2013 年處于最前沿。」
我強(qiáng)烈推薦觀看 Fast.ai 的 MOOC 以了解更多的細(xì)節(jié),學(xué)習(xí)下一步和深度學(xué)習(xí)的前沿研究。我已經(jīng)在下列代碼中引用 fast.ai,這是一個(gè)很好的起點(diǎn),鏈接:http://www.fast.ai/
步驟 1:設(shè)置
從 Kaggle 網(wǎng)站下載狗和貓的數(shù)據(jù),并存入你的筆記本電腦。本文中的示例均在 Mac 上運(yùn)行。
基礎(chǔ)設(shè)置
Jeremy Howard 在他的班上提供了一個(gè)實(shí)用的 Python 文件,該文件有助于封裝基本函數(shù)。對(duì)于開(kāi)始部分,我們將使用此實(shí)用文件。點(diǎn)擊下載:https://github.com/fastai/courses/blob/master/deeplearning1/nbs/utils.py。當(dāng)我們深入到更多細(xì)節(jié)時(shí),我們將解壓該文件并查看其背后的內(nèi)容。
步驟 2:使用 VGG
我們的第一步簡(jiǎn)單地使用已經(jīng)為我們創(chuàng)建好的模型,它可以識(shí)別許多類別的圖片(1,000 種)。我們將使用『VGG』,它贏得了 2014 年 ImageNet 比賽,是一個(gè)非常簡(jiǎn)單的創(chuàng)造理解的模型。VGG ImageNet 團(tuán)隊(duì)創(chuàng)造了更大、更慢、準(zhǔn)確性略有提高的模型(VGG 19)和更小、更快的模型(VGG 16)。我們將使用 VGG 16,因?yàn)?VGG 19 過(guò)慢的性能與其在準(zhǔn)確度上的微小提升不對(duì)等。
我們創(chuàng)建了一個(gè) Python 類,Vgg16,這使得使用 VGG 16 模型非常簡(jiǎn)單。Vgg 16 同樣可從 fast.ai 的 GitHub 中獲得:https://github.com/fastai/courses/blob/master/deeplearning1/nbs/vgg16.py
步驟 3:實(shí)例化 VGG
Vgg16 構(gòu)建在 Keras 之上(我們將在短時(shí)間內(nèi)學(xué)到更多內(nèi)容),Keras 是一個(gè)靈活易用的深度學(xué)習(xí)庫(kù),該軟件庫(kù)是基于 Theano 或 Tensorflow 的一個(gè)深度學(xué)習(xí)框架。Keras 使用固定的目錄結(jié)構(gòu)在批量讀取圖像和標(biāo)簽組,每個(gè)類別的圖像必須放在單獨(dú)的文件夾中。
我們從訓(xùn)練文件夾中獲取批量數(shù)據(jù):
步驟 4:預(yù)測(cè)狗 vs 貓
步驟 5:總結(jié)并編碼文件
總結(jié)一下這篇文章,我推薦的狗和貓分類方法為:
總結(jié)
如果讀者跟著我們走到了這一步,那么其實(shí)已經(jīng)實(shí)現(xiàn)了上一部分文章中討論過(guò)的理論,并做了一些實(shí)際的編程工作。如果讀者們按照上述說(shuō)明實(shí)現(xiàn)了這兩個(gè)案例,那么就已經(jīng)完成了使用 Keras 的第一個(gè)預(yù)測(cè)模型,也初步實(shí)現(xiàn)了圖像分析。由于代碼的長(zhǎng)度,我們不在這里討論細(xì)節(jié)只給出了鏈接。如果你查看鏈接有任何疑問(wèn),請(qǐng)聯(lián)系 fast.ai。
至此,我們從最開(kāi)始的數(shù)據(jù)庫(kù)安裝到醫(yī)學(xué)圖像數(shù)據(jù)格式的解釋,已經(jīng)有了醫(yī)學(xué)影像處理的基本知識(shí)。隨后我們從卷積的定義到 CNN 的詳細(xì)構(gòu)架與原理,進(jìn)一步實(shí)踐的理論基礎(chǔ)已經(jīng)完成了累積。最后一部分對(duì)前面的理論知識(shí)進(jìn)行實(shí)踐,用 Python 實(shí)現(xiàn)了這一令人激動(dòng)的模型。因此,我們希望讀者朋友能在這一循序漸進(jìn)的過(guò)程中真正感受到醫(yī)學(xué)影像處理的樂(lè)趣。
-
醫(yī)療器械
+關(guān)注
關(guān)注
19文章
828瀏覽量
51497 -
人工智能
+關(guān)注
關(guān)注
1792文章
47442瀏覽量
239011 -
機(jī)器學(xué)習(xí)
+關(guān)注
關(guān)注
66文章
8425瀏覽量
132775 -
深度學(xué)習(xí)
+關(guān)注
關(guān)注
73文章
5507瀏覽量
121298 -
深度圖像
+關(guān)注
關(guān)注
0文章
19瀏覽量
3514
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論