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

給深度學習入門者的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,上面代碼生成的圖像如下:

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

pyplot – Matplotlib 1.5.3 documentation

Customizing matplotlib

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

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

5.3.1 3D圖表

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

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

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

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

5.3.1 圖像顯示

Matplotlib也支持圖像的存取和顯示,並且和OpenCV一類的接口比起來,對於一般的二維矩陣的可視化要方便很多,來看例子:

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

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

Thumbnail gallery – Matplotlib 1.5.3 documentation


轉載於:http://python.jobbole.com/87471/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章