iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 6
2
AI & Data

輕鬆掌握 Keras 及相關應用系列 第 6

Day 06:Keras 模型結構

前言

從這篇起,我們就Keras各部分的功能進行研究,包括:

  1. 模型結構
  2. 執行工作記錄(Callback 及 TensorBoard)
  3. Dataset
  4. Estimator
  5. TF Serving 等等。

模型結構

Keras 的模型建立分兩種:

  1. Sequential model:一層層順序執行的簡單模型,只有第一層要寫input的規格,其他層的input就是上一層的output。
  2. Functional API model:可以有多個 input 層或 output 層,結構可以有分叉,適合複雜的模型建立。

以下分別說明 Sequential/Functional API model 語法,檔案名稱為 06_01_Model.ipynb。

Sequential model

建立Sequential model的程式片段如下:

# 建立模型
model = tf.keras.models.Sequential([
  tf.keras.layers.Flatten(input_shape=(28, 28)),
  tf.keras.layers.Dense(128, activation='relu'),
  tf.keras.layers.Dropout(0.2),
  tf.keras.layers.Dense(10, activation='softmax')
])

使用下列程式碼,可繪製出結構圖。

# 需安裝 graphviz (https://www.graphviz.org/download/)
# 將安裝路徑 C:\Program Files (x86)\Graphviz2.38\bin 新增至環境變數 path 中
# pip install graphviz
# pip install pydotplus
tf.keras.utils.plot_model(model, to_file='model.png')

https://ithelp.ithome.com.tw/upload/images/20200905/20001976ciIyQFtbgv.png

Functional API model

建立Functional API model的程式片段如下:

# 建立模型
from tensorflow.keras.layers import Dense
from tensorflow.keras.models import Model

InputTensor = tf.keras.Input(shape=(100,))
H1 = Dense(10, activation='relu')(InputTensor)
H2 = Dense(20, activation='relu')(H1)
Output = Dense(1, activation='softmax')(H2)

model_API = Model(inputs=InputTensor, outputs=Output)

model_API.summary()

from keras.utils import plot_model
tf.keras.utils.plot_model(model_API, to_file='Functional_API_model.png')
])

繪製出結構圖如下:
https://ithelp.ithome.com.tw/upload/images/20200905/20001976c6rDybZ1UL.png

舉例說明,以下表示 H1 layer 接在 InputTensor layer 後面,H2 layer 接在 H1 layer 後面。

H1 = Dense(10, activation='relu')(InputTensor)
H2 = Dense(20, activation='relu')(H1)

之後,必須指定Model的input/output,模型建立才算完成,如下:

model_API = Model(inputs=InputTensor, outputs=Output)

有分叉的 Functional API model

看一個LSTM的模型,它具有3個Input及2個Output,中間2個LSTM與1個Input合併():

from tensorflow.keras import layers

num_tags = 12  # Number of unique issue tags
num_words = 10000  # Size of vocabulary obtained when preprocessing text data
num_departments = 4  # Number of departments for predictions

title_input = keras.Input(
    shape=(None,), name="title"
)  # Variable-length sequence of ints
body_input = keras.Input(shape=(None,), name="body")  # Variable-length sequence of ints
tags_input = keras.Input(
    shape=(num_tags,), name="tags"
)  # Binary vectors of size `num_tags`

# Embed each word in the title into a 64-dimensional vector
title_features = layers.Embedding(num_words, 64)(title_input)
# Embed each word in the text into a 64-dimensional vector
body_features = layers.Embedding(num_words, 64)(body_input)

# Reduce sequence of embedded words in the title into a single 128-dimensional vector
title_features = layers.LSTM(128)(title_features)
# Reduce sequence of embedded words in the body into a single 32-dimensional vector
body_features = layers.LSTM(32)(body_features)

# Merge all available features into a single large vector via concatenation
x = layers.concatenate([title_features, body_features, tags_input])

# Stick a logistic regression for priority prediction on top of the features
priority_pred = layers.Dense(1, name="priority")(x)
# Stick a department classifier on top of the features
department_pred = layers.Dense(num_departments, name="department")(x)

# Instantiate an end-to-end model predicting both priority and department
model = keras.Model(
    inputs=[title_input, body_input, tags_input],
    outputs=[priority_pred, department_pred],
)

# show_shapes=True:Layer 含 Input/Output 資訊
tf.keras.utils.plot_model(model, "multi_input_and_output_model.png", show_shapes=True)

繪製出結構圖如下:
https://ithelp.ithome.com.tw/upload/images/20200906/20001976DIdAs4GS4t.png

下列指令合併3個layers,他們的output維度大小分別為 128/32/12,故合併後output=128+32+12=172。

layers.concatenate([title_features, body_features, tags_input])

下列指令Model的input/output有3個Input及2個Output:

model = keras.Model(
    inputs=[title_input, body_input, tags_input],
    outputs=[priority_pred, department_pred],
)

結論

總而言之,如果是一層層順序執行的簡單模型,就使用Sequential model,反之,需要彈性就使用Functional API model就對了。

本篇範例包括06_01_Model.ipynb,可自【這裡】下載。


上一篇
Day 05:神經網路的效能調校(續)
下一篇
Day 07:Keras Callback 的使用
系列文
輕鬆掌握 Keras 及相關應用30

尚未有邦友留言

立即登入留言