Keras 3 API 文件 / 模型 (Models) API / 模型 (Model) 類別

模型 (Model) 類別

[原始碼]

Model 類別

keras.Model()

將層分組為具有訓練/推論功能的物件的模型。

有三種方法可以實例化 Model

使用「函數式 API」

您從 Input 開始,串聯層的調用以指定模型的前向傳遞,最後從輸入和輸出建立模型。

inputs = keras.Input(shape=(37,))
x = keras.layers.Dense(32, activation="relu")(inputs)
outputs = keras.layers.Dense(5, activation="softmax")(x)
model = keras.Model(inputs=inputs, outputs=outputs)

注意:僅支援字典、列表和輸入張量的元組。不支援巢狀輸入(例如,列表的列表或字典的字典)。

也可以使用中間張量建立新的函數式 API 模型。這讓您可以快速提取模型的子組件。

範例

inputs = keras.Input(shape=(None, None, 3))
processed = keras.layers.RandomCrop(width=128, height=128)(inputs)
conv = keras.layers.Conv2D(filters=32, kernel_size=3)(processed)
pooling = keras.layers.GlobalAveragePooling2D()(conv)
feature = keras.layers.Dense(10)(pooling)

full_model = keras.Model(inputs, feature)
backbone = keras.Model(processed, conv)
activations = keras.Model(conv, feature)

請注意,backboneactivations 模型不是使用 keras.Input 物件建立的,而是使用源自 keras.Input 物件的張量建立的。在底層,這些模型將共享層和權重,以便使用者可以訓練 full_model,並使用 backboneactivations 進行特徵提取。模型的輸入和輸出也可以是張量的巢狀結構,而建立的模型是標準的函數式 API 模型,支援所有現有的 API。

透過繼承 Model 類別

在這種情況下,您應該在 __init__() 中定義您的層,並且應該在 call() 中實作模型的前向傳遞。

class MyModel(keras.Model):
    def __init__(self):
        super().__init__()
        self.dense1 = keras.layers.Dense(32, activation="relu")
        self.dense2 = keras.layers.Dense(5, activation="softmax")

    def call(self, inputs):
        x = self.dense1(inputs)
        return self.dense2(x)

model = MyModel()

如果您繼承 Model,您可以在 call() 中選擇性地使用 training 引數 (布林值),您可以用它來指定訓練和推論中的不同行為。

class MyModel(keras.Model):
    def __init__(self):
        super().__init__()
        self.dense1 = keras.layers.Dense(32, activation="relu")
        self.dense2 = keras.layers.Dense(5, activation="softmax")
        self.dropout = keras.layers.Dropout(0.5)

    def call(self, inputs, training=False):
        x = self.dense1(inputs)
        x = self.dropout(x, training=training)
        return self.dense2(x)

model = MyModel()

建立模型後,您可以使用 model.compile() 設定模型的損失和指標,使用 model.fit() 訓練模型,或使用 model.predict() 來進行預測。

使用 Sequential 類別

此外,keras.Sequential 是一種特殊的模型,其中模型純粹是單輸入、單輸出層的堆疊。

model = keras.Sequential([
    keras.Input(shape=(None, None, 3)),
    keras.layers.Conv2D(filters=32, kernel_size=3),
])

[原始碼]

summary 方法

Model.summary(
    line_length=None,
    positions=None,
    print_fn=None,
    expand_nested=False,
    show_trainable=False,
    layer_range=None,
)

印出網路的字串摘要。

引數

  • line_length:印出行的總長度(例如,設定此值以使顯示適應不同的終端視窗大小)。
  • positions:每行中日誌元素的相對或絕對位置。如果未提供,則變為 [0.3, 0.6, 0.70, 1.]。預設為 None
  • print_fn:要使用的列印函數。預設情況下,印到 stdout。如果您的環境中 stdout 無法運作,請變更為 print。它將在摘要的每一行上被呼叫。您可以將其設定為自訂函數,以便捕捉字串摘要。
  • expand_nested:是否展開巢狀模型。預設為 False
  • show_trainable:是否顯示層是否可訓練。預設為 False
  • layer_range:一個包含 2 個字串的列表或元組,分別是起始層名稱和結束層名稱(兩者都包含在內),指示摘要中要列印的層的範圍。它也接受正規表示式模式,而不是精確的名稱。在這種情況下,開始述詞將是第一個符合 layer_range[0] 的元素,而結束述詞將是最後一個符合 layer_range[1] 的元素。預設情況下,None 會考慮模型的所有層。

引發

  • ValueError:如果在建立模型之前呼叫 summary()

[原始碼]

get_layer 方法

Model.get_layer(name=None, index=None)

根據其名稱(唯一)或索引檢索層。

如果同時提供了 nameindex,則 index 將優先。索引基於水平圖遍歷的順序(由下往上)。

引數

  • name:字串,層的名稱。
  • index:整數,層的索引。

傳回

層的實例。