眾所周知,利用Keras-Python庫可以快速、輕鬆地建立屬於自己的深度學習的模型,今天我們就來介紹一些我們常用的API函式。
序貫模型(Sequential)API允許你為大多數問題逐層的建立模型。它的侷限性在於它不允許你建立共享層或者是具有多個輸入或輸出的模型。
Keras中的API函式是建立更多靈活性模型的替代方法,其中也包括建立更復雜的模型。
在本篇部落格中,你將發現如何在Keras中使用靈活的API函式來定義深度學習模型。
閱讀完成後,你將知道:
1.連續的API和API函式之間的區別。
2.如何使用API函式定義簡單的多層感知器,卷積神經網路和迴圈神經網路模型。
3.如何使用共享層和多個輸入和輸出定義更復雜的模型。
OK,讓我們開始吧。
教程概述
本教程分為6部分:
1.Keras序貫模型。
2.Keras功能函式模型。
3.標準網路模型。
4.共享層模型。
5.多個輸入和輸出模型。
6.最佳練習。
1.Keras序貫模型
Keras提供了一個Sequential模型的API。
這是建立深度學習模型的一種方法,其中建立了Sequential類的例項,並建立了模型圖層並將其新增其中。
例如,可以將層定義並傳遞給Sequential作為陣列:
層也可以分段新增:
序貫模型的API在大多數情況下非常適合開發深度學習模型,但也有一些限制。例如,它不能定義具有多個不同輸入源的模型,因為那樣會產生多個輸出目標。
2.Keras功能函式模型
Keras功能API為定義模型提供了更靈活的方式。
它允許你定義多個輸入或輸出的模型以及可以共享圖層的模型。除此之外,它還允許你定義臨時的非迴圈網路圖。
模型通過建立層的例項並將它們直接彼此成對連線來定義,然後定義一個模型,該模型的指定層作為模型的輸入和輸出。
我們來看看Keras功能API的三個獨特方面:
2.1定義輸入
與Sequential模型不同,你必須建立並定義一個獨立的輸入層,該層指定輸入資料的形狀。
輸入層採用一個模型引數,它是一個代表輸入資料維度的元組。
當輸入資料為一維時,例如對於多層感知器,該模型必須明確留出在訓練網路分割資料時所使用的小批量大小的形狀。因此,模型元組始終以掛起的最後一維(2)定義,例如:
from keras.layers import Input
visible = Input(shape=(2,))
2.2連線層
模型中的層可以成對連線,這是通過在定義每個新圖層時指定輸入來自哪裡。使用括號符號,使得在建立圖層之後,指定從當前圖層的輸入到即將到達的圖層。
讓我們用一個簡單的例子來說明這一點。我們可以建立如上所述的輸入層,然後建立一個隱藏層,作為僅從輸入層接收輸入的密集層。
正是通過這種連線層的方法,使功能API更具有靈活性。你可以看到開始定義ad-hoc圖層的特殊圖形變得多麼的容易。
2.3建立模型
建立模型所需的所有圖層並將其連線在一起後,接下來必須定義模型。與Sequential API一樣,該模型是你可以概述、擬合、評估和使用做出預測。
Keras提供了一個Model類,你可以使用它從建立的圖層時建立模型。它要求你需要指定輸入和輸出層。例如:
既然現在我們知道了Keras功能API的所有關鍵部分,我們通過定義一套不同的模型實踐一下我們的學習成果。
以下每個示例都是可執行的,並列印結構並建立圖表。我建議為你自己的模型做這個,這樣可以讓你清楚你的定義。
我希望這些示例可以為你在以後使用功能API定義自己的模型時提供了模板。
3.標準網路模型
當開始使用功能API時,最好先了解一些關於標準神經網路模型的定義。在本節中,我們將介紹定義一個簡單的多層感知器,卷積神經網路和迴圈神經網路。
這些例子將為以後理解更詳細的例子奠定基礎。
3.1多層感知器
在本節中,我們為二進位制分類定義了一個多層Perceptron模型。該模型有10個輸入,3個隱藏層,10個神經元,輸出層有1個輸出。在每個隱藏層中使用整流線性啟用函式,在輸出層使用S形啟用函式進行二進位制分類。
執行示例列印網路的結構:
模型圖的建立並儲存到檔案:
3.2卷積神經網路
在本節中,我們將定義一個用於影像分類的卷積神經網路。
該模型接收黑白64×64影像作為輸入,然後兩個卷積層和彙集層的序列作為特徵提取器,隨後是完全連線的層來解釋特徵,並且輸出層是具有S形啟用函式。
執行示例:
模型圖的圖建立並儲存到檔案:
3.3迴圈神經網路
在本節中,我們將定義一個LSTM迴圈神經網路用於序列分類。
該模型是100個時間步長作為輸入,該模型具有單個LSTM隱藏層,用於從序列中提取特徵,然後是完全連線的層以解釋LSTM輸出,隨後是用於進行二進位制預測的輸出層。
執行示例總結模型層。
模型圖的建立並儲存到檔案:
4.共享層模型
多層可以共享一層的輸出。
例如,可能存在來自輸入的多個不同的特徵提取層,或者用於解釋特徵提取層輸出的多個層。
我們來看看這兩個例子。
4.1共享輸入層
在本節中,我們使用不同大小的核心定義多個卷積層來解釋影像輸入。
該模型輸入採用大小為64×64畫素的黑白影像。有兩個CNN特徵提取子模型共享該輸入:第一個核心大小為4,第二個核心大小為8。這些特徵提取子模型的輸出被平坦化為向量,並連線成一個長向量,並傳遞到完全連線的層,以便在最終輸出層之前進行二進位制分類。
執行示例總結模型層。
模型圖的被建立並儲存到檔案:
4.2共享特徵提取層
在本節中,我們使用兩個並行子模型解釋LSTM特徵提取器的輸出以進行序列分類。
模型的輸入是一個特徵為100的時間步長,具有10個儲存單元的LSTM層解釋該序列。第一種解釋模式是淺層的單層完全連線層,第二種是深層的3層模型。兩個解釋模型的輸出都被連線成一個長向量,傳遞給用於進行二進位制預測的輸出層。
執行示例總結模型層。
模型圖被建立並儲存到檔案。
5.多個輸入和輸出模型
功能API也可用於開發具有多個輸入的更復雜的模型,可能具有不同的模態。它也可以用於開發產生多個輸出的模型。
我們將在本節中檢視每個示例。
5.1多輸入模型
我們將開發一個影像分類模型,它將兩個版本的影像作為輸入,每個版本的大小不同。具體是黑白64×64版,彩色32×32版。單獨的特徵提取CNN模型在每個模型上執行,然後將兩個模型的結果連線起來進行解釋和最終預測。
請注意,在建立Model()例項時,我們將兩個輸入圖層定義為陣列。
model = Model(inputs=[visible1, visible2], outputs=output)
完整的示例如下所示。
執行示例。
模型圖的建立並儲存到檔案:
6.最佳做法
在本節中,我給你一些提示,以便在定義自己的模型時充分利用功能性API。
1.一致的變數名。對輸入(可見)和輸出層(輸出)使用相同的變數名稱,甚至可以使用隱藏層(hidden1,hidden2)。它將有助於正確地將事物聯絡起來。
2.檢視圖層圖。始終列印模型摘要並檢視圖層輸出,以確保模型按預期連線在一起。
3.檢視圖表。建立一個模型圖的情節,並檢查它,以確保所有的東西都按照你的意圖放在一起。
4.命名圖層。你可以為檢視模型圖的名稱和繪圖時使用的圖層分配名稱。例如:Dense(1,name ='hidden1')。
5.單獨的子模型。考慮分開子模型的發展,並將子模型結合在一起。
7.進一步閱讀
如果你對此有更深入的瞭解,本部分將提供有關該主題的更多資源。
1.順序模型API。
4.模型類功能API。
作者資訊:Dr. Jason Brownlee 是一名機器學習從業者,學術研究人員,致力於幫助開發人員從入門到精通機器學習。
本文由阿里云云棲社群組織翻譯。
文章原標題《keras-functional-api-deep-learning》
作者:Dr.Jason Brownlee譯者:虎說八道
文章為簡譯,更為詳細的內容,請檢視原文