官术网_书友最值得收藏!

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)建了這樣一個偉大的庫。

主站蜘蛛池模板: 平昌县| 晋江市| 白玉县| 盐池县| 鄂州市| 元江| 高要市| 墨玉县| 南和县| 东明县| 邵阳县| 桃园市| 无为县| 鲁山县| 阜阳市| 尉氏县| 临朐县| 海淀区| 奉贤区| 永安市| 鹤岗市| 兴山县| 政和县| 甘孜县| 仁化县| 鹤壁市| 顺昌县| 乃东县| 南汇区| 象州县| 巴里| 长岭县| 天水市| 渝中区| 嘉黎县| 龙南县| 河津市| 永仁县| 永济市| 古田县| 青海省|