Keras 3 API 文档 / 层 API / 核心层 / EinsumDense 层

EinsumDense 层

[源]

EinsumDense

keras.layers.EinsumDense(
    equation,
    output_shape,
    activation=None,
    bias_axes=None,
    kernel_initializer="glorot_uniform",
    bias_initializer="zeros",
    kernel_regularizer=None,
    bias_regularizer=None,
    kernel_constraint=None,
    bias_constraint=None,
    lora_rank=None,
    lora_alpha=None,
    **kwargs
)

一个使用 einsum 作为底层计算的层。

此层可以执行任意维度的 einsum 计算。

参数

  • equation: 描述要执行的 einsum 计算的方程式。该方程式必须是有效的 einsum 字符串,形式如 ab,bc->ac...ab,bc->...acab...,bc->ac...,其中 'ab'、'bc' 和 'ac' 可以是任何有效的 einsum 轴表达式序列。
  • output_shape: 输出张量的预期形状(不包括批次维度和由省略号表示的任何维度)。对于未知或可以从输入形状推断出的任何维度,您可以指定 None
  • activation: 要使用的激活函数。如果您未指定任何内容,则不应用激活(即,“线性”激活:a(x) = x)。
  • bias_axes: 一个字符串,包含要应用偏置的输出维度。bias_axes 字符串中的每个字符应对应于 equation 字符串输出部分中的一个字符。
  • kernel_initializer: kernel 权重矩阵的初始化器。
  • bias_initializer: 偏置向量的初始化器。
  • kernel_regularizer: 应用于 kernel 权重矩阵的正则化函数。
  • bias_regularizer: 应用于偏置向量的正则化函数。
  • kernel_constraint: 应用于 kernel 权重矩阵的约束函数。
  • bias_constraint: 应用于偏置向量的约束函数。
  • lora_rank: 可选整数。如果设置,层的正向传播将使用提供的 rank 实现 LoRA(低秩适应)。LoRA 将层的 kernel 设置为不可训练,并将其替换为原始 kernel 的 delta,该 delta 通过乘以两个较低秩的可训练矩阵获得(因式分解发生在最后一个维度)。这对于减少微调大型全连接层的计算成本很有用。您也可以通过调用 layer.enable_lora(rank) 在现有的 EinsumDense 层上启用 LoRA。lora_alpha: 可选整数。如果设置,此参数在正向传播期间缩放低秩适应 delta(计算为两个较低秩可训练矩阵的乘积)。delta 通过 lora_alpha / lora_rank 进行缩放,使您能够独立于 lora_rank 微调 LoRA 调整的强度。
  • **kwargs: 基础层关键字参数,例如 namedtype

示例

使用 einsum 的带偏置的全连接层

此示例展示了如何使用 einsum 运算实例化标准的 Keras 全连接层。此示例等效于 keras.layers.Dense(64, use_bias=True)

>>> layer = keras.layers.EinsumDense("ab,bc->ac",
...                                       output_shape=64,
...                                       bias_axes="c")
>>> input_tensor = keras.Input(shape=[32])
>>> output_tensor = layer(input_tensor)
>>> output_tensor.shape
(None, 64)

将全连接层应用于序列

此示例展示了如何实例化一个将相同的全连接运算应用于序列中每个元素的层。这里,output_shape 有两个值(因为输出中有两个非批次维度);output_shape 中的第一个维度是 None,因为序列维度 b 的形状未知。

>>> layer = keras.layers.EinsumDense("abc,cd->abd",
...                                       output_shape=(None, 64),
...                                       bias_axes="d")
>>> input_tensor = keras.Input(shape=[32, 128])
>>> output_tensor = layer(input_tensor)
>>> output_tensor.shape
(None, 32, 64)

使用省略号将全连接层应用于序列

此示例展示了如何实例化一个将相同的全连接运算应用于序列中每个元素的层,但使用省略号记法而不是指定批次和序列维度。

因为我们使用了省略号记法并且只指定了一个轴,所以 output_shape 参数是一个单值。以此方式实例化时,该层可以处理任意数量的序列维度 - 包括不存在序列维度的情况。

>>> layer = keras.layers.EinsumDense("...x,xy->...y",
...                                       output_shape=64,
...                                       bias_axes="y")
>>> input_tensor = keras.Input(shape=[32, 128])
>>> output_tensor = layer(input_tensor)
>>> output_tensor.shape
(None, 32, 64)