Keras 后端

2025 年 3 月 17 日 | 阅读 26 分钟

Keras 是一个模型级库,提供高级构建块,可用于开发深度学习模型。它不直接支持张量乘积、卷积等低级操作,而是依赖于专门优化张量操作的后端引擎。它不会只选择一个张量库来实现 Keras 并将其绑定到该特定库。它通过无缝地将许多不同的后端引擎插入 Keras 来模块化地处理这种情况。

以下是三种可用的后端实现:

  • TensorFlow: 这是由 Google 开发的用于符号张量操作的开源框架。
  • Theano: 这也是一个由蒙特利尔大学 LISA 实验室开发的用于符号张量操作的开源框架。
  • CNTK: 它是由 Microsoft 开发的,也是一个开源的深度学习工具包。

从一个后端切换到另一个后端

你可能会在以下位置找到 Keras 配置文件:

$HOME/.keras/keras.json

如果你在那里找不到它,那么你可以创建一个!

注意:特别是对于 Windows 用户,你必须将 $HOME 替换为 %USERPROFILE%。

以下是默认配置:

在这里,你只需将 backend 字段更改为 "theano""tensorflow""cntk",然后当你运行任何 Keras 代码时,Keras 将使用修改后的配置。

一旦你定义了 KERAS_BACKEND 环境变量,它将覆盖你的配置文件中定义的所有内容。

你可以在 Keras 中加载比 "tensorflow""theano""cntk" 更多的后端,因为它很容易使用外部后端。这可以通过更改 keras.json"backend" 设置来完成。假设你有一个名为 my_modulePython 模块作为外部后端使用;那么,在这种情况下,keras.json 文件可能会发生一些变化,如下所示:

为了使用外部后端,它必须经过验证并包含像 placeholdervariablefunction 这样的函数。

如果外部后端无效,则可能会生成包含所有缺失条目的错误。

keras.json 详细信息

以下是 keras.json 文件中包含的设置:

可以通过编辑 $HOME/.keras/keras.json 来简单修改设置。

  • image_data_format: 它可以定义为字符串,可以是 "channels_last" 或 "channels_first",指定 Keras 遵循的数据格式约定。(它由 backend.image_data_format() 返回)。
  • 对于任何二维数据(例如图像),"channels_last" 将假定 (行, 列, 通道),而 "channels_first" 将假定 (通道, 行, 列)
  • 对于任何三维数据,"channels_last" 将对应于 (conv_dim1, conv_dim2, conv_dim3, 通道),而 "channels_first" 将对应于 (通道, conv_dim1, conv_dim2, conv_dim3)
  • epsilon: 它指的是一个浮点数,这是一个模糊的数字常数,用于避免某些操作中的除以零。
  • floatx: 它表示字符串 "float16""float32""float64"。默认情况下,它是浮点精度。
  • backend: 它指的是字符串 "tensorflow"、"theano" 或 "cntk"。

使用抽象 Keras 后端编写新代码

借助抽象 Keras 后端 API,你可以使你编写的 Keras 模块与 Theano (th) 和 TensorFlow (tf) 兼容。以下是对此的介绍:

后端模块可以通过以下方式导入:

以下代码将实例化一个输入占位符,它等同于 tf.placeholder()th.tensor.matrix(), th.tensor.tensor3() 等。

通过合并以下代码将实例化一个变量,它反过来等同于 tf.Variable()th.shared()

你可能需要的大多数张量操作将以与你在 TensorFlow 或 Theano 中相同的方式执行,如下所示:

后端函数

backend

backend 函数用于返回当前后端名称。

返回值

它返回一个与正在使用的后端当前名称相关的字符串。

示例

symbolic

它可以定义为一个装饰器,在 TensorFlow 2.0 中用于进入 Keras 图。

参数

  • func: 它指的是用于装饰的函数。

返回值

它返回一个装饰函数。

eager

它可以定义为一个装饰器,在 TensorFlow 2.0 中用于退出 Keras 图。

参数

  • func: 它指的是用于装饰的函数。

返回值

它返回一个装饰函数。

get_uid

它提供了一个唯一的 UID,给出字符串前缀。

参数

  • prefix: 它指的是一个字符串。

返回值

此后端函数返回一个整数。

示例

此函数用于设置手动变量初始化标志。该标志是一个布尔值,用于控制变量是否初始化,或者用户必须处理初始化,因为它们默认是自实例化的。

参数

  • value: 它指的是 Python 的布尔值。

epsilon

它用于返回数值表达式中使用的模糊因子值。

返回值

它返回一个浮点数。

示例

reset_uids

它用于重置图标识符。

epsilon

它输出数值表达式中使用的模糊因子值。

返回值

它返回一个浮点值。

示例

set_epsilon

它用于设置数值表达式中使用的模糊因子值。

参数

e: 它可以定义为一个浮点值,表示 epsilon 的新值。

示例

floatx

它用于输出浮点类型字符串,例如 'float16'、'float32'、'float64'。

返回值

它返回当前默认浮点类型字符串。

示例

set_floatx

它用于设置默认浮点类型值。

参数

  • floatx: 它指的是浮点类型字符串,例如 'float16'、'float32' 或 'float64'。

示例

引发

  • ValueError: 每当出现无效值时,将生成 ValueError。

cast_to_floatx

它用于将 Numpy 数组转换为默认的 Keras 浮点类型。

参数

  • x: 它指的是 Numpy 数组。

返回值

它返回被转换为新类型的相同 Numpy 数组。

示例

image_data_format

它用于返回默认图像数据格式约定。

返回值

它返回字符串 'channels_first' 或 'channels_last'

示例

set_image_data_format

此函数用于设置数据格式约定值。

参数

  • data_format: 它可以定义为字符串,可以是 'channels_first' 或 'channels_last'。

示例

引发

  • ValueError: 每当 data_format 值无效时,它将生成 ValueError。

learning_phase

它输出学习阶段的标志,它指的是布尔张量(0 = 测试,1 = 训练),作为输入传递给任何 Keras 函数,该函数在训练和测试时使用不同的行为。

返回值

它返回学习阶段的标量整数张量或 Python 整数。

set_learning_phase

它用于将固定值设置为学习阶段。

参数

  • value: 它可以定义为表示学习阶段值(0 或 1)的整数。

引发

  • ValueError: 如果值既不是 0 也不是 1,则会引发此错误。

clear_session

它用于重置 Keras 生成的每个状态。用于实现函数式模型构建 API 以及使自动生成的层名唯一的全局状态由 Keras 处理。

当在循环中构建多个模型时,全局状态将在一定时间段内消耗越来越多的内存,你希望清除它。

它用于销毁当前的 Keras 图并创建一个新的图。它非常有用,因为它避免了旧模型/层的混乱。

示例 1:在循环中创建模型时调用 clear_session()。

示例 2:重置层名生成计数器。

is_sparse

它用于返回张量是否是稀疏张量。

参数

  • tensor: 它指的是张量实例。

返回值

它返回一个布尔值。

示例

to_dense

它用于将稀疏张量转换为密集张量并返回它。

参数

  • tensor: 它指的是张量实例(可能是稀疏的)。

返回值

它返回一个密集张量。

示例

variable (变量)

它有助于实例化变量并返回它。

参数

  • value: 它可以定义为表示张量初始值的 numpy 数组。
  • dtype: 它指的是张量的类型。
  • name: 对于张量,它表示字符串名称。
  • constraint: 它指的是一个可选的投影函数,在更新优化器后在变量上实现。

返回值

它返回包含 Keras 元数据的变量实例。

示例

is_variable

常数

它导致创建唯一的张量。

参数

  • value: 它指的是常量值或列表。
  • dtype: 它指的是张量的类型。
  • name: 对于张量,它表示字符串名称。
  • shape: 它可以定义为结果张量的维度,它是可选的。

返回值

它还返回一个唯一的张量。

is_keras_tensor

它输出 x 是否是 Keras 张量。 "Keras 张量" 是由 Keras 层 (Layer 类) 或 Input 返回的张量。

参数

  • x: 它指的是候选张量。

返回值

它返回一个布尔值,表示参数是否是 Keras 张量。

引发

如果 x 不是符号张量,则会引发 ValueError。

示例

is_tensor

placeholder

它有助于实例化占位符张量并返回它。

参数

  • shape: 它可以定义为整数元组,其中可能包含 None 条目,有助于表示占位符的形状。
  • ndim: 它指的是张量轴的数量,它指定 {shape, ndim} 中至少一个。如果两者都指定,则使用 shape
  • dtype: 它定义占位符的类型。
  • sparse: 它可以定义为布尔值,表示占位符是否具有稀疏类型。
  • name: 它是一个可选参数,定义占位符名称的字符串。

返回值

它返回包含 Keras 元数据的张量实例。

示例

is_placeholder

它返回 x 是否是占位符。

参数

  • x: 它可以定义为候选占位符。

返回值

它返回一个布尔值。

shape

它输出张量或变量的符号形状。

参数

  • x: 它指的是张量或变量。

返回值

它返回符号形状的张量。

示例

int_shape

它可以定义为整数元组或 None 条目,输出张量或变量的形状。

参数

  • x: 它指的是张量或变量。

返回值

它返回整数元组或 None 条目。

示例

Numpy 实现

ndim

它指的是一个整数,作为张量中的轴数返回。

参数

  • x: 它可以定义为张量或变量。

返回值

它输出轴的数量作为整数值。

示例

Numpy 实现

大小

它输出张量大小。

参数

  • x: 它可以定义为张量或变量。
  • name: 它是一个可选的关键字参数,表示操作的名称。

返回值

它返回张量的大小。

示例

dtype

它可以定义为字符串,作为 Keras 张量或变量的数据类型返回。

参数

  • x: 它可以定义为张量或变量。

返回值

对于 x,它返回其数据类型。

示例

Numpy 实现

eval

它有助于评估张量值。

参数

  • x: 它可以定义为张量。

返回值

它输出一个 Numpy 数组。

示例

Numpy 实现

zeros

它有助于实例化所有零的变量,然后返回它。

参数

  • shape: 它可以定义为整数元组,表示返回的 Keras 变量的形状。
  • dtype: 它指的是与返回的 Keras 变量数据类型对应的字符串。
  • name: 它指的是表示返回的 Keras 变量名称的字符串。

返回值

它返回一个包含 Keras 元数据的变量,该变量填充为 0.0。需要注意的是,如果它是符号 n 形状,则不能返回变量,而是返回动态形状的张量。

示例

Numpy 实现

ones

它有助于实例化一个全为一的变量,然后返回它。

参数

  • shape: 它可以定义为整数元组,表示返回的 Keras 变量的形状。
  • dtype: 它指的是与返回的 Keras 变量数据类型对应的字符串。
  • name: 它指的是表示返回的 Keras 变量名称的字符串。

返回值

它返回一个 Keras 变量,填充为 0.0。需要注意的是,如果它是符号 n 形状,则不能返回变量,而是返回动态形状的张量。

示例

Numpy 实现

eye

它有助于实例化一个单位矩阵,然后返回它。

参数

  • size: 它可以定义为定义行数和列数的元组,或者表示行数的整数。
  • dtype: 它指的是与返回的 Keras 变量数据类型对应的字符串。
  • name: 它指的是表示返回的 Keras 变量名称的字符串。

返回值

它输出表示单位矩阵的 Keras 变量。

示例

Numpy 实现

zeros_like

它有助于实例化与另一个张量具有相同形状的全部为零的变量。

参数

  • x: 它可以定义为 Keras 变量或 Keras 张量。
  • dtype: 它指的是与返回的 Keras 变量数据类型对应的字符串。此处 None 表示使用 x 数据类型。
  • name: 它指的是表示返回的 Keras 变量名称的字符串。

返回值

它返回一个 Keras 变量,填充为所有零,构成 x 的形状。

示例

Numpy 实现

ones_like

它有助于实例化与另一个张量具有相同形状的全部为一的变量。

参数

  • x: 它可以定义为 Keras 变量或 Keras 张量。
  • dtype: 它指的是与返回的 Keras 变量数据类型对应的字符串。此处 None 表示使用 x 数据类型。
  • name: 它指的是表示返回的 Keras 变量名称的字符串。

返回值

它返回一个 Keras 变量,填充为所有零,构成 x 的形状。

示例

Numpy 实现

identity (标识)

它输出一个张量,其内容与输入张量相同。

参数

  • x: 它指的是输入张量。
  • name: 它指的是表示要创建的变量名称的字符串。

返回值

它返回一个具有相同形状、类型和内容的张量。

random_uniform_variable

它强调实例化一个变量,其值从均匀分布中抽取。

参数

  • shape: 它可以定义为整数元组,表示返回的 Keras 变量的形状。
  • low: 它表示一个浮点值,表示输出区间的下边界。
  • high: 它指的是一个浮点值,表示输出区间的上边界。
  • dtype: 它指的是与返回的 Keras 变量数据类型对应的字符串。
  • name: 它可以定义为与返回的 Keras 变量名称相关的字符串。
  • seed: 它可以定义为表示随机种子的整数。

返回值

它输出一个 Keras 变量,该变量已填充了抽取样本。

示例

Numpy 实现

random_normal_variable

它有助于实例化一个变量,其值从正态分布中抽取。

参数

  • shape: 它可以定义为整数元组,表示返回的 Keras 变量的形状
  • mean: 它指的是一个浮点数,表示正态分布的均值。
  • scale: 它指的是一个浮点数,表示正态分布的标准差。
  • dtype: 它可以定义为字符串,表示返回的 Keras 变量的数据类型。
  • name: 它指的是表示返回的 Keras 变量名称的字符串。
  • seed: 它指的是表示随机种子的整数。

返回值

它输出一个 Keras 变量,该变量已填充了抽取样本。

示例

Numpy 实现

count_params

它输出 Keras 变量或张量中存在的常量组件数量。

参数

  • x: 它指的是 Keras 变量或张量。

返回值

它产生一个整数,表示 x 中存在的元素总数,即数组静态维度的乘积。

示例

Numpy 实现

cast

它有助于将张量转换为不同的数据类型,然后返回它。如果,如果你转换 Keras 变量,它也将产生 Keras 张量。

参数

  • x: 它可以定义为 Keras 张量或变量。
  • dtype: 它指的是字符串 'float16'、'float32' 或 'float64'。

返回值

它输出一个数据类型为 dtype 的 Keras 张量。

示例

update(更新)

它有助于将 x 的值更新为 new_x

参数

  • x: 它指的是一个 变量
  • new_x: 它可以定义为与 x 具有相似形状的张量。

返回值

它产生更新后的 x 变量。

update_add

它添加一个 增量,有助于更新 x 的值。

参数

  • x: 它指的是一个 变量
  • increment: 它可以定义为与 x 具有相似形状的张量。

返回值

它返回更新后的 x 变量。

update_sub

它减去递减量以更新 x 的值。

参数

  • x: 它可以定义为变量。
  • decrement: 它指的是与 x 具有相似形状的张量。

返回值

它返回更新后的 x 变量。

moving_average_update

对于变量,它计算其移动平均值。

参数

  • x: 它指的是一个变量。
  • value: 它可以定义为与 x 具有相同形状的张量。
  • momentum: 它指的是静态平均动量。

返回值

它输出用于更新变量的操作。

dot

它通过乘以 2 个张量或变量来返回一个张量。

在将 nD 张量乘以另一个 nD 张量时,会重现 Theano 行为。(例如 (2, 3) * (4, 3, 5) -> (2, 4, 5))

参数

  • x: 它指的是张量或变量。
  • y: 它指的是张量或变量。

返回值

它返回在 x 和 y 之间进行点积后生成的张量。

示例

Numpy 实现

batch_dot

batch_dot 有助于计算 xy 之间的批处理点积,其中 x 和 y 是批处理中的数据(即形状为 (batch_size, :))。它输出一个维度少于输入的张量或变量。如果我们将维度数量减少到 1,那么我们可以使用 expand_dims,它确保 ndim 至少为 2。

参数

  • x: 它指的是 Keras 张量或变量,其 ndim 大于或等于 2。
  • y: 它指的是 Keras 张量或变量,其 ndim 大于或等于 2。
  • axes: 它可以定义为 int 或 tuple(int, int),它强调要减少的目标维度。

返回值

它返回一个张量,其形状与 x 的形状和 y 的形状的拼接相同 ()。这里 x 的形状与求和的维度较少,y 表示批处理维度和求和的维度较少。但是,如果最终秩为 1,则将其重塑为 (batch_size, 1)

示例

假设 x = [[1, 2], [3, 4]] 和 y = [[5, 6], [7, 8]] batch_dot(x, y, axes=1) = [[17], [53]],这是 x.dot(y.T) 的主对角线,尽管我们从不需要计算非对角线元素。

伪代码

形状推断:设 x 的形状为 (100, 20),y 的形状为 (100, 30, 20)。如果 axes 为 (1, 2),为了找到结果张量的输出形状,遍历 x 的形状和 y 的形状中的每个维度:

  • shape[0] : 100 : 添加到输出形状
  • shape[1] : 20 : 不添加到输出形状,x 的维度 1 已被求和。(dot_axes[0] = 1)
  • shape[0] : 100 : 不添加到输出形状,始终忽略 y 的第一个维度
  • shape[1] : 30 : 添加到输出形状
  • shape[2] : 20 : 不添加到输出形状,y 的维度 2 已被求和。(dot_axes[1] = 2) output_shape = (100, 30)

transpose

它用于转置张量,然后返回它。

参数

  • x: 它可以是张量或变量。

返回值

它返回一个张量。

示例

Numpy 实现

gather

它有助于在张量 reference 中检索索引 indices 元素。

参数

  • reference: 它指的是一个张量。
  • indices: 它可以定义为表示索引张量的整数。

返回值

它输出一个与 reference 类型相同的张量。

Numpy 实现

max

它计算张量的最大值。

参数

  • x: 它可以定义为张量或变量。
  • axis: 它指的是 [-rank(x), rank(x)) 内的整数或整数列表,用于计算最大值的轴。如果设置为 None(默认),则计算所有维度上的最大值。
  • keepdims: 它是一个布尔值,决定是否保留维度。如果 keepdims 设置为 False,则张量的秩将减少 1。否则,如果 keepdims 设置为 True,则减少的维度将保留长度为 1。

返回值

它返回一个表示 x 最大值的张量。

Numpy 实现

min

它计算张量中的最小值。

参数

  • x: 它可以定义为张量或变量。
  • axis: 它指的是 [-rank(x), rank(x)) 内的整数或整数列表,用于计算最小值的轴。如果设置为 None(默认),则计算所有维度上的最小值。
  • keepdims: 它是一个布尔值,决定是否保留维度。如果 keepdims 设置为 False,则张量的秩将减少 1。否则,如果 keepdims 设置为 True,则减少的维度将保留长度为 1。

返回值

它返回一个表示 x 最小值的张量。

Numpy 实现

sum

它输出张量中指定轴上的值总和。

参数

  • x: 它可以定义为张量或变量。
  • axis: 它指的是 [-rank(x), rank(x)) 内的整数或整数列表,用于计算和的轴。如果设置为 None(默认),则计算所有维度上的和。
  • keepdims: 它是一个布尔值,决定是否保留维度。如果 keepdims 设置为 False,则张量的秩将减少 1。否则,如果 keepdims 设置为 True,则减少的维度将保留长度为 1。

返回值

它返回一个包含 x 总和的张量。

Numpy 实现

prod

结合特定轴,它计算张量中值的乘积。

参数

  • x: 它可以定义为张量或变量。
  • axis: 它指的是 [-rank(x), rank(x)) 内的整数或整数列表,用于计算乘积的轴。如果设置为 None(默认),则计算所有维度上的总乘积。
  • keepdims: 它是一个布尔值,决定是否保留维度。如果 keepdims 设置为 False,则张量的秩将减少 1。否则,如果 keepdims 设置为 True,则减少的维度将保留长度为 1。

返回值

它返回一个包含 x 中元素乘积的张量。

Numpy 实现

cumsum

结合特定轴,它计算张量中值的累积和。

参数

  • x: 它可以定义为张量或变量。
  • axis: 它指的是一个整数,它是用于计算和的轴。

返回值

它返回一个包含 x 沿 值的累积和的张量。

Numpy 实现

cumprod

结合特定轴,它计算张量中值的累积乘积。

参数

  • x: 它可以定义为张量或变量。
  • axis: 它指的是一个整数,它是用于计算乘积的轴。

返回值

它返回一个包含 x 沿 值的累积乘积的张量。

Numpy 实现

var

结合特定轴,它计算张量的方差。

参数

  • x: 它可以定义为张量或变量。
  • axis: 它指的是 [-rank(x), rank(x)) 内的整数或整数列表,用于计算方差的轴。如果设置为 None(默认),则计算所有维度上的总方差。
  • keepdims: 它是一个布尔值,决定是否保留维度。如果 keepdims 设置为 False,则张量的秩将减少 1。否则,如果 keepdims 设置为 True,则减少的维度将保留长度为 1。

返回值

它返回 x 中元素张量的方差。

Numpy 实现

rnn

它有助于在张量维度上方重复。

参数

  • step_function: 它被称为 RNN 步函数。它包含以下给定参数:
    • input: 它包括一个形状为 (样本, ...) 的张量,表示在特定时间步的批处理样本输入。它不包括时间维度。
    • states: 它可以定义为张量列表。
    • new_states: 它可以定义为张量列表,其形状和长度与状态相同,以便初始状态必须是列表中上一个时间步的输出张量。

返回值

它输出形状为 (样本, output_dim) 的张量。

  • inputs: 它指的是至少三维的时间数据张量,形状为 (样本, 时间, ...),或者嵌套张量,每个张量形状为 (样本, 时间, ...)
  • initial_states: 它可以定义为形状为 (样本, state_size) 的张量,包含要在步函数中使用的状态初始值。当 state_size 具有嵌套形状时,initial_states 也将遵循嵌套结构。
  • go_backwards: 它可以定义为布尔值,如果设置为 True,则将以相反顺序在时间维度上方执行迭代,然后返回反转序列。
  • mask: 它指的是形状为 (样本, 时间, 1) 的二进制张量,包括每个被掩码的零元素。
  • constants: 它可以定义为常量值列表,每个步骤都分发。
  • unroll: 它说明 RNN 应该展开还是使用符号 while 循环。
  • input_length: 它可以定义为整数或一维张量,取决于时间维度是否具有固定长度。如果未指定掩码时设置为可变长度输入,则将用于掩码。
  • time_major: 它可以定义为布尔值。如果设置为 true,则输入和输出的形状将为 (时间步批次, ...),否则如果设置为 false 则为 (批次, 时间步, ...)。使用 time_major = True 是一项相当高效的任务,因为它避免了在 RNN 计算开始和结束时进行转置。但是,大多数情况下,由于 TensorFlow 数据主要存在于批处理中,因此默认情况下,此函数以批处理主要的形式接受输入并发出输出。
  • zero_output_for_mask: 它指的是一个布尔值,如果设置为 true,则被掩码时间步输出将为零,否则将返回上一步输出。

返回值

它返回形状为 (last_output, outputs, new_states) 的元组,其中 last_output 指的是 rnn 最新的输出,形状为 (样本, ...),outputs 指的是形状为 (样本, 时间, ...) 的张量,使得每个条目 outputs[s, t] 对应于样本 s 和时间 t 的步函数输出,而 new_states 可以定义为张量列表,表示最新的状态,这些状态由形状为 (样本, ...) 的步函数返回。

引发

  • ValueError: 如果输入维度小于 3,则会生成 ValueError。
  • ValueError: 如果 unroll 设置为 True,而输入时间步不是静态数字,也可能引发此错误。
  • ValueError: 如果提供了 mask 但未设置为 None 并且未提供状态(即 len(states) ==0),则也会生成此错误。

下一主题Keras 模型