关于 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 训练基础设施一起使用。仅需编写一个 model.py,使用 Keras API,即可访问机器学习世界提供的一切。
  • 最大化开源模型发布的分发。 想发布一个预训练模型吗?希望尽可能多的人能够使用它吗?如果你用纯 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 和 y_train 是 Numpy 数组
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):
        # 嵌入位置
        length = token_ids.shape[-1]
        positions = ops.arange(0, length, dtype="int32")
        positions_vectors = ops.take(self.position_embed, positions, axis=0)
        # 嵌入 tokens
        token_ids = ops.cast(token_ids, dtype="int32")
        token_vectors = ops.take(self.token_embed, token_ids, axis=0)
        # 两者相加
        embed = token_vectors + positions_vectors
        # 归一化嵌入
        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 问题 中发布bug报告和功能请求(仅限)。确保先阅读 我们的指南


为什么这个名字是 Keras?

Keras (κέρας) 在古希腊语中意为 。它是对古希腊和拉丁文学中的一个文学意象的引用,首次出现在《奥德赛》中,梦灵(Oneiroi,单数形式为 Oneiros)被分为那些用虚假幻象欺骗梦者的人,他们通过象牙之门来到地球,以及那些预告未来将会实现的人,他们通过角门来到。它在 κέρας (角) / κραίνω (实现) 和 ἐλέφας (象牙) / ἐλεφαίρομαι (欺骗) 的词语上进行了双关。

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

"Oneiroi 超越我们的理解——谁能确定他们讲述了什么故事?人们所寻求的并非都能实现。通往短暂 Oneiroi 的有两个门;一个是由角制成,一个是由象牙制成。通过锯象牙而来的 Oneiroi 是欺骗性的,带着无法实现的信息;通过抛光的角而来的那些则有真相,必将实现以供看到他们的人。" 荷马,《奥德赛》第19章 562 节 (Shewring 译本)。