人工智能教程(六):Keras 和第一個數(shù)據(jù)集
在本系列的 上一篇文章中,我們學(xué)習(xí)了使用 Anaconda,加強(qiáng)了概率論的知識。在本文中我們將繼續(xù)學(xué)習(xí)概率論的知識,學(xué)習(xí)使用 seaborn 和 Pandas 進(jìn)行數(shù)據(jù)可視化,并進(jìn)一步介紹 TensorFlow 和 Keras 的使用。
讓我們從增長人工智能和機(jī)器學(xué)習(xí)的理論知識開始。眾所周知人工智能、機(jī)器學(xué)習(xí)、數(shù)據(jù)科學(xué)、深度學(xué)習(xí)等是當(dāng)今計算機(jī)科學(xué)的熱門話題。然而,計算機(jī)科學(xué)還其他熱門的話題,比如 區(qū)塊鏈blockchain、物聯(lián)網(wǎng)Internet of Things(IoT)、量子計算quantum computing等。那么,人工智能領(lǐng)域的發(fā)展是否會對這些技術(shù)產(chǎn)生積極的影響呢?
首先,讓我們討論一下區(qū)塊鏈。根據(jù)維基百科的定義,“區(qū)塊鏈?zhǔn)且环N分布式賬本,它由不斷增長的記錄(稱為 區(qū)塊block)組成,這些記錄使用加密技術(shù)安全地連接在一起。”乍一看,人工智能和區(qū)塊鏈似乎是兩個高速發(fā)展的獨(dú)立技術(shù)。但令人驚訝的是,事實(shí)并非如此。區(qū)塊鏈相關(guān)的行話是 完整性integrity,人工智能相關(guān)的行話是數(shù)據(jù)。我們將大量數(shù)據(jù)交給人工智能程序去處理。雖然這些應(yīng)用程序產(chǎn)生了驚人的結(jié)果,但我們?nèi)绾涡湃嗡鼈兡??這就提出了對可解釋的人工智能的需求。它可以提供一定的保證,以便最終用戶可以信任人工智能程序提供的結(jié)果。許多專家認(rèn)為,區(qū)塊鏈技術(shù)可以用來提高人工智能軟件做出的決策的可信度。另一方面,智能合約smart contract(區(qū)塊鏈技術(shù)的一部分)可以從人工智能的驗證中受益。從本質(zhì)上講,智能合約和人工智能通常都是做決策。因此,人工智能的進(jìn)步將對區(qū)塊鏈技術(shù)產(chǎn)生積極影響,反之亦然。
下面讓我們討論一下人工智能和物聯(lián)網(wǎng)之間的影響。早期的物聯(lián)網(wǎng)設(shè)備通常沒有強(qiáng)大的處理能力或備用電池。這使得需要大量處理能力的機(jī)器學(xué)習(xí)的軟件無法部署在物聯(lián)網(wǎng)設(shè)備上。當(dāng)時,大多數(shù)物聯(lián)網(wǎng)設(shè)備中只部署了基于規(guī)則的人工智能軟件。基于規(guī)則的人工智能的優(yōu)勢在于它很簡單,需要相對較少的處理能力。如今的物聯(lián)網(wǎng)設(shè)備具備更強(qiáng)大的處理能力,可以運(yùn)行更強(qiáng)大的機(jī)器學(xué)習(xí)軟件。特斯拉開發(fā)的高級駕駛輔助系統(tǒng) 特斯拉自動駕駛儀Tesla Autopilo
最后,讓我們討論人工智能和量子計算是如何相互影響的。盡管量子計算仍處于起步階段,但 量子機(jī)器學(xué)習(xí)quantum machine learning(QML)是其中非常重要的課題。量子機(jī)器學(xué)習(xí)基于兩個概念:量子數(shù)據(jù)和量子-經(jīng)典混合模型。量子數(shù)據(jù)是由量子計算機(jī)產(chǎn)生的數(shù)據(jù)。量子神經(jīng)網(wǎng)絡(luò)quantum neural network(QNN)用于模擬量子計算模型。TensorFlow Quantum 是一個用于量子-經(jīng)典混合機(jī)器學(xué)習(xí)的強(qiáng)大工具。這類工具的存在表明,在不久的將來將會有越來越多的基于量子計算的人工智能解決方案。
seaborn 入門
seaborn 是一個基于 Matplotlib 的數(shù)據(jù)可視化 Python 庫。用它能夠繪制美觀且信息豐富的統(tǒng)計圖形。通過
Anaconda Navigator 可以輕松安裝 seaborn。我用 ESPNcricinfo 網(wǎng)站上 T20
國際板球賽的擊球記錄,創(chuàng)建了一個名為 T20.csv
的 CSV(逗號分隔值comma-separated value)文件,其中包含以下
15
列:球員姓名、職業(yè)生涯跨度、比賽場次、局?jǐn)?shù)、未出局次數(shù)、總得分、最高得分、平均得分、面對球數(shù)、擊球率、百分次數(shù)、五十分次數(shù)、零分次數(shù)、四分次數(shù)和六分次數(shù)。圖
1 是使用 Pandas 庫讀取這個 CSV 文件的程序代碼。我們已經(jīng)在前面介紹過 Pandas 了。
圖 1:使用 seaborn 的簡單例子
下面逐行解釋程序代碼的作用。第 1 行和第 2 行導(dǎo)入 Pandas 和 seaborn 包。第 3 行從 JupyterLab 的工作目錄中讀取文件 T20.csv
。第 4 行打印元數(shù)據(jù)和第一行數(shù)據(jù)。圖 1 顯示了這行數(shù)據(jù),它顯示了 T20 國際板球賽中得分最高的 Virat Kohli 的擊球記錄。第 5 行將元數(shù)據(jù)和 T20.csv
中的前五行數(shù)據(jù)保存到 Best5.csv
中。在執(zhí)行該行代碼時會在 JupyterLab 的工作目錄中創(chuàng)建這個文件。第 6 行根據(jù)列百分次數(shù)按升序?qū)?CSV 文件進(jìn)行排序,并將前 10 名世紀(jì)得分手的詳細(xì)信息存儲到 Highest100.csv
中。該文件也將存儲在 JupyterLab 的工作目錄中。最后,第7行代碼提取了第 5 列(總得分)和第 7 列(平均得分)的數(shù)據(jù)信息,并生成散點(diǎn)圖。圖 2 顯示了程序在執(zhí)行時生成的散點(diǎn)圖。
圖 2:seaborn 繪制的散點(diǎn)圖
在程序末尾添加如下代碼行并再次運(yùn)行。
sns.kdeplot(data=df.iloc[:, [5, 7]].head(50), x=’Ave’, y=’Runs’)
圖 3:使用 seaborn 繪制的核密度估計圖
這行代碼調(diào)用 kdeplot()
函數(shù)繪制第 5 列和第 7 列數(shù)據(jù)的 核密度估計Kernel Distribution Estimation(KDE)圖。KDE 圖可以描述連續(xù)或非參數(shù)數(shù)據(jù)變量的概率密度函數(shù)。這個定義可能無法讓您了解函數(shù) kdeploy()
將要執(zhí)行的實(shí)際操作。圖 3 是在單個圖像上繪制的 KDE 圖和散點(diǎn)圖。從圖中我們可以看到,散點(diǎn)圖繪制的數(shù)據(jù)點(diǎn)被 KDE 圖分組成簇。seaborn 還提供了許多其他繪圖功能。在圖 1 中程序的第 7 行分別替換為下面的的代碼行(一次一行),并再次執(zhí)行該程序,你會看到不同風(fēng)格的繪圖顯示。探索 seaborn 提供的其他繪圖功能,并選擇最適合你需求的功能。
sns.histplot(data=df.iloc[:, [5, 7]].head(50), x=’Ave’, y=’Runs’)
sns.rugplot(data=df.iloc[:, [5, 7]].head(50), x=’Ave’, y=’Runs’)
更多概率論
在本系列之前的一篇文章中,我們看到可以用正態(tài)分布來對現(xiàn)實(shí)場景進(jìn)行建模。但正態(tài)分布只是眾多重要概率分布中的一種。圖 4 中的程序繪制了三種概率分布。
圖 4:繪制多種概率分布的程序
下面我來解釋這個程序。第 1 行導(dǎo)入 NumPy 的 random 模塊。第 2 行和第 3 行導(dǎo)入用于繪圖的 Matplotlib 和 seaborn。第 5 行生成帶有參數(shù) n
(試驗次數(shù))和 p
(成功概率)的 二項分布binomial distribution數(shù)據(jù)。
二項分布是一種離散概率分布,它給出了在一系列 n
次獨(dú)立實(shí)驗中成功的數(shù)量。第三個參數(shù) size
決定了輸出的形狀。第 6 行繪制生成的數(shù)據(jù)的直方圖。由于參數(shù) kde=True
,它還會繪制 KDE 圖。第三個參數(shù) color='r'
表示繪圖時使用紅色。第 7 行生成一個泊松分布。泊松分布是一種離散概率分布,它給出了二項分布的極限。參數(shù) lam
表示在固定時間間隔內(nèi)發(fā)生預(yù)期事件的次數(shù)。這里的參數(shù) size
也決定了輸出的形狀。第 8 行將生成的數(shù)據(jù)繪制為綠色的直方圖。第 9 行生成大小為 1000 的指數(shù)分布。第 10 行將生成的數(shù)據(jù)繪制為藍(lán)色的直方圖。最后,第 11 繪制三個概率分布的所有圖像(見圖 5)。NumPy 的 random 模塊提供了大量的其他概率分布,如 Dirichlet 分布、Gamma 分布、幾何分布、拉普拉斯分布等。學(xué)習(xí)和熟悉它們將是非常值得的。
圖 5:概率分布的圖像
現(xiàn)在,讓我們學(xué)習(xí)線性回歸。使用線性回歸分析可以根據(jù)一個變量來預(yù)測一個變量的值。線性回歸的一個重要應(yīng)用是數(shù)據(jù)擬合。線性回歸非常重要,因為它很簡單。機(jī)器學(xué)習(xí)中的監(jiān)督學(xué)習(xí)范式實(shí)際上就是回歸建模。因此,線性回歸可以被認(rèn)為是一種重要的機(jī)器學(xué)習(xí)策略。這種學(xué)習(xí)范式通常被統(tǒng)計學(xué)家稱為統(tǒng)計學(xué)習(xí)。線性回歸是機(jī)器學(xué)習(xí)中的重要操作。NumPy 和 SciPy 都提供了線性回歸的函數(shù)。下面我們展示使用 NumPy 和 SciPy 進(jìn)行線性回歸的示例。
圖 6:使用 NumPy 進(jìn)行線性回歸
圖 6 是使用 NumPy 進(jìn)行線性回歸的程序。第 1 行和第 2 行導(dǎo)入 NumPy 和 Matplotlib。第 4 行和第 5 行初始化變量 a
和 b
。第 6 行使用函數(shù) linspace()
在 0 和 1 之間等間隔地生成 100 個數(shù)字。第 7 行使用變量 a
、b
和數(shù)組 x
生成數(shù)組 y
中的值。函數(shù) randn()
返回標(biāo)準(zhǔn)正態(tài)分布的數(shù)據(jù)。第 8 行將數(shù)組 x
和 y
中的值繪制成散點(diǎn)圖(見圖 7),圖中的 100 個數(shù)據(jù)點(diǎn)用紅色標(biāo)記。第 9 行使用函數(shù) polyfit()
執(zhí)行稱為 最小二乘多項式擬合least squares polynomial fit 的線性回歸技術(shù)。函數(shù) polyfit()
的輸入?yún)?shù)包括數(shù)組 x
和 y
,以及第三個表示擬合多項式的階數(shù)的參數(shù),在本例中為 1,表示擬合一條直線。該函數(shù)的返回值是多項式的系數(shù),代碼中將其存儲在數(shù)組 p
中。第 10 行使用函數(shù) polyval()
對多項式求值,并將這些值存儲在數(shù)組y_l
中。第 11 行用藍(lán)色繪制擬合得到的直線(見圖 7)。最后,第 12 行顯示所有的圖像。可以用這條回歸直線預(yù)測可能的 (x, y)
數(shù)據(jù)對。
圖 7:線性回歸散點(diǎn)圖 1
圖 8 是使用 SciPy 進(jìn)行線性回歸的程序代碼。
圖 8:使用 SciPy 進(jìn)行線性回歸
下面我解釋一下這個程序的工作原理。第 1 行和第 2 行導(dǎo)入庫 NumPy 和 Matplotlib。第 3 行從庫 SciPy 導(dǎo)入 stats 模塊。第 4 到 8 行與前面的程序執(zhí)行類似的任務(wù)。第 9 行使用 SciPy 的 stats 模塊的 linregression()
函數(shù)計算兩組測量值的線性最小二乘回歸——在本例中是數(shù)組 x
和 y
中的值。該函數(shù)返回值中的 m
和 c
分別表示回歸直線的 斜率slope和截距intercept。第 10 行使用斜率和截距的值生成回歸線。第 11 行用綠色繪制回歸線。最后,第 12 行顯示所有的圖像(見圖 9),其中數(shù)據(jù)點(diǎn)以黃色顯示,回歸線以綠色顯示。
圖 9:線性回歸散點(diǎn)圖 2
在本系列的前面幾篇文章中,我們學(xué)習(xí)了概率和統(tǒng)計學(xué)的一些概念。盡管還不夠全面的,但我認(rèn)為這已經(jīng)打下了一個良好的基礎(chǔ),現(xiàn)在是時候?qū)⒆⒁饬D(zhuǎn)移到其他同樣重要的問題上了。
Keras 簡介
Keras 一般與 TensorFlow 一起使用。因此,我們先從使用 TensorFlow 開始。圖 10 所示的程序雖然只包含四行代碼,但確實(shí)構(gòu)建了在本系列中的第一個神經(jīng)網(wǎng)絡(luò)。下面我來介紹它的工作原理。第 1 行導(dǎo)入庫 TensorFlow。第 2 行創(chuàng)建了一個名為 x
的張量。第 3 行和第 4 行分別在張量 x
上應(yīng)用 ReLU(整流線性單元Rectified Linear Unit)和 Leaky ReLU 激活函數(shù)。在神經(jīng)網(wǎng)絡(luò)中,激活函數(shù)定義了節(jié)點(diǎn)的輸出由輸入計算出的規(guī)則。ReLU 激活函數(shù)是定義為 Relu(x) = max(0,x)
。第 3 行代碼的輸出如圖 10 所示。可以觀察到,在應(yīng)用 ReLU 激活函數(shù)后,張量 x
中的負(fù)值被替換為零。Leaky ReLU 是 ReLU 激活函數(shù)的改進(jìn)版本。從圖 10 中的第 4 行代碼的輸出可以看出 Leaky ReLU 激活函數(shù)保留了全量的正值和 20% 的負(fù)值。在后面我們將會繼續(xù)討論 Keras,同時學(xué)習(xí)更多神經(jīng)網(wǎng)絡(luò)和激活函數(shù)的知識。
圖 10:使用 TensorFlow 實(shí)現(xiàn)的神經(jīng)網(wǎng)絡(luò)
下面我們開始使用 Keras。Keras 的安裝也可以通過 Anaconda Navigator 輕松完成。圖 11 所示的程序?qū)肓宋覀兊牡谝粋€數(shù)據(jù)集并顯示了其中的一個數(shù)據(jù)樣本。在下一篇文章中,我們將使用這個數(shù)據(jù)集來訓(xùn)練和測試模型,從而開啟我們開發(fā)人工智能和機(jī)器學(xué)習(xí)程序的下一個階段。
圖 11:第一個數(shù)據(jù)集
下面介紹這個程序的工作原理。第 1 行導(dǎo)入 Keras。第 2 行從 Keras 導(dǎo)入手寫數(shù)字?jǐn)?shù)據(jù)集 MNIST。它包含 6 萬個訓(xùn)練樣本和 1 萬個測試樣本。第 3 行導(dǎo)入 Matplotlib。第 5 行加載 MNIST 數(shù)據(jù)集。第 6 到 9 行打印訓(xùn)練集和測試集的維數(shù)和維度。圖 12 顯示了這些代碼行的輸出??梢钥闯?,訓(xùn)練集和測試集都是三維的,所有數(shù)據(jù)樣本的分辨率都是 28 × 28。第 10 行加載了第 1234 個訓(xùn)練圖像。第 11 行和第 12 行顯示這個圖像。從圖 12 可以看到它是數(shù)字 3 的手寫圖像。
圖 12:數(shù)據(jù)樣例
本文中我們開始涉及到神經(jīng)網(wǎng)絡(luò),并通過 Keras 接觸到了第一個數(shù)據(jù)集。在下一篇文章中,我們將繼續(xù)講解神經(jīng)網(wǎng)絡(luò)和 Keras,并通過使用該數(shù)據(jù)集訓(xùn)練自己的模型。我們還會遇到 scikit-learn, 它是另一個強(qiáng)大的機(jī)器學(xué)習(xí) Python 庫 。