用Keras編寫你的第一個神經網絡,用不了30行代碼

不妨瞭解神經網絡的簡單概述,並學習如何用Keras通過短短几行代碼編寫你的第一個神經網絡。

【51CTO.com快譯】回想起剛接觸AI時,我清楚地記得一些概念看起來有多難。閱讀神經網絡的簡單介紹常常碰到科學論文,裡面的公式有你從未見過的符號,但開始編寫第一個神經網絡實際上容易得多!

那麼神經網絡是什麼呢?

這個問題提得好!在自行用Python代碼編寫一個簡單的神經網絡之前,不妨介紹一下神經網絡以及為何它如此令人興奮!

HNC Software的聯合創始人Robert Hecht-Nielsen博士簡單地說。

……神經網絡是由許多簡單又高度互連的處理單元組成的計算系統,這些處理單元通過對外部輸入的動態狀態響應來處理信息。

——人工智能專家Maureen Caudill撰寫的《神經網絡入門:第一部分》,1989年2月

實際上,神經網絡是一組擅長識別信息或數據中模式的數學表達式。神經網絡通過一種模仿人類的感知來做到這點,但它不是像人類那樣查看圖片,而是表示以數字方式包含在Vector或Scalar中的信息(一個Vector只含一個數字)。

它通過層來傳遞該信息,一層的輸出充當下一層的輸入。經過這些層時,輸入通過權重和偏差加以修改,然後發送到激活函數以映射輸出。然後通過成本函數進行學習,該函數對實際輸出和所需輸出進行比較,這進而通過一種名為反向傳播的過程,幫助函數更改並調整權重和偏差,實現成本最小化。

對於我們實現的示例神經網絡,我們將使用MNIST數據集。


用Keras編寫你的第一個神經網絡,用不了30行代碼


圖1. MNIST樣本數據集

MNIST好比是“Hello World”數據集,因為它能夠非常簡明地演示神經網絡的功能。數據集由手寫數字組成,我們將訓練神經網絡識別和分類這些數字。

Keras登場

為了便於實現,我們將使用Keras框架。Keras是用Python編寫的一種高級API,它在TensorFlow和Theano等流行框架上運行,為機器學習從業人員提供了抽象層,以降低編寫神經網絡的固有複雜性。

建議你深入研究Keras說明文檔(https://keras.io/),以真正熟悉該API。另外強烈推薦Francois Chollet撰寫的《用Python做深度學習》一書,本教程的靈感源自此書。

該考驗GPU的時候了

我們在本教程中將使用Keras和TensorFlow後端,因此如果你尚未安裝其中任何一個,現在趕緊安裝,只需在終端中運行這些命令即可。如果你不單單想了解簡單的入門示例,最好搭建Anaconda環境,改用conda安裝以下內容。

pip3 install Keras 
pip3 install Tensorflow

你已安裝了第一個神經網絡所需的一切,現在打開常用的IDE,不妨導入我們所需的Python模塊!

from keras.datasets import mnist 
from keras import models
from keras import layers
from keras.utils import to_categorical

Keras有許多數據集可以用來幫助你學習,對我們來說幸好有MNIST這個數據集。Models和Layers這兩個模塊可幫助我們構建神經網絡,to_categorical用於數據編碼,不過稍後有詳細介紹。

我們已導入了所需的模塊,接下來應將數據集分成訓練集和測試集。只要用下面這一行即可完成。

(train_images, train_labels), (test_images, test_labels) = mnist.load_data() 

在該例子中,我們的神經網絡通過對其輸出與標記數據進行比較來學習。可以把這看成我們讓神經網絡猜測大量的手寫數字,然後將猜測結果與實際標籤進行比較。隨後饋入結果,幫助模型調整權重和偏差,以便實現總成本最小化。

訓練集和數據集已建好,現在我們準備構建模型。

network = models.Sequential()  

network.add(layers.Dense(784, activation='relu', input_shape=(28 * 28,)))
network.add(layers.Dense(784, activation='relu', input_shape=(28 * 28,)))network.add(layers.Dense(10, activation='softmax'))network.compile(optimizer='adam',
loss='categorical_crossentropy',
metrics=['accuracy'])

這看起來代碼有很多,但不妨分解一下。我們初始化名為network的順序模型。

network = models.Sequential() 

然後我們添加神經網絡層。針對該例子,我們將使用密集層。密集層是指,每個神經元從上一層的所有神經元接收輸入。[784]和[10]指輸出空間的維數,這好比是後續層的輸入數;由於我們試圖解決的分類問題有10種可能的類別(數字0至9),最後層的潛在輸出是10個單位。激活參數指我們想要使用的激活函數,實際上激活函數根據給定的輸入來計算輸出。 最後,28 * 28的輸入形狀是指圖片的像素寬度和高度。

network.add(layers.Dense(784, activation='relu', input_shape=(28 * 28,))) 
network.add(layers.Dense(784, activation='relu', input_shape=(28 * 28,)))
network.add(layers.Dense(10, activation='softmax'))

一旦模型定義完畢,並添加了神經網絡層,我們只需用所選擇的優化器、所選擇的損失函數以及想用來評估模型性能的度量標準來編譯該模型。

network.compile(optimizer='adam', 
loss='categorical_crossentropy',
metrics=['accuracy'])

恭喜!你剛構建了你的第一個神經網絡!

現在你可能仍有幾個問題,比如relu和softmax是什麼?adam又是誰?那些都是值得思考的問題……我們會在以後的文章中深入解釋這些問題。

將數據饋入到剛創建的模型之前,我們需要將輸入整形成模型可以讀取的格式。輸入的原始形狀是[60000,28,28],實際上代表60000個像素高度和寬度是28 x28的圖片。我們可以對數據進行整形,分為訓練[60000]圖片和測試[10000]圖片。

train_images = train_images.reshape((60000, 28 * 28)) 
train_images = train_images.astype('float32') / 255
test_images = test_images.reshape((10000, 28 * 28))
test_images = test_images.astype('float32') / 255

除了整形數據外,我們還需要編碼數據。針對該例子,我們將使用分類編碼,這實際上將許多特徵變成數值表示。

train_labels = to_categorical(train_labels) 
test_labels = to_categorical(test_labels)

我們的數據集已分成訓練集和測試集,而且模型經過編譯、數據經過整形和編碼,現在我們現在準備訓練神經網絡!為此,我們要調用fit函數,並傳遞所需的參數。

network.fit(train_images, train_labels, epochs=5, batch_size=128) 

我們傳遞訓練圖片及其標籤,另外傳遞輪次(epoch)和批大小(batch_size),前者表明了向後傳播和向前傳播的數量,後者表明了每個向後/向前傳播的訓練樣本數量。

我們還想要設置性能衡量參數,以便搞清楚這個模型的效果有多好。

test_loss, test_acc = network.evaluate(test_images, test_labels) 
print('test_acc:', test_acc, 'test_loss', test_loss)

大功告成!你剛編寫了自己的神經網絡,整形並編碼了數據集,並擬合了訓練的模型。如果你首次運行Python腳本,Keras會下載MNIST數據集,開始訓練5輪。


用Keras編寫你的第一個神經網絡,用不了30行代碼


使用測試輸出的訓練週期

你的測試準確度應該達到98%左右,這意味著模型運行測試時在98%的時間段內正確預測了數字,這對你的第一個神經網絡來說不賴!實際上,如果你的模型擬合過度/擬合不足,你希望同時查看測試結果和訓練結果,以便想出好主意。

鼓勵你調整一下層數、優化器、損失函數、輪次以及批大小,看看各自對模型的整體性能有何影響!

原文標題:Writing Your First Neural Net in Less Than 30 Lines of Code with Keras,作者:David Gündisch


分享到:


相關文章: