Keras函數式 API


用Keras定義網絡模型有兩種方式,

之前我們介紹了Sequential順序模型,今天我們來接觸一下 Keras 的函數式API模型

函數式API:全連接網絡

from keras.layers import Input, Dense
from keras.models import Model

# 這部分返回一個張量
inputs = Input(shape=(784,))

# 層的實例是可調用的,它以張量為參數,並且返回一個張量
x = Dense(64, activation='relu')(inputs)
x = Dense(64, activation='relu')(x)
predictions = Dense(10, activation='softmax')(x)

# 這部分創建了一個包含輸入層和三個全連接層的模型
model = Model(inputs=inputs, outputs=predictions)
model.compile(optimizer='rmsprop',
              loss='categorical_crossentropy',
              metrics=['accuracy'])
model.fit(data, labels,batch_size=32, epochs=5)  # 開始訓練

多輸入多輸出模型

主要負責用函數式API來實現它

主要輸入接收新聞標題本身,即一個整數序列(每個證書編碼一個詞),這些整數在1到10000之間(10000個詞的詞匯表),且序列長度為100個詞

from keras.layers import Input, Embedding, LSTM, Dense
from keras.models import Model

# 標題輸入:接收一個含有 100 個整數的序列,每個整數在 1 到 10000 之間。
# 注意我們可以通過傳遞一個 "name" 參數來命名任何層。
main_input = Input(shape=(100,), dtype='int32', name='main_input')

# Embedding 層將輸入序列編碼為一個稠密向量的序列,
# 每個向量維度為 512。
x = Embedding(output_dim=512, input_dim=10000, input_length=100)(main_input)

# LSTM 層把向量序列轉換成單個向量,
# 它包含整個序列的上下文信息
lstm_out = LSTM(32)(x)

在這里,我們插入輔助損失,即使在模型主損失很高的情況下,LSTM層和Embedding層都能被平穩地訓練。

auxiliary_output = Dense(1, activation='sigmoid', name='aux_output')(lstm_out)

此時,我們將輔助輸入數據與 LSTM 層的輸出連接起來,輸入到模型中:

auxiliary_input = Input(shape=(5,), name='aux_input')
x = keras.layers.concatenate([lstm_out, auxiliary_input])

# 堆疊多個全連接網絡層
x = Dense(64, activation='relu')(x)
x = Dense(64, activation='relu')(x)
x = Dense(64, activation='relu')(x)

# 最后添加主要的邏輯回歸層
main_output = Dense(1, activation='sigmoid', name='main_output')(x)

然后定義一個具有兩個輸入和兩個輸出的模型:

model = Model(inputs=[main_input, auxiliary_input], outputs=[main_output, auxiliary_output])

現在編譯模型,並給輔助損失分配一個 0.2 的權重。如果要為不同的輸出指定不同的 loss_weights 或 loss,可以使用列表或字典。 在這里,我們給 loss 參數傳遞單個損失函數,這個損失將用於所有的輸出。

model.compile(optimizer='rmsprop', loss='binary_crossentropy',
              loss_weights=[1., 0.2])

我們可以通過輸入數組和目標數組列表來訓練模型:

model.fit([headline_data, additional_data], [labels, labels],
          epochs=50, batch_size=32)

由於輸入和輸出均被命名了(在定義時傳遞了一個 name 參數),我們也可以通過以下方式編譯模型:

model.compile(optimizer='rmsprop',
              loss={'main_output': 'binary_crossentropy', 'aux_output': 'binary_crossentropy'},
              loss_weights={'main_output': 1., 'aux_output': 0.2})

# 然后使用以下方式訓練:
model.fit({'main_input': headline_data, 'aux_input': additional_data},
          {'main_output': labels, 'aux_output': labels},
          epochs=50, batch_size=32)

共享網絡層

函數API的另一個用途是使用共享網絡層的模型。

比如我們想建立一個模型來分辨兩條推文是否來自同一個人,實現這個目標的方法是:將兩條推文編碼層兩個向量,連接向量,然后添加邏輯回歸層;這將輸出推文來自通一個作者的概率。模型將接受一對對正負表示的推特數據。

太難了,我理解不了。以后這條博客慢慢更新。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM