成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

如何使用Keras函數(shù)式API進(jìn)行深度學(xué)習(xí)?

CocoaChina / 3179人閱讀

摘要:可以這樣說(shuō),庫(kù)使得創(chuàng)建深度學(xué)習(xí)模型變得快速且簡(jiǎn)單。在本教程中,你將了解如何用中更具靈活性的函數(shù)式來(lái)定義深度學(xué)習(xí)模型。如何使用函數(shù)式定義簡(jiǎn)單的多層感知器卷積神經(jīng)網(wǎng)絡(luò)以及循環(huán)神經(jīng)網(wǎng)絡(luò)模型。

可以這樣說(shuō),Keras Python庫(kù)使得創(chuàng)建深度學(xué)習(xí)模型變得快速且簡(jiǎn)單。

序列API使得你能夠?yàn)榇蠖鄶?shù)問(wèn)題逐層創(chuàng)建模型。當(dāng)然它也是有局限性的,那就是它并不能讓你創(chuàng)建擁有共享層或具有多個(gè)輸入或輸出的模型。

Keras中的的函數(shù)式API是創(chuàng)建模型的另一種方式,它具有更多的靈活性,包括創(chuàng)建更為復(fù)雜的模型。

在本教程中,你將了解如何用Keras中更具靈活性的函數(shù)式API來(lái)定義深度學(xué)習(xí)模型。

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

?序列API和函數(shù)式API之間的區(qū)別。

?如何使用函數(shù)式API定義簡(jiǎn)單的多層感知器、卷積神經(jīng)網(wǎng)絡(luò)以及循環(huán)神經(jīng)網(wǎng)絡(luò)模型。

?如何定義具有共享層和多個(gè)輸入和輸出的更為復(fù)雜的模型。

教程概述

本教程涵蓋六部分內(nèi)容,分別是:

1.Keras序列模型

2.Keras函數(shù)式模型

3.標(biāo)準(zhǔn)網(wǎng)絡(luò)模型

4.共享層模型

5.多個(gè)輸入和輸出模型

6.較佳實(shí)踐

1. Keras序列模型

Keras提供了一個(gè)序列模型API。

這是一種創(chuàng)建深度學(xué)習(xí)模型的方法,其中創(chuàng)建了一個(gè)序列類的實(shí)例,還創(chuàng)建了模型層并將其添加到其中。

例如,可以將層定義為數(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))

可以這樣說(shuō),在大多數(shù)情況下,序列模型API是非常適合用于開(kāi)發(fā)深度學(xué)習(xí)模型的,但同時(shí)也具有一定的局限性。

例如,定義一個(gè)可能具有多個(gè)不同輸入源、且能生成多個(gè)輸出目標(biāo)或重用層的模型,并不是一件簡(jiǎn)單的事情。

2.Keras函數(shù)式模型

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

尤其是,它使得你能夠定義具有多個(gè)輸入或輸出以及共享層的模型。不僅如此,它還使得你能夠定義特定的非循環(huán)網(wǎng)絡(luò)圖。

模型是通過(guò)創(chuàng)建層的實(shí)例并將它們直接地成對(duì)相互連接來(lái)定義的,然后定義一個(gè)Model,指定層作為模型的輸入和輸出。

接下來(lái)了解一下Keras函數(shù)式API的三個(gè)獨(dú)特方面:

?定義輸入

與序列模型不同的是,你必須創(chuàng)建并定義一個(gè)獨(dú)立的輸入層來(lái)指定輸入數(shù)據(jù)的形狀。

輸入層接受一個(gè)形狀參數(shù),即一個(gè)元組,它表示的是輸入數(shù)據(jù)的維數(shù)。。

如果輸入數(shù)據(jù)是一維的,例如多層感知器,那么這個(gè)形狀必須能夠明確地為在訓(xùn)練網(wǎng)絡(luò)過(guò)程中進(jìn)行分割數(shù)據(jù)時(shí)使用的小批量大小的形狀留下空間。因此,這個(gè)形狀數(shù)組總是用最后一個(gè)維度(2)定義,例如:

from keras.layers import Input

visible = Input(shape=(2,))

?連接層

模型中的層是成對(duì)連接的。

這是通過(guò)在定義每個(gè)新層時(shí)指定輸入的出處完成的。這里使用括號(hào)表示法,以便在創(chuàng)建層之后,就指定了來(lái)自當(dāng)前層輸入出處的層。

讓我們用一個(gè)簡(jiǎn)短的例子來(lái)說(shuō)明這一點(diǎn)。我們可以如上所述那樣創(chuàng)建輸入層,然后創(chuàng)建一個(gè)隱藏層作為密集層,只接受來(lái)自輸入層的輸入。

from keras.layers import Input

from keras.layers import Dense

visible = Input(shape=(2,))

hidden = Dense(2)(visible)

注意可見(jiàn)性,在創(chuàng)建密集層之后,將輸入層的輸出作為輸入與密集的隱藏層進(jìn)行連接。

就是這種方式能夠?qū)⒏鱾€(gè)層逐次連接起來(lái),從而使得函數(shù)式API具有靈活性。例如,你可以看到開(kāi)始定義層的臨時(shí)圖表是多么容易。

?創(chuàng)建模型

在創(chuàng)建了所有模型層并將它們連接在一起之后,你就必須定義模型了。

與序列API一樣,模型是你可以進(jìn)行總結(jié)、擬合、評(píng)估和用來(lái)進(jìn)行預(yù)測(cè)的東西。

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

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)

既然我們已經(jīng)了解Keras 函數(shù)式API的所有關(guān)鍵部分,那么接下來(lái)我們就來(lái)定義一套不同的模型并就其做一些實(shí)踐。

每個(gè)示例都是可執(zhí)行的,可展示結(jié)構(gòu)并創(chuàng)建圖表的簡(jiǎn)圖。這樣做的好處是,你可以清楚地知曉你所定義的是什么。

我希望,在將來(lái)你想要使用函數(shù)式API定義自己的模型時(shí),這些示例能夠?yàn)槟闾峁┠0濉?/p>

3.標(biāo)準(zhǔn)網(wǎng)絡(luò)模型

當(dāng)開(kāi)始使用函數(shù)式API時(shí),較好先去了解一些標(biāo)準(zhǔn)的神經(jīng)網(wǎng)絡(luò)模型是如何進(jìn)行定義的。

在本節(jié)中,我們將定義一個(gè)簡(jiǎn)單的多層感知器、卷積神經(jīng)網(wǎng)絡(luò)和循環(huán)神經(jīng)網(wǎng)絡(luò)。

這些例子將為理解接下來(lái)更為詳細(xì)的示例奠定基礎(chǔ)。

?多層感知器

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

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

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

該模型圖的一個(gè)簡(jiǎn)圖也被創(chuàng)建并保存到文件中。

?

多層感知器網(wǎng)絡(luò)圖

?卷積神經(jīng)網(wǎng)絡(luò)

在本節(jié)中,我們將定義一個(gè)用于圖像分類的卷積神經(jīng)網(wǎng)絡(luò)。

該模型接收一個(gè)規(guī)格為64×64的黑白圖像作為輸入,然后有一個(gè)卷積層和池化層的序列作為特征提取器,隨后是一個(gè)用以解釋特征的完全連接層,以及一個(gè)用于兩個(gè)類預(yù)測(cè)的sigmoid激活函數(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)行該示例,總結(jié)模型層:

該模型圖的簡(jiǎn)圖也被創(chuàng)建并保存到文件。

卷積神經(jīng)網(wǎng)絡(luò)圖

?循環(huán)神經(jīng)網(wǎng)絡(luò)

在本節(jié)中,我們將定義一個(gè)用于序列分類的長(zhǎng)短型記憶循環(huán)神經(jīng)網(wǎng)絡(luò)。

該模型期望以一個(gè)特征的100個(gè)時(shí)間步長(zhǎng)作為輸入。該模型有一個(gè)多帶帶的LSTM隱藏層以從序列中提取特征,然后是一個(gè)完全連接層用以解釋LSTM輸出,接下來(lái)是一個(gè)用于進(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é)模型層。

該模型圖的簡(jiǎn)圖也被創(chuàng)建并保存到文件。

循環(huán)神經(jīng)網(wǎng)絡(luò)圖

4.共享層模型

多個(gè)層可以共享來(lái)自一個(gè)層的輸出。

例如,可能有多個(gè)不同的特征提取層是來(lái)自于同一個(gè)輸入的,或者有多個(gè)層是用于解釋來(lái)自一個(gè)特征提取層的輸出的。

我們來(lái)看看這兩個(gè)例子。

?共享輸入層

在本節(jié)中,我們定義了具有不同大小內(nèi)核的多個(gè)卷積層來(lái)解釋圖像輸入。

該模型采用大小為64×64像素的黑白圖像。有兩個(gè)CNN特征提取子模型共享該輸入; 第一個(gè)內(nèi)核大小為4,第二個(gè)內(nèi)核大小為8。這些特征提取子模型的輸出被壓縮成向量,連接到一個(gè)長(zhǎng)向量中,并傳遞到一個(gè)完全連接層,以便在最終輸出層進(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é)模型層。

該模型圖的簡(jiǎn)圖也被創(chuàng)建并保存到文件。

具有共享輸入的神經(jīng)網(wǎng)絡(luò)圖

?共享特征提取層

在本節(jié)中,我們將用兩個(gè)并行子模型來(lái)解釋LSTM特性提取器的輸出,以進(jìn)行序列分類。

該模型的輸入是一個(gè)特征的100個(gè)時(shí)間步長(zhǎng)。一個(gè)具有10個(gè)記憶單元的LSTM層以解釋該序列。第一個(gè)解釋模型是一個(gè)淺的單完全連接層,第二個(gè)是一個(gè)深度3層模型。兩個(gè)解釋模型的輸出都被連接到一個(gè)長(zhǎng)向量中,傳遞到輸出層用以進(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é)模型層。

該模型圖的簡(jiǎn)圖也被創(chuàng)建并保存到文件。

共享特征提取層的神經(jīng)網(wǎng)絡(luò)圖

5.多個(gè)輸入和輸出模型

函數(shù)式API也可用于開(kāi)發(fā)具有多個(gè)輸入的更復(fù)雜的模型,可能具有不同的形式。它也可以用于開(kāi)發(fā)產(chǎn)生多個(gè)輸出的模型。

?

我們將在本節(jié)中查看每個(gè)示例。

?

?多輸入模型

我們將開(kāi)發(fā)一個(gè)圖像分類模型,它將兩個(gè)版本的圖像作為輸入,每個(gè)版本的大小不同。具體是黑白64×64版本和彩色32×32版本。多帶帶的特征提取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)行該示例,總結(jié)模型層。

該模型圖的簡(jiǎn)圖被創(chuàng)建并保存到文件。

?

具有多個(gè)輸入的神經(jīng)網(wǎng)絡(luò)圖

?

?多輸出模型

在本節(jié)中,我們將開(kāi)發(fā)出一種可以進(jìn)行兩種不同類型預(yù)測(cè)的模型。給定一個(gè)特征的100時(shí)間步長(zhǎng)的輸入序列,該模型將對(duì)序列進(jìn)行分類并輸出具有相同長(zhǎng)度的新序列。

?

LSTM層解釋輸入序列,并返回每個(gè)時(shí)間步長(zhǎng)的隱藏狀態(tài)。第一個(gè)輸出模型創(chuàng)建一個(gè)堆棧LSTM,解釋特征,并進(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)行該示例,總結(jié)模型層。

該模型圖的簡(jiǎn)圖被創(chuàng)建并保存到文件。

?

具有多個(gè)輸出的神經(jīng)網(wǎng)絡(luò)圖

?

6.較佳實(shí)踐

在本節(jié)中,我會(huì)給你一些建議,以便在定義自己的模型時(shí)充分利用函數(shù)式API。

?

?一致的變量名:對(duì)輸入(可見(jiàn))、輸出層(輸出),甚至是隱藏層(hidden1,hidden2)使用相同的變量名稱。它將有助于正確地將它們聯(lián)系起來(lái)。

?回顧層總結(jié):堅(jiān)持歸納模型總結(jié)并回顧層輸出,以確保模型按預(yù)期那樣連接在一起。

?回顧圖表簡(jiǎn)圖:堅(jiān)持創(chuàng)建模型圖的簡(jiǎn)圖,并對(duì)其進(jìn)行回顧,以確保所有的東西都按照你的意愿放在一起。

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

?多帶帶的子模型:考慮分離子模型的開(kāi)發(fā),并在最后將子模型組合在一起。

歡迎加入本站公開(kāi)興趣群

商業(yè)智能與數(shù)據(jù)分析群

興趣范圍包括各種讓數(shù)據(jù)產(chǎn)生價(jià)值的辦法,實(shí)際應(yīng)用案例分享與討論,分析工具,ETL工具,數(shù)據(jù)倉(cāng)庫(kù),數(shù)據(jù)挖掘工具,報(bào)表系統(tǒng)等全方位知識(shí)

QQ群:81035754

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/4659.html

相關(guān)文章

  • 超干貨|使用Keras和CNN構(gòu)建分類器(內(nèi)含代碼和講解)

    摘要:我們?cè)谝呀?jīng)準(zhǔn)備好的圖像數(shù)據(jù)集上,使用庫(kù)訓(xùn)練一個(gè)卷積神經(jīng)網(wǎng)絡(luò)。示例包含用于測(cè)試卷積神經(jīng)網(wǎng)絡(luò)的圖像。訓(xùn)練,繪制準(zhǔn)確性損耗函數(shù),然后將卷積神經(jīng)網(wǎng)絡(luò)和類標(biāo)簽二進(jìn)制文件序列化到磁盤。第和行將訓(xùn)練集和測(cè)試集按照的比例進(jìn)行分割。 showImg(https://segmentfault.com/img/bV9lqk?w=698&h=698); 為了讓文章不那么枯燥,我構(gòu)建了一個(gè)精靈圖鑒數(shù)據(jù)集(Pok...

    shadowbook 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<