- 飛槳PaddlePaddle深度學(xué)習(xí)實戰(zhàn)
- 劉祥龍等編著
- 1276字
- 2020-09-28 17:21:30
1.3.2 Matplotlib操作
Matplotlib是Python中最常用的可視化工具之一,可以非常方便地創(chuàng)建2D圖表和一些基本的3D圖表。Matplotlib最早是為了可視化癲癇病人的腦皮層電圖相關(guān)的信號而研發(fā)的,因為在函數(shù)的設(shè)計上參考了MATLAB,所以叫作Matplotlib[1]。Matplotlib首次發(fā)表于2007年,在開源社區(qū)的推動下,其在基于Python的各個科學(xué)計算領(lǐng)域都得到了廣泛應(yīng)用。
安裝Matplotlib的方式與NumPy很像,可以直接通過UNIX/Linux的軟件管理工具,比如在Ubuntu 16.04 LTS下輸入:
>> sudo apt install python-matplotlib
或者通過pip安裝:
>> pip install matplotlib
Windows下也可以通過pip安裝,或是到官網(wǎng)下載(http://matplotlib.org/)。
1.圖表展示
Matplotlib非常強大,不過在深度學(xué)習(xí)中常用的其實只有很基礎(chǔ)的一些功能。這里以機器學(xué)習(xí)中的梯度下降法來展示其圖表功能。首先假設(shè)現(xiàn)在需要求解目標(biāo)函數(shù)func(x)=x*x的極小值,由于func是一個凸函數(shù),因此它唯一的極小值同時也是它的最小值,其一階導(dǎo)函數(shù)為dfunc(x)=2*x,如代碼清單1-9所示。
代碼清單1-9 創(chuàng)建目標(biāo)函數(shù)及目標(biāo)函數(shù)求導(dǎo)函數(shù)
import numpy as np import matplotlib.pyplot as plt # 目標(biāo)函數(shù):y=x^2 def func(x): return np.square(x) # 目標(biāo)函數(shù)一階導(dǎo)數(shù)也即偏導(dǎo)數(shù):dy/dx=2*x def dfunc(x): return 2 * x
接下來編寫梯度下降法功能函數(shù)gradient_descent(),如代碼清單1-10所示。
代碼清單1-10 梯度下降法功能函數(shù)實現(xiàn)
def gradient_descent(x_start, func_deri, epochs, learning_rate): """ 梯度下降法。給定起始點與目標(biāo)函數(shù)的一階導(dǎo)函數(shù),求在epochs次迭代中x的更新值 args: x_start: x的起始點 func_deri: 目標(biāo)函數(shù)的一階導(dǎo)函數(shù) epochs: 迭代周期 learning_rate: 學(xué)習(xí)率 return: xs在每次迭代后的位置(包括起始點),長度為epochs+1 """ theta_x = np.zeros(epochs + 1) temp_x = x_start theta_x[0] = temp_x for i in range(epochs): deri_x = func_deri(temp_x) # v表示x要改變的幅度 delta = - deri_x * learing_rate temp_x = temp_x + delta theta_x[i+1] = temp_x return theta_x
在mat_plot()函數(shù)中,具體用Matplotlib實現(xiàn)了梯度下降法搜索最優(yōu)解的過程,如代碼清單1-11所示。
代碼清單1-11 利用Matplotlib實現(xiàn)圖像繪制
def mat_plot(): # 利用matplotlib繪制圖像 line_x = np.linspace(-5, 5, 100) line_y = func(line_x) x_start = -5 epochs = 5 lr = 0.3 x = gradient_descent(x_start, dfunc, epochs, lr=lr) color = 'r' # plot實現(xiàn)繪制的主功能 plt.plot(line_x, line_y, c='b') plt.plot(x, func(x), c=color, label='lr={}'.format(lr)) plt.scatter(x, func(x), c=color, ) # legend函數(shù)顯示圖例 plt.legend() # show函數(shù)顯示 plt.show() mat_plot()
這個例子中展示了如何利用梯度下降法尋找x2的極小值,起始檢索點為x=-5,學(xué)習(xí)率為0.3,最終繪制的圖像如圖1-7所示,圖中紅線為檢索過程(這里圖1-7中用虛線表示,便于區(qū)分),點為每次更新的x值所在的點。利用Matplotlib還能繪制多種其他類型的圖像,具體實現(xiàn)請參考Matplotlib官方文檔(網(wǎng)址:http://matplotlib.org/)。
圖1-7 Matplotlib繪制的圖像
2.圖像顯示
Matplotlib也支持圖像的存取和顯示,并且與OpenCV一類的接口相比,在可視化方面比一般的二維矩陣要方便很多,在機器學(xué)習(xí)中使用也更加靈活,具體實例如代碼清單1-12所示。
代碼清單1-12 利用Matlibplot實現(xiàn)圖像的顯示
import matplotlib.pyplot as plt # 讀取一張小白狗的照片并顯示 plt.figure('A Little White Dog') little_dog_img = plt.imread('little_white_dog.jpg') plt.imshow(little_dog_img) # Z是小白狗的照片,img0就是Z,img1是Z做了簡單的變換 Z = plt.imread('little_white_dog.jpg') Z = rgb2gray(Z) img0 = Z img1 = 1 - Z # cmap指定為'gray'用來顯示灰度圖 fig = plt.figure('Auto Normalized Visualization') ax0 = fig.add_subplot(121) ax0.imshow(img0, cmap='gray') ax1 = fig.add_subplot(122) ax1.imshow(img1, cmap='gray') plt.show()
這段代碼中首先讀取一個本地圖片并顯示,如圖1-8所示。然后將讀取的原圖灰度化,經(jīng)過兩次灰度像素變換,形成了兩張形狀類似但取值范圍不同的圖案。顯示的時候imshow會自動進行歸一化,把最亮的值顯示為純白,最暗的值顯示為純黑,如圖1-9所示。這是一種非常方便的設(shè)定,尤其是查看深度學(xué)習(xí)中某個卷積層的響應(yīng)圖時。
圖1-8 Matplotlib顯示圖片
圖1-9 Matplotlib顯示圖像處理后的結(jié)果
這里只講到了最基本和常用的圖表以及最簡單的例子,更多有趣又精美的例子可以在Matplotlib的官網(wǎng)找到:Thumbnail gallery-Matplotlib 1.5.3 documentation(http://matplotlib.org/gallery.html)。
[1] Matplotlib 的原作者John D. Hunter 博士是一名神經(jīng)生物學(xué)家,2012 年因癌癥不幸去世,感謝他創(chuàng)建了這樣一個偉大的庫。
- C語言程序設(shè)計案例教程(第2版)
- Instant Zepto.js
- Practical Game Design
- AppInventor實踐教程:Android智能應(yīng)用開發(fā)前傳
- 區(qū)塊鏈技術(shù)進階與實戰(zhàn)(第2版)
- Geospatial Development By Example with Python
- Android群英傳
- Visual Studio Code 權(quán)威指南
- Angular應(yīng)用程序開發(fā)指南
- 微信小程序開發(fā)實戰(zhàn):設(shè)計·運營·變現(xiàn)(圖解案例版)
- Fastdata Processing with Spark
- 零基礎(chǔ)看圖學(xué)ScratchJr:少兒趣味編程(全彩大字版)
- Elasticsearch Blueprints
- Flink入門與實戰(zhàn)
- Android初級應(yīng)用開發(fā)