keras中最常用深度學(xué)習(xí)的API
眾所周知,利用Keras-Python庫(kù)可以快速、輕松地創(chuàng)建屬于自己的深度學(xué)習(xí)的模型,今天我們就來(lái)介紹一些我們常用的API函數(shù)。
序貫?zāi)P?Sequential)API允許你為大多數(shù)問(wèn)題逐層的創(chuàng)建模型。它的局限性在于它不允許你創(chuàng)建共享層或者是具有多個(gè)輸入或輸出的模型。
Keras中的API函數(shù)是創(chuàng)建更多靈活性模型的替代方法,其中也包括創(chuàng)建更復(fù)雜的模型。
在本篇博客中,你將發(fā)現(xiàn)如何在Keras中使用靈活的API函數(shù)來(lái)定義深度學(xué)習(xí)模型。
閱讀完成后,你將知道:
- 連續(xù)的API和API函數(shù)之間的區(qū)別。
- 如何使用API函數(shù)定義簡(jiǎn)單的多層感知器,卷積神經(jīng)網(wǎng)絡(luò)和循環(huán)神經(jīng)網(wǎng)絡(luò)模型。
- 如何使用共享層和多個(gè)輸入和輸出定義更復(fù)雜的模型。
OK,讓我們開(kāi)始吧。
教程概述
本教程分為6部分:
- Keras序貫?zāi)P汀?/li>
- Keras功能函數(shù)模型。
- 標(biāo)準(zhǔn)網(wǎng)絡(luò)模型。
- 共享層模型。
- 多個(gè)輸入和輸出模型。
- ***練習(xí)。
1.Keras序貫?zāi)P?/strong>
Keras提供了一個(gè)Sequential模型的API。
這是創(chuàng)建深度學(xué)習(xí)模型的一種方法,其中創(chuàng)建了Sequential類的實(shí)例,并創(chuàng)建了模型圖層并將其添加其中。
例如,可以將層定義并傳遞給Sequential作為數(shù)組:
- 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))
序貫?zāi)P偷腁PI在大多數(shù)情況下非常適合開(kāi)發(fā)深度學(xué)習(xí)模型,但也有一些限制。例如,它不能定義具有多個(gè)不同輸入源的模型,因?yàn)槟菢訒?huì)產(chǎn)生多個(gè)輸出目標(biāo)。
2.Keras功能函數(shù)模型
Keras功能API為定義模型提供了更靈活的方式。
它允許你定義多個(gè)輸入或輸出的模型以及可以共享圖層的模型。除此之外,它還允許你定義臨時(shí)的非循環(huán)網(wǎng)絡(luò)圖。
模型通過(guò)創(chuàng)建層的實(shí)例并將它們直接彼此成對(duì)連接來(lái)定義,然后定義一個(gè)模型,該模型的指定層作為模型的輸入和輸出。
我們來(lái)看看Keras功能API的三個(gè)獨(dú)特方面:
2.1定義輸入
與Sequential模型不同,你必須創(chuàng)建并定義一個(gè)獨(dú)立的輸入層,該層指定輸入數(shù)據(jù)的形狀。
輸入層采用一個(gè)模型參數(shù),它是一個(gè)代表輸入數(shù)據(jù)維度的元組。
當(dāng)輸入數(shù)據(jù)為一維時(shí),例如對(duì)于多層感知器,該模型必須明確留出在訓(xùn)練網(wǎng)絡(luò)分割數(shù)據(jù)時(shí)所使用的小批量大小的形狀。因此,模型元組始終以掛起的***一維(2)定義,例如:
- from keras.layers import Input
- visible = Input(shape=(2,))
2.2連接層
模型中的層可以成對(duì)連接,這是通過(guò)在定義每個(gè)新圖層時(shí)指定輸入來(lái)自哪里。使用括號(hào)符號(hào),使得在創(chuàng)建圖層之后,指定從當(dāng)前圖層的輸入到即將到達(dá)的圖層。
讓我們用一個(gè)簡(jiǎn)單的例子來(lái)說(shuō)明這一點(diǎn)。我們可以創(chuàng)建如上所述的輸入層,然后創(chuàng)建一個(gè)隱藏層,作為僅從輸入層接收輸入的密集層。
- from keras.layers import Input
- from keras.layers import Dense
- visible = Input(shape=(2,))
- hidden = Dense(2)(visible)
正是通過(guò)這種連接層的方法,使功能API更具有靈活性。你可以看到開(kāi)始定義ad-hoc圖層的特殊圖形變得多么的容易。
2.3創(chuàng)建模型
創(chuàng)建模型所需的所有圖層并將其連接在一起后,接下來(lái)必須定義模型。與Sequential API一樣,該模型是你可以概述、擬合、評(píng)估和使用做出預(yù)測(cè)。
Keras提供了一個(gè)Model類,你可以使用它從創(chuàng)建的圖層時(shí)創(chuàng)建模型。它要求你需要指定輸入和輸出層。例如:
- 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)
既然現(xiàn)在我們知道了Keras功能API的所有關(guān)鍵部分,我們通過(guò)定義一套不同的模型實(shí)踐一下我們的學(xué)習(xí)成果。
以下每個(gè)示例都是可執(zhí)行的,并打印結(jié)構(gòu)并創(chuàng)建圖表。我建議為你自己的模型做這個(gè),這樣可以讓你清楚你的定義。
我希望這些示例可以為你在以后使用功能API定義自己的模型時(shí)提供了模板。
3.標(biāo)準(zhǔn)網(wǎng)絡(luò)模型
當(dāng)開(kāi)始使用功能API時(shí),***先了解一些關(guān)于標(biāo)準(zhǔn)神經(jīng)網(wǎng)絡(luò)模型的定義。在本節(jié)中,我們將介紹定義一個(gè)簡(jiǎn)單的多層感知器,卷積神經(jīng)網(wǎng)絡(luò)和循環(huán)神經(jīng)網(wǎng)絡(luò)。
這些例子將為以后理解更詳細(xì)的例子奠定基礎(chǔ)。
3.1多層感知器
在本節(jié)中,我們?yōu)槎M(jìn)制分類定義了一個(gè)多層Perceptron模型。該模型有10個(gè)輸入,3個(gè)隱藏層,10個(gè)神經(jīng)元,輸出層有1個(gè)輸出。在每個(gè)隱藏層中使用整流線性激活函數(shù),在輸出層使用S形激活函數(shù)進(jìn)行二進(jìn)制分類。
- # 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')
運(yùn)行示例打印網(wǎng)絡(luò)的結(jié)構(gòu):
- _________________________________________________________________
- 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
- _________________________________________________________________
模型圖的創(chuàng)建并保存到文件:
3.2卷積神經(jīng)網(wǎng)絡(luò)
在本節(jié)中,我們將定義一個(gè)用于圖像分類的卷積神經(jīng)網(wǎng)絡(luò)。
該模型接收黑白64×64圖像作為輸入,然后兩個(gè)卷積層和匯集層的序列作為特征提取器,隨后是完全連接的層來(lái)解釋特征,并且輸出層是具有S形激活函數(shù)。
- # 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')
運(yùn)行示例:
- _________________________________________________________________
- 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
- ________________________________________________________________
模型圖的圖創(chuàng)建并保存到文件:
3.3循環(huán)神經(jīng)網(wǎng)絡(luò)
在本節(jié)中,我們將定義一個(gè)LSTM循環(huán)神經(jīng)網(wǎng)絡(luò)用于序列分類。
該模型是100個(gè)時(shí)間步長(zhǎng)作為輸入,該模型具有單個(gè)LSTM隱藏層,用于從序列中提取特征,然后是完全連接的層以解釋LSTM輸出,隨后是用于進(jìn)行二進(jìn)制預(yù)測(cè)的輸出層。
- # 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')
運(yùn)行示例總結(jié)模型層。
- _________________________________________________________________
- Layer (type) Output Shape Param #
- =================================================================
- •••••••
- =================================================================
- Total params: 601
- Trainable params: 601
- Non-trainable params: 0
- _________________________________________________________________
模型圖的創(chuàng)建并保存到文件:
4.共享層模型
多層可以共享一層的輸出。
例如,可能存在來(lái)自輸入的多個(gè)不同的特征提取層,或者用于解釋特征提取層輸出的多個(gè)層。
我們來(lái)看看這兩個(gè)例子。
4.1共享輸入層
在本節(jié)中,我們使用不同大小的內(nèi)核定義多個(gè)卷積層來(lái)解釋圖像輸入。
該模型輸入采用大小為64×64像素的黑白圖像。有兩個(gè)CNN特征提取子模型共享該輸入:***個(gè)內(nèi)核大小為4,第二個(gè)內(nèi)核大小為8。這些特征提取子模型的輸出被平坦化為向量,并連接成一個(gè)長(zhǎng)向量,并傳遞到完全連接的層,以便在最終輸出層之前進(jìn)行二進(jìn)制分類。
- # 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')
運(yùn)行示例總結(jié)模型層。
- ___________________________________________________________________
- Layer (type) Output Shape Param # Connected to
- ===================================================================
- •••••••••••••••••••••••
- Total params: 415,045
- Trainable params: 415,045
- Non-trainable params: 0
- ___________________________________________________________________
模型圖的被創(chuàng)建并保存到文件:
4.2共享特征提取層
在本節(jié)中,我們使用兩個(gè)并行子模型解釋LSTM特征提取器的輸出以進(jìn)行序列分類。
模型的輸入是一個(gè)特征為100的時(shí)間步長(zhǎng),具有10個(gè)存儲(chǔ)單元的LSTM層解釋該序列。***種解釋模式是淺層的單層完全連接層,第二種是深層的3層模型。兩個(gè)解釋模型的輸出都被連接成一個(gè)長(zhǎng)向量,傳遞給用于進(jìn)行二進(jìn)制預(yù)測(cè)的輸出層。
- # 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')
運(yùn)行示例總結(jié)模型層。
- ___________________________________________________________________
- Layer (type) Output Shape Param # Connected to
- •••••••
- Total params: 1,151
- Trainable params: 1,151
- Non-trainable params: 0
- ___________________________________________________________________
模型圖被創(chuàng)建并保存到文件。
5.多個(gè)輸入和輸出模型
功能API也可用于開(kāi)發(fā)具有多個(gè)輸入的更復(fù)雜的模型,可能具有不同的模態(tài)。它也可以用于開(kāi)發(fā)產(chǎn)生多個(gè)輸出的模型。
我們將在本節(jié)中查看每個(gè)示例。
5.1多輸入模型
我們將開(kāi)發(fā)一個(gè)圖像分類模型,它將兩個(gè)版本的圖像作為輸入,每個(gè)版本的大小不同。具體是黑白64×64版,彩色32×32版。單獨(dú)的特征提取CNN模型在每個(gè)模型上運(yùn)行,然后將兩個(gè)模型的結(jié)果連接起來(lái)進(jìn)行解釋和最終預(yù)測(cè)。
請(qǐng)注意,在創(chuàng)建Model()實(shí)例時(shí),我們將兩個(gè)輸入圖層定義為數(shù)組。
- 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
- 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')
運(yùn)行示例:
- ___________________________________________________________________
- 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
- ___________________________________________________________________
模型圖被創(chuàng)建并保存到文件。
5.2多輸出模型
在本節(jié)中,我們將開(kāi)發(fā)出一種可以進(jìn)行兩種不同類型預(yù)測(cè)的模型。給定一個(gè)特征的100個(gè)時(shí)間步長(zhǎng)的輸入序列,該模型將對(duì)序列進(jìn)行分類并輸出具有相同長(zhǎng)度的新序列。
LSTM層解釋輸入序列,并返回每個(gè)時(shí)間步長(zhǎng)的隱藏狀態(tài)。***個(gè)輸出模型創(chuàng)建一個(gè)堆棧的LSTM,解釋特征,并進(jìn)行二進(jìn)制預(yù)測(cè)。第二個(gè)輸出模型使用相同的輸出層對(duì)每個(gè)輸入時(shí)間步長(zhǎng)進(jìn)行實(shí)值預(yù)測(cè)。
- # 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')
運(yùn)行示例。
- ___________________________________________________________________
- 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
- ___________________________________________________________________
模型圖的創(chuàng)建并保存到文件:
6.***做法
在本節(jié)中,我給你一些提示,以便在定義自己的模型時(shí)充分利用功能性API。
- 一致的變量名。對(duì)輸入(可見(jiàn))和輸出層(輸出)使用相同的變量名稱,甚至可以使用隱藏層(hidden1,hidden2)。它將有助于正確地將事物聯(lián)系起來(lái)。
- 查看圖層圖。始終打印模型摘要并查看圖層輸出,以確保模型按預(yù)期連接在一起。
- 查看圖表。創(chuàng)建一個(gè)模型圖的情節(jié),并檢查它,以確保所有的東西都按照你的意圖放在一起。
- 命名圖層。你可以為查看模型圖的名稱和繪圖時(shí)使用的圖層分配名稱。例如:Dense(1,name =’hidden1’)。
- 單獨(dú)的子模型。考慮分開(kāi)子模型的發(fā)展,并將子模型結(jié)合在一起。