Keras 3 API文档 / Models API / The Model class

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:一个包含两个字符串的列表或元组,即起始层名称和结束层名称(均包含在内),用于指示要打印在摘要中的层范围。它也接受正则表达式而不是精确名称。在这种情况下,起始谓词将是第一个匹配 layer_range[0] 的元素,结束谓词将是最后一个匹配 layer_range[1] 的元素。默认情况下,None 考虑模型的所有层。

引发

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

[源代码]

get_layer 方法

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

根据名称(唯一)或索引检索一个层。

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

参数

  • name:字符串,层的名称。
  • index:整数,层的索引。

返回

一个层实例。


[源代码]

get_state_tree 方法

Model.get_state_tree(value_format="backend_tensor")

检索模型变量的树状结构。

此方法允许检索不同的模型变量(可训练、不可训练、优化器和指标)。变量以嵌套字典格式返回,其中键对应于变量名称,值对应于变量的嵌套表示。

返回

  • dict:一个包含所请求变量的嵌套表示的字典。键是变量名称,值是相应的嵌套字典。
  • value_format"backend_tensor""numpy_array" 中的一个。作为嵌套状态树叶子返回的数组类型。

示例

model = keras.Sequential([
    keras.Input(shape=(1,), name="my_input"),
    keras.layers.Dense(1, activation="sigmoid", name="my_dense"),
], name="my_sequential")
model.compile(optimizer="adam", loss="mse", metrics=["mae"])
model.fit(np.array([[1.0]]), np.array([[1.0]]))
state_tree = model.get_state_tree()

返回的 state_tree 字典如下所示:

{
    'metrics_variables': {
        'loss': {
            'count': ...,
            'total': ...,
        },
        'mean_absolute_error': {
            'count': ...,
            'total': ...,
        }
    },
    'trainable_variables': {
        'my_sequential': {
            'my_dense': {
                'bias': ...,
                'kernel': ...,
            }
        }
    },
    'non_trainable_variables': {},
    'optimizer_variables': {
        'adam': {
                'iteration': ...,
                'learning_rate': ...,
                'my_sequential_my_dense_bias_momentum': ...,
                'my_sequential_my_dense_bias_velocity': ...,
                'my_sequential_my_dense_kernel_momentum': ...,
                'my_sequential_my_dense_kernel_velocity': ...,
            }
        }
    }
}

[源代码]

set_state_tree 方法

Model.set_state_tree(state_tree)

为模型的变量分配值。

此方法接受一个包含嵌套变量值的字典,该字典表示模型的状态树,并将其分配给模型的相应变量。字典键表示变量名称(例如,'trainable_variables''optimizer_variables'),值是包含变量路径及其相应值的嵌套字典。

参数

  • state_tree:一个表示模型状态树的字典。键是变量名称,值是表示变量路径及其值的嵌套字典。