給深度學習入門者的Python快速教程 - Numpy和Matplotlib篇

發表於2017-03-13

給深度學習入門者的Python快速教程

本篇部分程式碼的下載地址:

github.com/frombeijingw

5.3 Python的科學計算包 – Numpy

numpy(Numerical Python extensions)是一個第三方的Python包,用於科學計算。這個庫的前身是1995年就開始開發的一個用於陣列運算的庫。經過了長時間的發展,基本上成了絕大部分Python科學計算的基礎包,當然也包括所有提供Python介面的深度學習框架。

numpy在Linux下的安裝已經在5.1.2中作為例子講過,Windows下也可以通過pip,或者到下面網址下載:

Obtaining NumPy & SciPy libraries

5.3.1 基本型別(array)

array,也就是陣列,是numpy中最基礎的資料結構,最關鍵的屬性是維度和元素型別,在numpy中,可以非常方便地建立各種不同型別的多維陣列,並且執行一些基本基本操作,來看例子:

注意到在匯入numpy的時候,我們將np作為numpy的別名。這是一種習慣性的用法,後面的章節中我們也預設這麼使用。作為一種多維陣列結構,array的陣列相關操作是非常豐富的:

對於一維的array所有Python列表支援的下標相關的方法array也都支援,所以在此沒有特別列出。

既然叫numerical python,基礎數學運算也是強大的:

對於array,預設執行對位運算。涉及到多個array的對位運算需要array的維度一致,如果一個array的維度和另一個array的子維度一致,則在沒有對齊的維度上分別執行對位運算,這種機制叫做廣播(broadcasting),言語解釋比較難,還是看例子理解:

5.3.2 線性代數模組(linalg)

在深度學習相關的資料處理和運算中,線性代數模組(linalg)是最常用的之一。結合numpy提供的基本函式,可以對向量,矩陣,或是說多維張量進行一些基本的運算:

5.3.3 隨機模組(random)

隨機模組包含了隨機數產生和統計分佈相關的基本函式,Python本身也有隨機模組random,不過功能更豐富,還是來看例子:

隨機模組可以很方便地讓我們做一些快速模擬去驗證一些結論。比如來考慮一個非常違反直覺的概率題例子:一個選手去參加一個TV秀,有三扇門,其中一扇門後有獎品,這扇門只有主持人知道。選手先隨機選一扇門,但並不開啟,主持人看到後,會開啟其餘兩扇門中沒有獎品的一扇門。然後,主持人問選手,是否要改變一開始的選擇?

這個問題的答案是應該改變一開始的選擇。在第一次選擇的時候,選錯的概率是2/3,選對的概率是1/3。第一次選擇之後,主持人相當於幫忙剔除了一個錯誤答案,所以如果一開始選的是錯的,這時候換掉就選對了;而如果一開始就選對,則這時候換掉就錯了。根據以上,一開始選錯的概率就是換掉之後選對的概率(2/3),這個概率大於一開始就選對的概率(1/3),所以應該換。雖然道理上是這樣,但是還是有些繞,要是通過推理就是搞不明白怎麼辦,沒關係,用隨機模擬就可以輕鬆得到答案:

5.4 Python的視覺化包 – Matplotlib

Matplotlib是Python中最常用的視覺化工具之一,可以非常方便地建立海量型別地2D圖表和一些基本的3D圖表。Matplotlib最早是為了視覺化癲癇病人的腦皮層電圖相關的訊號而研發,因為在函式的設計上參考了MATLAB,所以叫做Matplotlib。Matplotlib首次發表於2007年,在開源和社群的推動下,現在在基於Python的各個科學計算領域都得到了廣泛應用。Matplotlib的原作者John D. Hunter博士是一名神經生物學家,2012年不幸因癌症去世,感謝他建立了這樣一個偉大的庫。

安裝Matplotlib的方式和numpy很像,可以直接通過Unix/Linux的軟體管理工具,比如Ubuntu 16.04 LTS下,輸入:

>> sudo apt install python-matplotlib

或者通過pip安裝:

>> pip install matplotlib

Windows下也可以通過pip,或是到官網下載:

python plotting – Matplotlib 1.5.3 documentation

Matplotlib非常強大,不過在深度學習中常用的其實只有很基礎的一些功能,這節主要介紹2D圖表,3D圖表和影像顯示。

5.4.1 2D圖表

Matplotlib中最基礎的模組是pyplot。先從最簡單的點圖和線圖開始,比如我們有一組資料,還有一個擬合模型,通過下面的程式碼圖來視覺化:

matplotlib和pyplot的慣用別名分別是mpl和plt,上面程式碼生成的影像如下:

給深度學習入門者的Python快速教程 - Numpy和Matplotlib篇

給深度學習入門者的Python快速教程 - Numpy和Matplotlib篇

給深度學習入門者的Python快速教程 - Numpy和Matplotlib篇

基本的畫圖方法就是這麼簡單,如果想了解更多pyplot的屬性和方法來畫出風格多樣的影像,可以參考官網:

pyplot – Matplotlib 1.5.3 documentation

Customizing matplotlib

點和線圖表只是最基本的用法,有的時候我們獲取了分組資料要做對比,柱狀或餅狀型別的圖或許更合適:

在這段程式碼中又出現了一個新的東西叫做,一個用ax命名的物件。在Matplotlib中,畫圖時有兩個常用概念,一個是平時畫圖蹦出的一個視窗,這叫一個figure。Figure相當於一個大的畫布,在每個figure中,又可以存在多個子圖,這種子圖叫做axes。顧名思義,有了橫縱軸就是一幅簡單的圖表。在上面程式碼中,先把figure定義成了一個一行兩列的大畫布,然後通過fig.add_subplot()加入兩個新的子圖。subplot的定義格式很有趣,數字的前兩位分別定義行數和列數,最後一位定義新加入子圖的所處順序,當然想寫明確些也沒問題,用逗號分開即可。。上面這段程式碼產生的影像如下:

給深度學習入門者的Python快速教程 - Numpy和Matplotlib篇

5.3.1 3D圖表

Matplotlib中也能支援一些基礎的3D圖表,比如曲面圖,散點圖和柱狀圖。這些3D圖表需要使用mpl_toolkits模組,先來看一個簡單的曲面圖的例子:

這個例子中先生成一個所有值均為0的複數array作為初始頻譜,然後把頻譜中央部分用隨機生成,但同時共軛關於中心對稱的子矩陣進行填充。這相當於只有低頻成分的一個隨機頻譜。最後進行反傅立葉變換就得到一個隨機波動的曲面,影像如下:

給深度學習入門者的Python快速教程 - Numpy和Matplotlib篇

3D的散點圖也是常常用來檢視空間樣本分佈的一種手段,並且畫起來比表面圖和網線圖更加簡單,來看例子:

這個例子中,為了方便,直接先取樣了一堆3維的正態分佈樣本,保證方向上的均勻性。然後歸一化,讓每個樣本到原點的距離為1,相當於得到了一個均勻分佈在球面上的樣本。再接著把每個樣本都乘上一個均勻分佈隨機數的開3次方,這樣就得到了在球體內均勻分佈的樣本,最後根據判別平面3x+2y-z-1=0對平面兩側樣本用不同的形狀和顏色畫出,影像如下:

給深度學習入門者的Python快速教程 - Numpy和Matplotlib篇

5.3.1 影像顯示

Matplotlib也支援影像的存取和顯示,並且和OpenCV一類的介面比起來,對於一般的二維矩陣的視覺化要方便很多,來看例子:

這段程式碼中第一個例子是讀取一個本地圖片並顯示,第二個例子中直接把上小節中反傅立葉變換生成的矩陣作為影像拿過來,原圖和經過乘以3再加4變換的圖直接繪製了兩個形狀一樣,但是值的範圍不一樣的圖案。顯示的時候imshow會自動進行歸一化,把最亮的值顯示為純白,最暗的值顯示為純黑。這是一種非常方便的設定,尤其是檢視深度學習中某個卷積層的響應圖時。得到影像如下:

給深度學習入門者的Python快速教程 - Numpy和Matplotlib篇

給深度學習入門者的Python快速教程 - Numpy和Matplotlib篇

只講到了最基本和常用的圖表及最簡單的例子,更多有趣精美的例子可以在Matplotlib的官網找到:

Thumbnail gallery – Matplotlib 1.5.3 documentation

相關文章