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

EinsumDense 层

[source]

EinsumDense class

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,
    **kwargs
)

使用einsum作为底层计算的层.

该层可以执行任意维度的einsum计算.

参数: equation: 描述要执行的einsum的方程. 该方程必须是形式为ab,bc->ac, ...ab,bc->...acab...,bc->ac...的有效einsum字符串,其中'ab', 'bc'和'ac'可以是任何有效的einsum 轴表达式序列. output_shape: 输出张量的预期形状 (不包括批次维度以及任何由省略号表示的维度).对于任何未知或可以从输入形状推断的维度,可以指定None. activation: 要使用的激活函数.如果不指定任何内容, 则不应用激活 (即,线性激活: a(x) = x). bias_axes: 包含要应用偏置的输出维度(s)的字符串.bias_axes字符串中的每个字符 应对应于equation字符串的输出部分中的一个字符. kernel_initializer: kernel权重矩阵的初始化器. bias_initializer: 偏置向量的初始化器. kernel_regularizer: 应用于kernel权重矩阵的正则化函数. bias_regularizer: 应用于偏置向量的正则化函数. kernel_constraint: 应用于kernel权重矩阵的约束函数. bias_constraint: 应用于偏置向量的约束函数. lora_rank: 可选整数.如果设置,层的前向传递 将实现LoRA(低秩适应) 并提供秩.LoRA将层的kernel 设置为不可训练,并用通过乘以两个较低秩 的可训练矩阵获得的原始kernel的增量替换它 (因式分解发生在最后一个维度上). 这对于减少 大型密集层微调的计算成本很有用. 您还可以通过调用layer.enable_lora(rank)在现有的 EinsumDense层上启用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)