首頁>技術>

翻譯:陳丹

校對:和中華

本文長度為3000字,建議閱讀5分鐘

本文為大家介紹了如何使用Keras來快速實現一個神經網路。

回憶起我第一次接觸人工智慧的時候,我清楚地記得有些概念看起來是多麼令人畏懼。閱讀一個關於神經網路是什麼的簡單解釋時,很容易閱讀到的是一篇科學論文,其中每一句話都是一個包含很多你從未見過的符號的公式。雖然這些論文有著令人難以置信的洞察力和深度可以幫助你建立你的專業知識,但是開始寫你的第一個神經網路其實比那些聽起來容易得多!

那到底什麼是神經網路呢?

好問題!在我們開始用Python編寫實現一個簡單的神經網路(簡稱為NN)之前,我們或許應該先明白它們是什麼,以及為什麼它們如此令人興奮!

HNC軟體公司的聯合創始人羅伯特·赫克特尼爾森博士把它解釋得很簡單。

一個由許多簡單、高度互連的處理元素組成的計算系統,這些元素通過對外部輸入的動態響應來處理資訊。——“神經網路入門:第一部分”,Maureen Caudill,人工智慧專家,1989年2月。

從本質上講,神經網路是一組非常擅長識別資訊或資料模式的數學表示式。神經網路通過一種模擬人類感知的方法來實現這一點,但是神經網路並不像人類那樣“看到”或“描述”影象,而是用包含數字的向量或標量(僅包含一個數字的向量)來表示這些資訊。

它通過多個將上一層的輸出作為下一層的輸入的層來傳遞這些資訊。當通過這些層時,輸入的資訊將被權重和偏差修改,並被髮送到啟用函式以對映輸出。然後,學習通過一個成本函式進行,該函式比較實際輸出和期望輸出,進而幫助該函式通過一個稱為反向傳播的過程來改變和調整權重和偏差,以最小化成本。

我們的NN實現示例將使用MNIST資料集。

MNIST樣本資料集

MNIST可以被視為“hello world”資料集,因為它能夠非常簡潔地演示神經網路的功能。資料集由手寫數字組成,我們將訓練神經網路來對它們進行識別和分類。

進入drago…我是說Keras。

為了便於實施,我們將使用Keras框架。Keras是一個用Python編寫的高階API,它執行在諸如TensorFlow、Theano等流行框架之上,為機器學習實踐者提供了一個抽象層,以減少編寫NNS的固有複雜性。

我鼓勵你們深入研究Keras文件,以便真正熟悉API。此外,我強烈推薦francois chollet的《python深度學習》一書,它激發了本教程的靈感。

是時候燒點GPU了

在本教程中,我們將把tensorflow作為後端來使用keras,因此如果您還沒有安裝其中任何一個,現在是這樣做的好時機。您只需在終端中執行這些命令就可以實現這一點。

當您超出簡單的介紹性示例時,最好設定您的Anaconda環境並用conda安裝下面的內容。

既然您已經安裝了位於您和第一個NN之間需要的所有元件,那麼接下來就開啟您最喜歡的IDE,讓我們開始匯入所需的Python模組!

Keras有很多資料集可以用來幫助你學習,幸運的是我們的MNIST就是其中之一!模型和層都是將幫助我們建立我們的神經網路的模組,to_categorical用於我們的資料編碼…稍後再詳細介紹!

現在我們已經匯入了所需的模組,我們想要將資料集拆分為訓練集和測試集。這可以通過以下幾行簡單地完成。

在這個例子中,我們的神經網路通過比較它的輸出和標記的資料來學習。你可以理解為我們讓神經網路猜測大量的手寫數字,然後將猜測結果與實際標籤進行比較,然後將比較結果反饋到模型,調整權重和偏差,以最小化總體成本。

建立好測試集和訓練集後,現在就可以構建我們的模型了。

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

個人理解這裡是作者失誤了,通常只有第一層才需要明確input_shape, 後續層都是Keras自動計算資料形狀的。

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

我知道…我知道…看起來好像很多,但讓我們一起分解它!我們初始化一個稱為網路的序列模型。

我們加上神經網路層。在本例中,我們將使用dense層(即全連線神經網路層)。一個dense層僅僅意味著每個神經元接收來自前一層所有神經元的輸入。[784]和[10]指的是輸出空間的維數,我們可以把它看作是後續層的輸入數量,由於我們試圖解決一個有10個可能類別(數字0到9)的分類問題,最後一層有10個單位的潛在輸出。啟用引數是指我們想要使用的啟用函式,實際上,啟用函式將根據給定的輸入計算輸出。最後,[28*28]的輸入形狀是指影象的畫素寬度和高度。

一旦我們定義好了模型,並且添加了我們的NN層,我們只需使用我們選擇的優化器、我們選擇的損失函式和我們想要用來判斷模型效能的度量來編譯模型。

祝賀!你已經構建了你的第一個神經網路!

現在你可能還有一些問題,比如:什麼是relu和softmax?到底什麼是Adam?這些都是很好的問題……對這些問題的深入解釋稍微超出了我們NN的入門範圍,但我們將在後面的文章中討論這些問題。

在我們將資料輸入到新建立的模型之前,我們需要將輸入重塑為模型可以讀取的格式。我們輸入的原始形狀是[60000,28,28],它基本上表示60000個畫素高和寬為28 x 28的影象。我們可以重塑我們的資料,並將其分為[60000]個訓練影象和[10000]個測試影象。

除了重塑我們的資料,我們還需要對其進行編碼。在本例中,我們將使用分類編碼,這在本質上轉換了數字表示中的許多特徵。

當我們的資料集被分割成訓練和測試集,我們的模型被編譯,我們的資料被重塑和編碼後,我們現在可以準備訓練我們的神經網路了!為此,我們將呼叫fit函式並傳入所需的引數。

我們傳入訓練影象、標籤以及遍歷次數(反向和正向傳播數量)和批大小(每次反向/正向傳播的訓練樣本數量)。

我們還需要設定效能度量引數,以便評估模型的工作情況。

瞧!你剛剛構建了你自己的神經網路,重塑和編碼了一個數據集,並且訓練了你的模型!當您第一次執行python指令碼時,keras將下載mnist資料集並將遍歷訓練5次!

你的測試準確率應該在98%左右,這意味著模型在執行測試時預測正確了98%的數字,對你的第一個nn來說還不錯!在實踐中,您需要檢視測試和訓練結果,以了解您的模型是否過擬合/欠擬合。

我鼓勵您調整層數、優化器和損失函式,以及遍歷次數和批大小,看看它們對您的模型的總體效能有什麼影響!

在漫長而激動人心的學習之旅中,你剛剛邁出了艱難的第一步!請隨時聯絡任何其他澄清或反饋!

原文標題:

Writing Your First Neural Net in Less Than 30 Lines of Code with Keras

原文連結:

https://www.kdnuggets.com/2019/10/writing-first-neural-net-less-30-lines-code-keras.html

校對:林亦霖

譯者簡介

陳丹,復旦大學大三在讀,主修預防醫學,輔修資料科學。對資料分析充滿興趣,但初入這一領域,還有很多很多需要努力進步的空間。希望今後能在翻譯組進行相關工作的過程中拓展文獻閱讀量,學習到更多的前沿知識,同時認識更多有共同志趣的小夥伴!

— 完 —

  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • python+django搭建web專案