Keras中最常用的函數式API(非常好)

眾所周知,利用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作為數組:


<code>from keras.models import Sequential
from keras.layers import Dense
model = Sequential([Dense(2, input_dim=1), Dense(1)])
/<code>


層也可以分段添加:


<code>from keras.models import Sequential
from keras.layers import Dense
model = Sequential()
model.add(Dense(2, input_dim=1))
model.add(Dense(1))

/<code>


序貫模型的API在大多數情況下非常適合開發深度學習模型,但也有一些限制。例如,它不能定義具有多個不同輸入源的模型,因為那樣會產生多個輸出目標。

2.Keras功能函數模型

Keras功能API為定義模型提供了更靈活的方式。

它允許你定義多個輸入或輸出的模型以及可以共享圖層的模型。除此之外,它還允許你定義臨時的非循環網絡圖。

模型通過創建層的實例並將它們直接彼此成對連接來定義,然後定義一個模型,該模型的指定層作為模型的輸入和輸出。

我們來看看Keras功能API的三個獨特方面:

2.1定義輸入

與Sequential模型不同,你必須創建並定義一個獨立的輸入層,該層指定輸入數據的形狀。

輸入層採用一個模型參數,它是一個代表輸入數據維度的元組。

當輸入數據為一維時,例如對於多層感知器,該模型必須明確留出在訓練網絡分割數據時所使用的小批量大小的形狀。因此,模型元組始終以掛起的最後一維(2)定義,例如:

from keras.layers import Input

visible = Input(shape=(2,))

2.2連接層

模型中的層可以成對連接,這是通過在定義每個新圖層時指定輸入來自哪裡。使用括號符號,使得在創建圖層之後,指定從當前圖層的輸入到即將到達的圖層。

讓我們用一個簡單的例子來說明這一點。我們可以創建如上所述的輸入層,然後創建一個隱藏層,作為僅從輸入層接收輸入的密集層。


<code>from keras.layers import Input
from keras.layers import Dense
visible = Input(shape=(2,))
hidden = Dense(2)(visible)
/<code>


正是通過這種連接層的方法,使功能API更具有靈活性。你可以看到開始定義ad-hoc圖層的特殊圖形變得多麼的容易。

2.3創建模型

創建模型所需的所有圖層並將其連接在一起後,接下來必須定義模型。與Sequential API一樣,該模型是你可以概述、擬合、評估和使用做出預測。

Keras提供了一個Model類,你可以使用它從創建的圖層時創建模型。它要求你需要指定輸入和輸出層。例如:


<code>from keras.models import Model
from keras.layers import Input
from keras.layers import Dense
visible = Input(shape=(2,))
hidden = Dense(2)(visible)
model = Model(inputs=visible, outputs=hidden)
/<code>


既然現在我們知道了Keras功能API的所有關鍵部分,我們通過定義一套不同的模型實踐一下我們的學習成果。

以下每個示例都是可執行的,並打印結構並創建圖表。我建議為你自己的模型做這個,這樣可以讓你清楚你的定義。

我希望這些示例可以為你在以後使用功能API定義自己的模型時提供了模板。

3.標準網絡模型

當開始使用功能API時,最好先了解一些關於標準神經網絡模型的定義。在本節中,我們將介紹定義一個簡單的多層感知器,卷積神經網絡和循環神經網絡。

這些例子將為以後理解更詳細的例子奠定基礎。

3.1多層感知器

在本節中,我們為二進制分類定義了一個多層Perceptron模型。該模型有10個輸入,3個隱藏層,10個神經元,輸出層有1個輸出。在每個隱藏層中使用整流線性激活函數,在輸出層使用S形激活函數進行二進制分類。


<code># Multilayer Perceptron
from keras.utils import plot_model
from keras.models import Model
from keras.layers import Input
from keras.layers import Dense
visible = Input(shape=(10,))
hidden1 = Dense(10, activation='relu')(visible)
hidden2 = Dense(20, activation='relu')(hidden1)
hidden3 = Dense(10, activation='relu')(hidden2)
output = Dense(1, activation='sigmoid')(hidden3)
model = Model(inputs=visible, outputs=output)
# summarize layers
print(model.summary())
# plot graph

plot_model(model, to_file='multilayer_perceptron_graph.png')
/<code>


運行示例打印網絡的結構:


<code>_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
input_1 (InputLayer) (None, 10) 0
_________________________________________________________________
dense_1 (Dense) (None, 10) 110
_________________________________________________________________
dense_2 (Dense) (None, 20) 220
_________________________________________________________________
dense_3 (Dense) (None, 10) 210
_________________________________________________________________
dense_4 (Dense) (None, 1) 11
=================================================================
Total params: 551
Trainable params: 551
Non-trainable params: 0
_________________________________________________________________
/<code>


模型圖的創建並保存到文件:

Keras中最常用的函數式API(非常好)

3.2卷積神經網絡

在本節中,我們將定義一個用於圖像分類的卷積神經網絡。

該模型接收黑白64×64圖像作為輸入,然後兩個卷積層和彙集層的序列作為特徵提取器,隨後是完全連接的層來解釋特徵,並且輸出層是具有S形激活函數。


<code># Convolutional Neural Network
from keras.utils import plot_model
from keras.models import Model
from keras.layers import Input
from keras.layers import Dense
from keras.layers.convolutional import Conv2D
from keras.layers.pooling import MaxPooling2D
visible = Input(shape=(64,64,1))
conv1 = Conv2D(32, kernel_size=4, activation='relu')(visible)
pool1 = MaxPooling2D(pool_size=(2, 2))(conv1)
conv2 = Conv2D(16, kernel_size=4, activation='relu')(pool1)
pool2 = MaxPooling2D(pool_size=(2, 2))(conv2)
hidden1 = Dense(10, activation='relu')(pool2)
output = Dense(1, activation='sigmoid')(hidden1)
model = Model(inputs=visible, outputs=output)
# summarize layers
print(model.summary())
# plot graph
plot_model(model, to_file='convolutional_neural_network.png')
/<code>


運行示例:


<code>_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
input_1 (InputLayer) (None, 64, 64, 1) 0
••••••
Total params: 8,933
Trainable params: 8,933
Non-trainable params: 0
________________________________________________________________
/<code>


模型圖的圖創建並保存到文件:

Keras中最常用的函數式API(非常好)

3.3循環神經網絡

在本節中,我們將定義一個LSTM循環神經網絡用於序列分類。

該模型是100個時間步長作為輸入,該模型具有單個LSTM隱藏層,用於從序列中提取特徵,然後是完全連接的層以解釋LSTM輸出,隨後是用於進行二進制預測的輸出層。


<code># Recurrent Neural Network
from keras.utils import plot_model
from keras.models import Model
from keras.layers import Input
from keras.layers import Dense
from keras.layers.recurrent import LSTM
visible = Input(shape=(100,1))
hidden1 = LSTM(10)(visible)
hidden2 = Dense(10, activation='relu')(hidden1)
output = Dense(1, activation='sigmoid')(hidden2)
model = Model(inputs=visible, outputs=output)
# summarize layers
print(model.summary())
# plot graph
plot_model(model, to_file='recurrent_neural_network.png')
/<code>


運行示例總結模型層。


<code>_________________________________________________________________
Layer (type) Output Shape Param #

=================================================================
•••••••
=================================================================
Total params: 601
Trainable params: 601
Non-trainable params: 0
_________________________________________________________________
/<code>


模型圖的創建並保存到文件:

Keras中最常用的函數式API(非常好)

4.共享層模型

多層可以共享一層的輸出。

例如,可能存在來自輸入的多個不同的特徵提取層,或者用於解釋特徵提取層輸出的多個層。

我們來看看這兩個例子。

4.1共享輸入層

在本節中,我們使用不同大小的內核定義多個卷積層來解釋圖像輸入。

該模型輸入採用大小為64×64像素的黑白圖像。有兩個CNN特徵提取子模型共享該輸入:第一個內核大小為4,第二個內核大小為8。這些特徵提取子模型的輸出被平坦化為向量,並連接成一個長向量,並傳遞到完全連接的層,以便在最終輸出層之前進行二進制分類。


<code># Shared Input Layer
from keras.utils import plot_model
from keras.models import Model
from keras.layers import Input
from keras.layers import Dense
from keras.layers import Flatten
from keras.layers.convolutional import Conv2D
from keras.layers.pooling import MaxPooling2D
from keras.layers.merge import concatenate
# input layer
visible = Input(shape=(64,64,1))
# first feature extractor
conv1 = Conv2D(32, kernel_size=4, activation='relu')(visible)
pool1 = MaxPooling2D(pool_size=(2, 2))(conv1)
flat1 = Flatten()(pool1)

# second feature extractor
conv2 = Conv2D(16, kernel_size=8, activation='relu')(visible)
pool2 = MaxPooling2D(pool_size=(2, 2))(conv2)
flat2 = Flatten()(pool2)
# merge feature extractors
merge = concatenate([flat1, flat2])
# interpretation layer
hidden1 = Dense(10, activation='relu')(merge)
# prediction output
output = Dense(1, activation='sigmoid')(hidden1)
model = Model(inputs=visible, outputs=output)
# summarize layers
print(model.summary())
# plot graph
plot_model(model, to_file='shared_input_layer.png')
/<code>

運行示例總結模型層。

<code>___________________________________________________________________
Layer (type) Output Shape Param # Connected to
===================================================================
•••••••••••••••••••••••
Total params: 415,045
Trainable params: 415,045
Non-trainable params: 0
___________________________________________________________________
/<code>

模型圖的被創建並保存到文件:

Keras中最常用的函數式API(非常好)

4.2共享特徵提取層

在本節中,我們使用兩個並行子模型解釋LSTM特徵提取器的輸出以進行序列分類。

模型的輸入是一個特徵為100的時間步長,具有10個存儲單元的LSTM層解釋該序列。第一種解釋模式是淺層的單層完全連接層,第二種是深層的3層模型。兩個解釋模型的輸出都被連接成一個長向量,傳遞給用於進行二進制預測的輸出層。

<code># Shared Feature Extraction Layer
from keras.utils import plot_model
from keras.models import Model
from keras.layers import Input
from keras.layers import Dense
from keras.layers.recurrent import LSTM
from keras.layers.merge import concatenate
# define input
visible = Input(shape=(100,1))
# feature extraction
extract1 = LSTM(10)(visible)
# first interpretation model
interp1 = Dense(10, activation='relu')(extract1)
# second interpretation model
interp11 = Dense(10, activation='relu')(extract1)
interp12 = Dense(20, activation='relu')(interp11)
interp13 = Dense(10, activation='relu')(interp12)
# merge interpretation
merge = concatenate([interp1, interp13])
# output
output = Dense(1, activation='sigmoid')(merge)
model = Model(inputs=visible, outputs=output)
# summarize layers
print(model.summary())
# plot graph
plot_model(model, to_file='shared_feature_extractor.png')
/<code>

運行示例總結模型層。

<code>___________________________________________________________________
Layer (type) Output Shape Param # Connected to
•••••••
Total params: 1,151
Trainable params: 1,151
Non-trainable params: 0
___________________________________________________________________
/<code>

模型圖被創建並保存到文件。

Keras中最常用的函數式API(非常好)

5.多個輸入和輸出模型

功能API也可用於開發具有多個輸入的更復雜的模型,可能具有不同的模態。它也可以用於開發產生多個輸出的模型。

我們將在本節中查看每個示例。

5.1多輸入模型

我們將開發一個圖像分類模型,它將兩個版本的圖像作為輸入,每個版本的大小不同。具體是黑白64×64版,彩色32×32版。單獨的特徵提取CNN模型在每個模型上運行,然後將兩個模型的結果連接起來進行解釋和最終預測。

請注意,在創建Model()實例時,我們將兩個輸入圖層定義為數組。

model = Model(inputs=[visible1, visible2], outputs=output)

完整的示例如下所示。

<code># Multiple Inputs
from keras.utils import plot_model
from keras.models import Model
from keras.layers import Input
from keras.layers import Dense
from keras.layers import Flatten
from keras.layers.convolutional import Conv2D
from keras.layers.pooling import MaxPooling2D
from keras.layers.merge import concatenate
# first input model
visible1 = Input(shape=(64,64,1))
conv11 = Conv2D(32, kernel_size=4, activation='relu')(visible1)
pool11 = MaxPooling2D(pool_size=(2, 2))(conv11)
conv12 = Conv2D(16, kernel_size=4, activation='relu')(pool11)
pool12 = MaxPooling2D(pool_size=(2, 2))(conv12)

flat1 = Flatten()(pool12)
# second input model
visible2 = Input(shape=(32,32,3))
conv21 = Conv2D(32, kernel_size=4, activation='relu')(visible2)
pool21 = MaxPooling2D(pool_size=(2, 2))(conv21)
conv22 = Conv2D(16, kernel_size=4, activation='relu')(pool21)
pool22 = MaxPooling2D(pool_size=(2, 2))(conv22)
flat2 = Flatten()(pool22)
# merge input models
merge = concatenate([flat1, flat2])
# interpretation model
hidden1 = Dense(10, activation='relu')(merge)
hidden2 = Dense(10, activation='relu')(hidden1)
output = Dense(1, activation='sigmoid')(hidden2)
model = Model(inputs=[visible1, visible2], outputs=output)
# summarize layers
print(model.summary())
# plot graph
plot_model(model, to_file='multiple_inputs.png')
/<code>

運行示例:

<code>___________________________________________________________________
Layer (type) Output Shape Param # Connected to
•••••••••
input_1 (InputLayer) (None, 64, 64, 1) 0
Total params: 49,699
Trainable params: 49,699
Non-trainable params: 0
___________________________________________________________________
/<code>

模型圖被創建並保存到文件。

Keras中最常用的函數式API(非常好)

5.2多輸出模型

在本節中,我們將開發出一種可以進行兩種不同類型預測的模型。給定一個特徵的100個時間步長的輸入序列,該模型將對序列進行分類並輸出具有相同長度的新序列。

LSTM層解釋輸入序列,並返回每個時間步長的隱藏狀態。第一個輸出模型創建一個堆棧的LSTM,解釋特徵,並進行二進制預測。第二個輸出模型使用相同的輸出層對每個輸入時間步長進行實值預測。


<code># Multiple Outputs
from keras.utils import plot_model
from keras.models import Model
from keras.layers import Input
from keras.layers import Dense
from keras.layers.recurrent import LSTM
from keras.layers.wrappers import TimeDistributed
# input layer
visible = Input(shape=(100,1))
# feature extraction
extract = LSTM(10, return_sequences=True)(visible)
# classification output
class11 = LSTM(10)(extract)
class12 = Dense(10, activation='relu')(class11)
output1 = Dense(1, activation='sigmoid')(class12)
# sequence output
output2 = TimeDistributed(Dense(1, activation='linear'))(extract)
# output
model = Model(inputs=visible, outputs=[output1, output2])
# summarize layers
print(model.summary())

# plot graph
plot_model(model, to_file='multiple_outputs.png')
/<code>

運行示例。


<code>___________________________________________________________________
Layer (type) Output Shape Param # Connected to
===================================================================
input_1 (InputLayer) (None, 100, 1) 0
___________________________________________________________________
········
Total params: 1,452
Trainable params: 1,452
Non-trainable params: 0
___________________________________________________________________
/<code>


模型圖的創建並保存到文件:

Keras中最常用的函數式API(非常好)

6.最佳做法

在本節中,我給你一些提示,以便在定義自己的模型時充分利用功能性API。

1.一致的變量名。對輸入(可見)和輸出層(輸出)使用相同的變量名稱,甚至可以使用隱藏層(hidden1,hidden2)。它將有助於正確地將事物聯繫起來。

2.查看圖層圖。始終打印模型摘要並查看圖層輸出,以確保模型按預期連接在一起。

3.查看圖表。創建一個模型圖的情節,並檢查它,以確保所有的東西都按照你的意圖放在一起。

4.命名圖層。你可以為查看模型圖的名稱和繪圖時使用的圖層分配名稱。例如:Dense(1,name ='hidden1')。

5.單獨的子模型。考慮分開子模型的發展,並將子模型結合在一起。


分享到:


相關文章: