Keras 3 API 文档 / 模型 API / 模型类

模型类

[source]

Model class

keras.Model()

一个将层分组到具有训练/推理功能的对象中的模型.

有三种方法可以实例化一个 Model:

使用"Functional 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)

注意:仅支持输入张量的字典、列表和元组.不支持嵌套输入(例如列表的列表或字典的字典).

还可以通过使用中间张量来创建新的 Functional 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 进行特征提取.模型的输入和输出可以是张量的嵌套结构,创建的模型是标准的 Functional 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),
])

[source]

summary method

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 考虑模型的所有层.

Raises

  • ValueError: 如果 summary() 在模型构建之前被调用.

[source]

get_layer method

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

基于层的名称(唯一)或索引检索层.

如果同时提供了 nameindex,index 将优先. 索引基于水平图遍历的顺序(自底向上).

参数: name: 字符串,层的名称. index: 整数,层的索引.

返回: 一个层实例.