菜单

模型构建API

相关源文件

本文档介绍了在 Keras 3 中创建和构建模型的主要方法。Keras 提供了两种主要的模型构建 API:Sequential API,用于简单、线性的层堆栈,以及 Functional API,用于创建具有多个输入、输出和分支路径的更复杂的模型架构。

有关模型构建后的训练和评估信息,请参阅训练和评估

模型构建方法概述

Keras 3 提供了两种主要的模型构建方法

  1. Sequential API: 用于将模型创建为简单的层堆栈,其中每个层都只有一个输入张量和一个输出张量。

  2. Functional API: 用于构建复杂的模型架构,其中层可以以非顺序方式相互连接,包括多个输入、多个输出、共享层和分支路径。

这两种方法都会生成Model类的实例,它提供了训练、评估和推理的通用功能。

来源

Sequential API

Sequential API 是在 Keras 中构建模型最简单的方法。它非常适合堆叠层,其中每个层都只有一个输入和一个输出。

主要特点

  • 层按顺序添加,形成线性堆栈
  • 每个层都会自动使用前一个层的输出作为其输入
  • 仅适用于具有单个输入和单个输出的模型
  • 不支持共享层或多个输入/输出分支

创建 Sequential 模型

创建 Sequential 模型主要有两种方法

  1. 带层列表的构造函数:
  1. 增量构建:

输入形状规范

Sequential 模型需要知道输入形状才能正确构建。您可以通过以下几种方式指定它

  1. Input层作为第一层添加
  2. 在第一层中使用input_shape参数
  3. 在模型上显式调用build(input_shape)
  4. 模型将在首次接收输入数据时自动构建

来源

幕后原理

当 Sequential 模型被构建时,它会在内部创建一个 Functional 模型。这发生于

  • 当 Input 层作为第一层添加时
  • 当第一层指定了input_shape
  • 当显式调用build()
  • 在首次使用输入数据调用模型时

模型也可以不创建 Functional 模型而直接构建,在这种情况下,它将按顺序直接将每个层应用于输入。

来源

Functional API

Functional API 提供了一种更灵活的模型构建方式,它通过基于输入和输出张量而不是线性层序列来定义模型。

主要特点

  • 模型通过指定其输入和输出来定义
  • 支持具有多个输入和输出的模型
  • 允许使用共享层和分支路径的复杂拓扑
  • 支持使用其他模型的中间张量创建模型

创建 Functional 模型

创建 Functional 模型的典型工作流程包括

  1. 使用Input()定义输入张量
  2. 应用层创建中间张量
  3. 指定输出张量
  4. 使用输入和输出创建模型

来源

输入和输出规范

Functional API 支持多种方式指定输入和输出

输入格式

  • 单个输入:model = Model(inputs=input_tensor, outputs=output_tensor)
  • 输入列表:model = Model(inputs=[input_a, input_b], outputs=output_tensor)
  • 输入字典:model = Model(inputs={"name1": input_a, "name2": input_b}, outputs=output_tensor)

输出格式

  • 单个输出:model = Model(inputs=input_tensor, outputs=output_tensor)
  • 输出列表:model = Model(inputs=input_tensor, outputs=[output_a, output_b])
  • 输出字典:model = Model(inputs=input_tensor, outputs={"name1": output_a, "name2": output_b})

来源

模型执行流程

当 Functional 模型被调用时,它会

  1. 标准化输入以匹配预期格式
  2. 通过计算图运行输入
  3. 以模型创建时指定的相同结构返回输出

来源

多输入和多输出模型

Functional API 的主要优点之一是它能够处理具有多个输入和输出的模型。

多输入模型

多输出模型

来源

字典式输入和输出

当使用字典作为输入或输出时,您可以在调用时通过键访问输入,并以字典形式接收输出

这种方法在处理结构化数据或需要按名称标识输入和输出时特别有用。

来源

高级模型构建

从中间层创建模型

Functional API 允许您从现有模型的中间层创建新模型

这对于以下情况很有用

  • 创建特征提取器
  • 迁移学习
  • 构建复杂模型架构

来源

嵌套结构和子模型

Keras 支持深度嵌套的输入和输出结构,允许复杂的模型架构

您还可以将一个模型作为子模型包含在另一个模型中

来源

模型输入处理

输入规范

Sequential 模型和 Functional 模型都可以通过Input层或input_shape参数来指定其输入要求。Input层有几个重要的参数

  • shape:输入数据的形状(不含批次维度)
  • batch_size:可选的固定批次大小
  • dtype:输入的数据类型
  • name:输入层的名称
  • sparse:输入是否稀疏
  • optional:输入是否可选(可以为 None)

来源

输入验证和预处理

当模型被调用时,其输入会以多种方式进行验证和预处理

  1. 结构匹配:确保输入结构与模型预期相符
  2. 类型转换:将输入转换为预期数据类型的张量
  3. 秩调整:通过挤压或扩展维度处理轻微的秩不匹配

来源

模型构建 API 之间的转换

从 Sequential 到 Functional

每个已构建的 Sequential 模型都会在内部创建一个 Functional 模型表示,可以通过model._functional访问。

来源

具有 Sequential 结构特点的 Functional API

您可以通过线性链式连接层来创建一个行为类似于 Sequential 模型的 Functional 模型

优点是,如果需要,您以后可以为该模型扩展额外的输入或输出。

来源

最佳实践和注意事项

何时使用每种 API

  • 在以下情况下使用 Sequential API::

    • 您的模型是具有单个输入和输出的简单层堆栈
    • 您想要最简单的 API
    • 您不需要共享层或具有多个输入/输出
  • 在以下情况下使用 Functional API::

    • 您需要多个输入或输出
    • 您的模型包含共享层
    • 您的模型具有分支连接
    • 您需要从中间张量创建模型
    • 您想要重用模型的部分

来源

层名称的唯一性

构建模型时,层名称应是唯一的,以避免冲突,尤其是在使用 Sequential API 时

在 Functional API 中,唯一的层名称有助于调试和检查模型。

来源

可选输入

Keras 在 Functional API 中支持可选输入

这对于可以有或没有特定输入而运行的模型很有用。

来源

总结

Keras 3 提供了两种强大且互补的模型构建方法

  1. Sequential API:为构建线性堆栈模型提供了一个简单、直观的接口
  2. Functional API:为创建具有多个输入/输出和非顺序连接的复杂模型架构提供了灵活性

两种 API 生成的模型实例在训练、评估和推理方面具有相同的功能,但在模型的构建和结构方式上有所不同。

正确的选择取决于您的模型架构需求

  • 对于具有线性流的简单模型,Sequential API 提供了优雅的简洁性
  • 对于复杂架构或当您需要灵活性时,Functional API 提供了必要的工具