1
雷鋒網(wǎng)按:本文由圖普科技編譯自《Medical Image Analysis with Deep Learning Part3》,是最近發(fā)表的《深度學(xué)習(xí)下的醫(yī)學(xué)圖像分析(二)》的后續(xù)文章。雷鋒網(wǎng)獨家首發(fā)。
本文將從卷積神經(jīng)網(wǎng)絡(luò)的角度討論深度學(xué)習(xí)。在本文中,我們將使用Keras和Theano,重點關(guān)注深度學(xué)習(xí)的基本原理。本文將展示兩個例子——其中一個例子使用Keras進行基本的預(yù)測分析,另外一個使用VGG進行圖像分析。
我們談?wù)摰脑掝}其實是相當(dāng)廣泛和深入的,需要更多的文章進行探討。在接下來的一些文章中,我們將會討論醫(yī)學(xué)影像中DICOM和NIFTI格式之間的不同,并且研究如何使用深度學(xué)習(xí)進行2D肺分割分析。除此之外,我們還將討論在沒有深度學(xué)習(xí)時,醫(yī)學(xué)圖像分析是如何進行的;以及我們現(xiàn)在如何使用深度學(xué)習(xí)進行醫(yī)學(xué)圖像分析。在這里,我非常歡迎和感謝我的新伙伴Flavio Trolese——4Quant的聯(lián)合創(chuàng)始人和ETH Zurich的講師——他將協(xié)助我整合所有討論的內(nèi)容。
在本文中,我們將討論Keras并且展示兩個示例——其中一個使用Keras完成簡單的預(yù)測性分析任務(wù),另一個進行圖像分析。
根據(jù)Keras官網(wǎng)的介紹,Keras是Theanos和Tensor Flow的一個深度學(xué)習(xí)庫。
運行于Theano和TensorFlow之上的Keras api
Keras是一個高級Python神經(jīng)網(wǎng)絡(luò)API,它能夠運行于TensorFlow和Theano之上。Keras的開發(fā)重點在于支持快速實驗。
James Bergstra教授等人在2010年的Scipy曾說,Theano是一個CPU和GPU的數(shù)學(xué)表達式編譯器。換句話來說,Theano是一個能夠讓你高效地對數(shù)學(xué)表達式進行定義、優(yōu)化和評估的Python學(xué)習(xí)庫。Theano是由一些高級研究人員,如Yoshua Bengio,和“蒙特羅學(xué)習(xí)算法研究所”(MILA)共同研發(fā)的。下圖是發(fā)布于2010年Scipy上的Theano教程,圖中對比了Theano下的GPU和CPU與當(dāng)年其他的工具。這張圖片發(fā)表于原創(chuàng)論文——《Theano——CPU和GPU的Python數(shù)學(xué)編譯器》。
《Theano——CPU和GPU的Python數(shù)學(xué)編譯器》作者:James Bergstra, Olivier Breuleux, Frédéric Bastien, Pascal Lamblin, Razvan Pascanu, Guillaume Desjardins,Joseph Turian, David Warde-Farley, Yoshua Bengio
建立在Theano之上的還有一些其他的深度學(xué)習(xí)庫,包括Pylearn2、GroundHog(同樣是由MILA開發(fā)的)、Lasagne和Blocks and Fuel等。
TensorFlow是由“谷歌機器智能研究所”組織下的“谷歌大腦”團隊研發(fā)完成的。TensorFlow的開發(fā)是為了進行機器學(xué)習(xí)和深度神經(jīng)網(wǎng)絡(luò)的研究,除此之外,它還廣泛適用于其他的領(lǐng)域。根據(jù)TensorFlow官網(wǎng)介紹,TensorFlow是一個使用數(shù)據(jù)流圖表進行數(shù)值計算的開源軟件庫。圖表中的節(jié)點代表數(shù)學(xué)運算,而表格邊緣則代表溝通節(jié)點的多維數(shù)據(jù)數(shù)組(tensors)。其中的代碼視覺上正如下圖所展示的:
圖片來源:《TensorFlow:異構(gòu)分布系統(tǒng)上的大規(guī)模機器學(xué)習(xí)》
在本文中,我們將使用來自UCI網(wǎng)站的Sonar數(shù)據(jù)集來完成一個簡單的預(yù)測模型示例。在下面的代碼中,我們直接從UCI網(wǎng)站獲取數(shù)據(jù),并將這些數(shù)據(jù)按照60::40的比例分為訓(xùn)練數(shù)據(jù)和測試數(shù)據(jù)。我們使用Keras進行預(yù)測建模,使用sklearn對標(biāo)簽進行編碼。
在下一個代碼片段中,我們使用之前定義好的函數(shù)來讀取數(shù)據(jù)集中的數(shù)據(jù)。打印數(shù)據(jù)集之后,我們會發(fā)現(xiàn)我們的獨立變量是需要進行編碼的。
我們使用來自Scikit-learn的LabelEncoder(標(biāo)簽編碼器)對標(biāo)簽進行編碼,將字母R和M分貝轉(zhuǎn)換為數(shù)字0和1。一種熱編碼還將分類特征轉(zhuǎn)換成為了一種與算法更合適的格式。在這個示例中,我們的Y變量與R和M一樣是分類對象,使用標(biāo)簽編碼器,我們將這些字母變量轉(zhuǎn)換為了1或0。
Scikit-learn的標(biāo)簽編碼器
之后,我們創(chuàng)建了一個使用Keras的模型:
在沒有任何預(yù)處理操作的情況下,使用簡單模型的準(zhǔn)確度為81.64%
為了更好地用Keras解釋圖像處理過程,我們將使用來自“Kaggle貓狗競賽”的數(shù)據(jù)。這個競賽的目的是開發(fā)一個能夠用來區(qū)分圖像中包含的是一只狗還是一只貓的算法。對于人類來說,區(qū)分貓狗是很簡單的,但對于計算機來說可就復(fù)雜的多了。在這項“區(qū)分貓狗”的挑戰(zhàn)中,有25000張標(biāo)記了貓狗的訓(xùn)練圖片,測試數(shù)據(jù)庫中還有12500張等著我們?nèi)?biāo)記。根據(jù)Kaggle官網(wǎng),當(dāng)這個競賽開始時(2013年年底):
“目前的文獻表明,機器分類器在這個任務(wù)上的準(zhǔn)確度能達到80%以上。”因此,如果我們能成功突破80%的準(zhǔn)確度,我們就能躍居2013年的技術(shù)發(fā)展最前沿。
想要了解更多細節(jié)、進行下一步的學(xué)習(xí)或?qū)ι疃葘W(xué)習(xí)進行尖端研究,我強烈推薦Fast.ai的網(wǎng)絡(luò)公開課程。我在下面的代碼中引用了fast.ai,它為我們的學(xué)習(xí)提供了一個很好的起點。
第一步:完成設(shè)置
從Kaggle網(wǎng)站上下載貓、狗的圖片數(shù)據(jù),將其保存在你的電腦上。在本文提到的示例中,我會在我的iMac電腦上運行代碼。
基本的設(shè)置
Jeremy Howard提供了一個Python實用文件,幫助我們獲取已封裝的基礎(chǔ)函數(shù)。我們要做的第一步就是使用這個實用文件。下圖就是這個實用文件。隨著細節(jié)的深入,我們將一步步打開這個文件,看看隱藏在文件背后的信息。
第二步:使用VGG
我們在第一步中簡單地使用了一個完全為我們建立的模型,這個模型能夠識別各種各樣的圖像。第二步,我們將使用VGG。VGG是一個非常容易創(chuàng)建和理解的模型,它贏得了2014年的“ImageNet挑戰(zhàn)賽”。VGG imagenet團隊創(chuàng)建了兩個模型——VGG 19和VGG 16。VGG 19是一個大型的、操作性能慢的、準(zhǔn)確度稍佳的模型;而VGG 16是一個小型的、操作性能快的模型。我們將會使用VGG 16,因為VGG 19的操作性能比較慢,通常不值得在精確度上再做改進。
我們建立了一個Python類——Vgg16。Vgg16能讓VGG 16模型的使用更加簡單。在fast.ai的github上同樣能找到Vgg16,具體細節(jié)如下圖:
第三步:實例化VGG
Vgg16建立于Keras(我們將在稍后討論更多關(guān)于Keras的內(nèi)容)之上。Keras是一個靈活的、易于使用的、建立在Theano和TensorFlow上的深度學(xué)習(xí)庫。Keras使用一個固定的目錄結(jié)構(gòu)來分批查看大量的圖像和標(biāo)簽,在這個目錄結(jié)構(gòu)下,每一類訓(xùn)練圖像都必須放置在單獨的文件夾里。
下面是我們從文件夾中隨意抓取的數(shù)據(jù):
第四步:預(yù)測貓、狗
第五步:將圖像和代碼文件匯總
為了匯總這些圖像和文件,我推薦的方法如下圖:
閱讀到這里,就證明你就已經(jīng)采納了我們在上一篇文章中討論的理論,并做了一些實際的編程。如果你按照上面的指示和說明完成了兩個示例,那么你就已經(jīng)成功建立了你的第一個預(yù)測模型,并完成了圖像分析。
雷峰網(wǎng)特約稿件,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見轉(zhuǎn)載須知。