入门 / 关于 Keras 3

关于 Keras 3

Keras 是一个用 Python 编写的深度学习 API,它能够运行在 JAXTensorFlowPyTorch 之上。

Keras 具有以下特点

  • 简洁 – 但并非过于简单。Keras 降低了开发人员的认知负担,让您可以专注于真正重要的问题部分。
  • 灵活 – Keras 遵循渐进式复杂性暴露原则:简单的工作流程应该快速简便,而任意复杂的工作流程则可以通过在现有知识基础上构建的清晰路径来实现
  • 强大 – Keras 提供了工业级的性能和可伸缩性:它被 NASA、YouTube 或 Waymo 等组织使用。

Keras 3 是一个多框架深度学习 API

作为一个多框架 API,Keras 可用于开发与任何框架(JAX、TensorFlow 或 PyTorch)兼容的模块化组件。

这种方法具有以下几个主要优势

  • 始终为您的模型获得最佳性能。在我们的基准测试中,我们发现 JAX 通常能在 GPU、TPU 和 CPU 上提供最佳的训练和推理性能 – 但结果因模型而异,因为非 XLA TensorFlow 在 GPU 上偶尔更快。能够动态选择为您的模型提供最佳性能的后端,而无需更改您的任何代码,这意味着您始终能够以最高可达到的效率进行训练和部署。
  • 最大化模型的可用生态系统广度。任何 Keras 模型都可以实例化为 PyTorch Module,可以导出为 TensorFlow SavedModel,或者可以实例化为无状态的 JAX 函数。这意味着您可以将您的 Keras 模型与 PyTorch 生态系统包、全套 TensorFlow 部署和生产工具以及 JAX 大规模 TPU 训练基础设施结合使用。使用 Keras API 编写一个 model.py 文件,即可获得机器学习世界所能提供的一切。
  • 最大化您的开源模型发布的传播范围。想要发布一个预训练模型?希望尽可能多的人能够使用它?如果您用纯 TensorFlow 或 PyTorch 实现它,那么大约一半的市场可以使用。如果您用 Keras 实现它,无论他们选择哪个框架(即使他们不是 Keras 用户),任何人都可以立即使用。影响翻倍,而无需额外的开发成本。
  • 使用来自任何来源的数据流水线。Keras 的 fit()/evaluate()/predict() 例程与 tf.data.Dataset 对象、PyTorch DataLoader 对象、NumPy 数组、Pandas 数据框兼容 – 无论您使用什么后端。您可以使用 PyTorch DataLoader 训练 Keras + TensorFlow 模型,或者使用 tf.data.Dataset 训练 Keras + PyTorch 模型。

初识 Keras

Keras 的核心数据结构是模型。最简单的模型类型是 Sequential 模型,它是一个线性堆叠的层。对于更复杂的架构,您应该使用 Keras 函数式 API,它允许构建任意层图,或者 通过子类化完全从头开始编写模型

以下是 Sequential 模型

import keras

model = keras.Sequential()

堆叠层就像调用 .add() 一样简单

from keras import layers

model.add(layers.Dense(units=64, activation='relu'))
model.add(layers.Dense(units=10, activation='softmax'))

一旦您的模型结构确定,使用 .compile() 配置其学习过程

model.compile(loss='categorical_crossentropy',
              optimizer='sgd',
              metrics=['accuracy'])

如果需要,您可以进一步配置您的优化器。Keras 的理念是保持简单事物的简洁性,同时在用户需要时允许他们完全掌控(最终的控制是通过子类化轻松扩展源代码)。

model.compile(loss=keras.losses.categorical_crossentropy,
              optimizer=keras.optimizers.SGD(learning_rate=0.01, momentum=0.9, nesterov=True))

现在,您可以按批次对训练数据进行迭代

# x_train and y_train are Numpy arrays
model.fit(x_train, y_train, epochs=5, batch_size=32)

在一行代码中评估测试损失和指标

loss_and_metrics = model.evaluate(x_test, y_test, batch_size=128)

或者对新数据生成预测

classes = model.predict(x_test, batch_size=128)

您刚才看到的是使用 Keras 的最基本方式。

然而,Keras 也是一个高度灵活的框架,适合迭代最先进的研究思想。Keras 遵循渐进式复杂性暴露原则:它使得入门变得容易,同时又使得处理任意高级用例成为可能,每一步只需要增量学习。

就像您只需几行代码就能训练和评估一个简单的神经网络一样,您也可以使用 Keras 快速开发新的训练过程或最先进的模型架构。

这里是一个自定义 Keras 层的示例 – 可以在 JAX、TensorFlow 或 PyTorch 的低级工作流程中互换使用

import keras
from keras import ops

class TokenAndPositionEmbedding(keras.Layer):
    def __init__(self, max_length, vocab_size, embed_dim):
        super().__init__()
        self.token_embed = self.add_weight(
            shape=(vocab_size, embed_dim),
            initializer="random_uniform",
            trainable=True,
        )
        self.position_embed = self.add_weight(
            shape=(max_length, embed_dim),
            initializer="random_uniform",
            trainable=True,
        )

    def call(self, token_ids):
        # Embed positions
        length = token_ids.shape[-1]
        positions = ops.arange(0, length, dtype="int32")
        positions_vectors = ops.take(self.position_embed, positions, axis=0)
        # Embed tokens
        token_ids = ops.cast(token_ids, dtype="int32")
        token_vectors = ops.take(self.token_embed, token_ids, axis=0)
        # Sum both
        embed = token_vectors + positions_vectors
        # Normalize embeddings
        power_sum = ops.sum(ops.square(embed), axis=-1, keepdims=True)
        return embed / ops.sqrt(ops.maximum(power_sum, 1e-7))

有关 Keras 的更深入教程,您可以查阅


支持

您可以在 Keras Google 群组上提问并参与开发讨论。

您也可以(仅)在 GitHub issues 中提交错误报告和功能请求。请务必先阅读我们的指南


为什么取名 Keras?

Keras (κέρας) 在古希腊语中意为“角”。这个名字典故出自古希腊和拉丁文学中的一个文学形象,最早见于《奥德赛》,其中梦境之灵(Oneiroi,单数 Oneiros)被分为两类:一类通过象牙门来到人间,用虚假的幻象欺骗做梦者;另一类通过角门来到人间,预告未来会实现的事件。这是对 κέρας(角)/ κραίνω(实现)以及 ἐλέφας(象牙)/ ἐλεφαίρομαι(欺骗)这两个词的文字游戏。

Keras 最初是作为 ONEIROS (开放式神经电子智能机器人操作系统) 项目研究工作的一部分而开发的。

“梦境之灵难以捉摸——谁能确定它们讲述的是什么故事?并非所有人们所期望的都会实现。有两扇门通向短暂的梦境之灵;一扇由角制成,一扇由象牙制成。穿过锯开的象牙门的梦境之灵是虚假的,它们带来了不会实现的讯息;那些穿过打磨过的角门的,背后蕴含着真相,将为看到它们的人实现。 荷马,《奥德赛》19. 562 ff (Shewring 译本)。