當前位置:
首頁 > 科技 > 如何使用Keras函數式API進行深度學習?

如何使用Keras函數式API進行深度學習?

圖:pixabay

原文來源:https://machinelearningmastery.com

作者:Jason Brownlee

「雷克世界」編譯:嗯~阿童木呀、多啦A亮

可以這樣說,Keras Python庫使得創建深度學習模型變得快速且簡單。

序列API使得你能夠為大多數問題逐層創建模型。當然它也是有局限性的,那就是它並不能讓你創建擁有共享層或具有多個輸入或輸出的模型。

Keras中的的函數式API是創建模型的另一種方式,它具有更多的靈活性,包括創建更為複雜的模型。

在本教程中,你將了解如何用Keras中更具靈活性的函數式API來定義深度學習模型。

完成本教程後,你將明白:

?序列API和函數式API之間的區別。

?如何使用函數式API定義簡單的多層感知器、卷積神經網路以及循環神經網路模型。

?如何定義具有共享層和多個輸入和輸出的更為複雜的模型。

教程概述

本教程涵蓋六部分內容,分別是:

1.Keras序列模型

2.Keras函數式模型

3.標準網路模型

4.共享層模型

5.多個輸入和輸出模型

6.最佳實踐

1. Keras序列模型

Keras提供了一個序列模型API。

這是一種創建深度學習模型的方法,其中創建了一個序列類的實例,還創建了模型層並將其添加到其中。

例如,可以將層定義為數組的形式並傳遞給序列:

from keras.models import Sequential

from keras.layers import Dense

model = Sequential([Dense(2, input_dim=1), Dense(1)])

另外,層也是可以分段添加的:

from keras.models import Sequential

from keras.layers import Dense

model = Sequential()

model.add(Dense(2, input_dim=1))

model.add(Dense(1))

可以這樣說,在大多數情況下,序列模型API是非常適合用於開發深度學習模型的,但同時也具有一定的局限性。

例如,定義一個可能具有多個不同輸入源、且能生成多個輸出目標或重用層的模型,並不是一件簡單的事情。

2.Keras函數式模型

Keras函數式API提供了定義模型的一種更為靈活的方式。

尤其是,它使得你能夠定義具有多個輸入或輸出以及共享層的模型。不僅如此,它還使得你能夠定義特定的非循環網路圖。

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

接下來了解一下Keras函數式API的三個獨特方面:

?定義輸入

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

輸入層接受一個形狀參數,即一個元組,它表示的是輸入數據的維數。。

如果輸入數據是一維的,例如多層感知器,那麼這個形狀必須能夠明確地為在訓練網路過程中進行分割數據時使用的小批量大小的形狀留下空間。因此,這個形狀數組總是用最後一個維度(2)定義,例如:

from keras.layers import Input

visible = Input(shape=(2,))

?連接層

模型中的層是成對連接的。

這是通過在定義每個新層時指定輸入的出處完成的。這裡使用括弧表示法,以便在創建層之後,就指定了來自當前層輸入出處的層。

讓我們用一個簡短的例子來說明這一點。我們可以如上所述那樣創建輸入層,然後創建一個隱藏層作為密集層,只接受來自輸入層的輸入。

from keras.layers import Input

from keras.layers import Dense

visible = Input(shape=(2,))

hidden = Dense(2)(visible)

注意可見性,在創建密集層之後,將輸入層的輸出作為輸入與密集的隱藏層進行連接。

就是這種方式能夠將各個層逐次連接起來,從而使得函數式API具有靈活性。例如,你可以看到開始定義層的臨時圖表是多麼容易。

?創建模型

在創建了所有模型層並將它們連接在一起之後,你就必須定義模型了。

與序列API一樣,模型是你可以進行總結、擬合、評估和用來進行預測的東西。

Keras提供了一個Model類,你可以使用它從已創建的層中創建一個模型。要求就是你只能指定輸入和輸出層。例如:

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)

既然我們已經了解Keras 函數式API的所有關鍵部分,那麼接下來我們就來定義一套不同的模型並就其做一些實踐。

每個示例都是可執行的,可展示結構並創建圖表的簡圖。這樣做的好處是,你可以清楚地知曉你所定義的是什麼。

我希望,在將來你想要使用函數式API定義自己的模型時,這些示例能夠為你提供模板。

3.標準網路模型

當開始使用函數式API時,最好先去了解一些標準的神經網路模型是如何進行定義的。

在本節中,我們將定義一個簡單的多層感知器、卷積神經網路和循環神經網路。

這些例子將為理解接下來更為詳細的示例奠定基礎。

?多層感知器

在本節中,我們定義了一個用於二元分類(binary classification)的多層感知器模型。

該模型有10個輸入、3個分別具有10、20和10個神經元的隱藏層、以及一個只有一個輸出的輸出層。在每個隱層中都使用了糾正線性激活函數(Rectified linear activation functions),而在輸出層中使用了一個sigmoid激活函數,以用於二元分類。

# 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')

運行該示例,展示出該網路的結構:

該模型圖的一個簡圖也被創建並保存到文件中。

多層感知器網路圖

?卷積神經網路

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

該模型接收一個規格為64×64的黑白圖像作為輸入,然後有一個卷積層和池化層的序列作為特徵提取器,隨後是一個用以解釋特徵的完全連接層,以及一個用於兩個類預測的sigmoid激活函數。

# Convolutional Neural Network

from keras.utils import plot_model

from keras.models import Model

from keras.layers import Input

from keras.layers import Dense

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')

運行該示例,總結模型層:

該模型圖的簡圖也被創建並保存到文件。

卷積神經網路圖

?循環神經網路

在本節中,我們將定義一個用於序列分類的長短型記憶循環神經網路。

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

# Recurrent Neural Network

from keras.utils import plot_model

from keras.models import Model

from keras.layers import Input

from keras.layers import Dense

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')

運行該示例,總結模型層。

該模型圖的簡圖也被創建並保存到文件。

循環神經網路圖

4.共享層模型

多個層可以共享來自一個層的輸出。

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

我們來看看這兩個例子。

?共享輸入層

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

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

# 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

# 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')

運行該示例,總結模型層。

該模型圖的簡圖也被創建並保存到文件。

具有共享輸入的神經網路圖

?共享特徵提取層

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

該模型的輸入是一個特徵的100個時間步長。一個具有10個記憶單元的LSTM層以解釋該序列。第一個解釋模型是一個淺的單完全連接層,第二個是一個深度3層模型。兩個解釋模型的輸出都被連接到一個長向量中,傳遞到輸出層用以進行二元預測。

# 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

# 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')

運行該示例,總結模型層。

該模型圖的簡圖也被創建並保存到文件。

共享特徵提取層的神經網路圖

5.多個輸入和輸出模型

函數式API也可用於開發具有多個輸入的更複雜的模型,可能具有不同的形式。它也可以用於開發產生多個輸出的模型。

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

?多輸入模型

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

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

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

完整的示例如下所示:

# 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

# 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')

運行該示例,總結模型層。

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

具有多個輸入的神經網路圖

?多輸出模型

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

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

# 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.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')

運行該示例,總結模型層。

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

具有多個輸出的神經網路圖

6.最佳實踐

在本節中,我會給你一些建議,以便在定義自己的模型時充分利用函數式API。

?一致的變數名:對輸入(可見)、輸出層(輸出),甚至是隱藏層(hidden1,hidden2)使用相同的變數名稱。它將有助於正確地將它們聯繫起來。

?回顧層總結:堅持歸納模型總結並回顧層輸出,以確保模型按預期那樣連接在一起。

?回顧圖表簡圖:堅持創建模型圖的簡圖,並對其進行回顧,以確保所有的東西都按照你的意願放在一起。

?命名層:你可以為在回顧模型圖的總結和簡圖時使用的層分配名稱。例如:Dense(1,命名 ='hidden1')。

?單獨的子模型:考慮分離子模型的開發,並在最後將子模型組合在一起。

更多內容

如果你想深入了解更多信息,以下將提供有關該主題的更多資源。

?序列模型API: https://keras.io/models/model/

?使用Keras 序列模型開始:https://keras.io/models/model/

?使用Keras函數型API開始:https://keras.io/models/model/

?模型類函數式API:https://keras.io/models/model/


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 雷克世界 的精彩文章:

李國傑院士:AI創業公司如何擺脫被收購的命運「附雷克世界專訪」
機器學習時代,企業如何應對?你需要克服這「三座大山」!
Google公布OpenFermion:量子計算機的開源軟體包
詳解Nervana最新開源深度強化學習庫Coach
KDnuggets整理最新機器學習必備十大入門演算法!都在這裡了

TAG:雷克世界 |