卷積神經網路的入門認識
卷積神經網路,會後續繼續總結:
轉載一部分:https://blog.csdn.net/qq_42156420/article/details/81291482
上圖,有著 3×3 過濾器的卷積,在上面的圖片中,應用到矩陣上的滑動窗是綠色,而滑動窗矩陣則是紅色。輸出就是卷積特徵矩陣。
下面的圖片顯示了兩個矩形脈衝(藍色和紅色)的卷積運算及其結果。
讓我們把這個擴充套件到一個大寫字母「A」的圖片。我們知道圖片是由畫素點構成的。這樣我們的輸入矩陣就是「A」。我們選擇的滑動窗方程是一個隨機的矩陣 g。下圖顯示的就是這個矩陣點積的卷積輸出。
什麼是卷積神經網路 (CNN) ?
過濾器或核函式:正如下面這張來自 RiverTrail 的影象所示,一個過濾器或核函式會滑到影象的每個位置上並計算出一個新的畫素點,這個畫素點的值是它經過的所有畫素點的加權和。在上面的電子表格例子中,我們的過濾器就是 g,它經過了 f 的輸入矩陣。
來源:http://intellabs.github.io/RiverTrail/tutorial/
卷積層:輸入矩陣和過濾器的點積形成的一個新矩陣,稱為卷積矩陣或卷積層。
來源:https://docs.gimp.org/en/plug-in-convmatrix.html
下面的網址中有一個很好的解釋填補、跨步和轉置是如何工作的視覺圖表。
σ(x) = 1 / (1 + exp(−x))
雙曲正切函式:把一個實數值輸入擠壓到 (-1,1)區間內
tanh(x) = 2σ(2x) − 1
ReLU
ReLU 代表單調線性單元(Rectified Linear Unit)。它是輸入為 x 的最值函式 (x,0),比如一個卷積影象的矩陣。ReLU 接著把矩陣 x 中的所有負值置為零,並保持所有其他值不變。ReLU 是在卷積之後計算出來的,因此會出現一個非線性的啟用函式,如雙曲正切或雙曲函式。Geoff Hinton 在他的 nature 論文裡第一次討論這個問題。
ELUs
指數線性單元(Exponential linear units)試圖使平均啟用接近於零,這樣就能加速學習。ELUs 也能通過正值認定避免消失梯度的出現。研究顯示,ELUs 比 ReLUs 有更高的分類準確性。
其中 ai 是在 (1, 正無窮) 區間內的固定引數。
引數化修正線性單元 (PReLU)
PReLU 可被視為滲漏 ReLU 的一個變體。在 PReLU 中,負值部分的斜率是從資料中學習得來的,而非預先定義好的。PReLU 的創作者們聲稱它是 ImageNet 歸類(Russakovsky et al., 2015) 任務中(機器)超越人類水平的關鍵因素。它與滲漏 ReLU 基本相同,唯一的區別就是 ai 是通過反向傳播訓練學習到的。
隨機滲漏修正線性單元 (RReLU)
隨機滲漏單調線性單元 (RReLU) 也是滲漏 ReLU 的一種變體。在 RReLU 中,負值部分的斜率是在給定訓練範圍內的隨機取值的,然後在測試中固定下來。RReLU 最顯著的特徵是在訓練過程中,aji 是一個從一致分佈 U(l,u) 上取樣得到的隨機數。正式數學表達如下:
下面顯示了 ReLU, 滲漏 ReLU, PReLU 和 ReLU 的對比。
來源::https://arxiv.org/pdf/1505.00853.pdf。ReLU, 滲漏 ReLU, PReLU 和 ReLU,對於 PReLU,ai 是學習到的;而對於滲漏 ReLU,ai 是固定的。對於 RReLU,aji 是一個在給定區間內取樣的隨機變數,在測試中保持不變。
噪聲啟用函式
這些都是拓展後包括了 Gaussian 噪聲(Gaussian noise)的啟用函式。
來源:維基百科
池化層
池化層的目標是逐漸地減少矩陣的尺寸,以減少網路中引數的數量和計算,這樣也就能控制過擬合。池化層在輸入的每個深度切片上獨立操作,並使用最大化和平均運算來重置其空間尺寸。最常見的形式,一個採用了步幅 2,尺寸 2x2 過濾器的池化層,同時沿著寬度和高度,以幅度 2 將輸入中的每個深度切片向下取樣,丟棄了啟用值的 75%。在此情況下,每個最大值運算都取了 4 個數字(某些深度切片中的小 2x2 區域)的最大值。深度方向的維度保持不變。更一般的來說,池化層就是:
來源:http://cs231n.github.io/convolutional-networks/#pool
來源 :https://ujjwalkarn.me/2016/08/11/intuitive-explanation-convnets/
注意:這裡我們把 2 x 2 window 滑動了兩個細胞(也被叫做步幅),並取了每個區域的最大值。
批歸一化層:
批歸一化是歸一化每個中間層的權重和啟用函式的有效方式。批歸一化有兩個主要的好處:
1. 對一個模型加入批歸一化能使訓練速度提升 10 倍或更多
2. 由於歸一化極大降低了偏遠輸入的小數字過度影響訓練的能力,它也能降低過擬合。
全連線層:
全連線層是一個傳統的多層感知器(Multi Layer Perceptron),它在輸出層使用了一個Softmax 函式。「全連線」這個術語就說明了前一層和後一層的每個神經元都是連線起來的。Softmax 函式即對數函式(logistic function)的一般化情況,它把一個取值區間為任意實數的 K 維向量「擠壓」成一個取值區間在(0,1)內且和為1的 K 維向量。
來源:維基百科
Sofxmax 啟用一般被用於最終的完全連線層,隨著它的值在 0 和 1 之間不停變化,得到概率。
現在我們對 CNN 中不同的層次都有了一定的概念。運用這些知識我就能開發出肺癌探測所需的深度學習演算法。
第三部分
在最後一部分中,我們將透過卷積神經網路討論一些深度學習的基礎知識。在本文中,我們將側重於使用 Keras 和 Theano 的基礎深入學習。我們將給出兩個範例,一個使用 Keras 進行基本預測分析,另一個使用 VGG 的影象分析簡單樣例。
我已經意識到這個話題的廣度和深度,它需要更多的文章來解讀。在之後的文章中,我們將討論處理中 DICOM 和 NIFTI 在醫學成像格式中的不同,進一步擴大我們的學習範圍並對如何對 2 維肺分割分析使用深度學習進行討論。然後轉到 3 維肺分割。我們同樣會討論如何在深度學習之前進行醫學影象分析以及我們現在可以如何做。我非常開心也非常感謝我的新合作伙伴將這一切聚在一起——Flavio Trolese(4Quant 的合作伙伴)、 Kevin Mader(4Quant 的聯合創始人)以及 Cyriac Joshy(瑞士蘇黎世聯邦理工的講師)。
在本文中,我們將要討論 Keras 並使用兩個範例來展示如何使用 Keras 進行簡單的預測分析任務以及影象分析。
什麼是 Keras?
Keras 網站是這麼介紹的——Keras 是 Theano 和 TensorFlow 的深度學習庫。
Keras API 在 Theano 和 TensorFlow 之上執行
Keras 是高階的神經網路 API,由 Python 編寫並可以在 TensorFlow 和 Theano 之上執行。其開發目的是使快速實驗成為可能。
什麼是 Theano 和 TensorFlow?
James Bergstra 博士等人在 Scipy 2010 釋出的 Theano 是一個 CPU 和 GPU 數學表示式編譯器。它是一個 Python 庫,允許你有效地定義、優化和評估涉及多維陣列的數學表示式。Theano 由 Yoshua Bengio 等一些高階研究員和蒙特利爾學習演算法研究所(MILA)共同完成。在 Scipy 2010 上一個非常棒的 Theano 教程。下圖顯示了截至 2010 年,Theano 在 GPU 和 CPU 與其他工具的對比。該結果最初在《Theano: A CPU and GPU Math Compiler in Python》一文中發表。
還有一些在 Theano 之上的建立其它的庫,包括 Pylearn2 和 GroundHog(同樣由 MILA 開發)、Lasagne、Blocks 和 Fuel.
TensorFlow 由 Google Brain 團隊的研究員與工程師開發。其被開發用於進行機器學習和深度神經網路研究,但是該系統也足以適用於其它領域。如其網站介紹的那樣,TensorFlow 是一個使用資料流圖的數值計算開源軟體庫。圖中的節點表示數學運算,圖的邊表示在其之間傳遞的多維資料陣列(張量)。程式碼的視覺化如下圖所示。
TensorFlow:在異構分散式系統上的大規模機器學習
使用 Keras 的預測分析示例
在這個示例中,我們將使用 UCI 網站的 Sonar 資料集構建一個簡單的預測模型。在下面的程式碼中,我們將會直接從 UCI 網站中得到資料並以 60:40 的比例將其分為訓練集與測試集。我們在預測模型中使用 Keras 並在標籤編碼中使用 sklearn。
在下一段程式碼中,我們讀取資料集,並使用上面定義的函式檢視資料。我們列印資料集,並找出需要編碼的因變數。
我們使用 scikit-learn 中的 LabelEncoder 進行標籤編碼,將 R 和 M 隱藏到數字 0 和 1 中。這樣的操作被稱為 one-hot 編碼。one-hot 編碼可將分類特徵轉換為對演算法更友好的格式。在這個示例中,我們使用使用「R」值 和「M」值分類我們的 Y 變數。使用標籤編碼器,它們分別被轉換為「1」和「0」。
scikit-learn 中的 LabelEncoder
然後使用 Keras 建立模型:
無預處理的簡單模型的精確度為 81.64%
使用 Keras 的影象分析示例
為了用 Keras 解釋影象處理,我們將使用來自 Kaggle 比賽的資料——狗和貓(https://www.kaggle.com/c/dogs-vs-cats)。該比賽的目的在於開發一種演算法以區分影象是否包含狗或貓。這個任務對人、狗和貓來說很簡單,但是計算機卻很難做到。在該項挑戰中,有 25,000 張標記狗和貓的照片可用於訓練,並且在測試集中有 12,500 張照片,我們必須在挑戰中嘗試為其加上標籤。根據 Kaggle 網站,當該項比賽開始時(2013 年底):
當前最佳:目前的文獻顯示,機器分類器在該任務上可以達到 80% 以上的準確度。那麼如果我們能夠超過 80%,我們將在 2013 年處於最前沿。」
我強烈推薦觀看 Fast.ai 的 MOOC 以瞭解更多的細節,學習下一步和深度學習的前沿研究。我已經在下列程式碼中引用 fast.ai,這是一個很好的起點,連結:http://www.fast.ai/
步驟 1:設定
從 Kaggle 網站下載狗和貓的資料,並存入你的膝上型電腦。本文中的示例均在 Mac 上執行。
基礎設定
Jeremy Howard 在他的班上提供了一個實用的 Python 檔案,該檔案有助於封裝基本函式。對於開始部分,我們將使用此實用檔案。點選下載:https://github.com/fastai/courses/blob/master/deeplearning1/nbs/utils.py。當我們深入到更多細節時,我們將解壓該檔案並檢視其背後的內容。
步驟 2:使用 VGG
我們的第一步簡單地使用已經為我們建立好的模型,它可以識別許多類別的圖片(1,000 種)。我們將使用『VGG』,它贏得了 2014 年 ImageNet 比賽,是一個非常簡單的創造理解的模型。VGG ImageNet 團隊創造了更大、更慢、準確性略有提高的模型(VGG 19)和更小、更快的模型(VGG 16)。我們將使用 VGG 16,因為 VGG 19 過慢的效能與其在準確度上的微小提升不對等。
我們建立了一個 Python 類,Vgg16,這使得使用 VGG 16 模型非常簡單。Vgg 16 同樣可從 fast.ai 的 GitHub 中獲得:https://github.com/fastai/courses/blob/master/deeplearning1/nbs/vgg16.py
步驟 3:例項化 VGG
Vgg16 構建在 Keras 之上(我們將在短時間內學到更多內容),Keras 是一個靈活易用的深度學習庫,該軟體庫是基於 Theano 或 Tensorflow 的一個深度學習框架。Keras 使用固定的目錄結構在批量讀取影象和標籤組,每個類別的影象必須放在單獨的資料夾中。
我們從訓練資料夾中獲取批量資料:
步驟 4:預測狗 vs 貓
步驟 5:總結並編碼檔案
總結一下這篇文章,我推薦的狗和貓分類方法為:
總結
如果讀者跟著我們走到了這一步,那麼其實已經實現了上一部分文章中討論過的理論,並做了一些實際的程式設計工作。如果讀者們按照上述說明實現了這兩個案例,那麼就已經完成了使用 Keras 的第一個預測模型,也初步實現了影象分析。由於程式碼的長度,我們不在這裡討論細節只給出了連結。如果你檢視連結有任何疑問,請聯絡 fast.ai。
至此,我們從最開始的資料庫安裝到醫學影象資料格式的解釋,已經有了醫學影像處理的基本知識。隨後我們從卷積的定義到 CNN 的詳細構架與原理,進一步實踐的理論基礎已經完成了累積。最後一部分對前面的理論知識進行實踐,用 Python 實現了這一令人激動的模型。因此,我們希望讀者朋友能在這一循序漸進的過程中真正感受到醫學影像處理的樂趣。