Keras 2 API 文档 / 层 API / 核心层 / 嵌入层

嵌入层

[源代码]

Embedding

tf_keras.layers.Embedding(
    input_dim,
    output_dim,
    embeddings_initializer="uniform",
    embeddings_regularizer=None,
    activity_regularizer=None,
    embeddings_constraint=None,
    mask_zero=False,
    input_length=None,
    sparse=False,
    **kwargs
)

将正整数(索引)转换为固定大小的密集向量。

例如:[[4], [20]] -> [[0.25, 0.1], [0.6, -0.2]]

此层只能用于固定范围内的正整数输入。 tf.keras.layers.TextVectorizationtf.keras.layers.StringLookuptf.keras.layers.IntegerLookup 预处理层可以帮助准备 Embedding 层的输入。

此层接受 tf.Tensortf.RaggedTensortf.SparseTensor 输入。

示例

>>> model = tf.keras.Sequential()
>>> model.add(tf.keras.layers.Embedding(1000, 64, input_length=10))
>>> # The model will take as input an integer matrix of size (batch,
>>> # input_length), and the largest integer (i.e. word index) in the input
>>> # should be no larger than 999 (vocabulary size).
>>> # Now model.output_shape is (None, 10, 64), where `None` is the batch
>>> # dimension.
>>> input_array = np.random.randint(1000, size=(32, 10))
>>> model.compile('rmsprop', 'mse')
>>> output_array = model.predict(input_array)
>>> print(output_array.shape)
(32, 10, 64)

参数

  • input_dim: 整数。词汇表的大小,即最大整数索引 + 1。
  • output_dim: 整数。密集嵌入的维度。
  • embeddings_initializer: embeddings 矩阵的初始化器(参见 keras.initializers)。
  • embeddings_regularizer: 应用于 embeddings 矩阵的正则化函数(参见 keras.regularizers)。
  • embeddings_constraint: 应用于 embeddings 矩阵的约束函数(参见 keras.constraints)。
  • mask_zero: 布尔值,输入值 0 是否是应该屏蔽掉的特殊“填充”值。这在使用可能接收可变长度输入的循环层时很有用。如果为 True,则模型中所有后续层都需要支持屏蔽,否则将引发异常。如果将 mask_zero 设置为 True,则作为结果,索引 0 不能在词汇表中使用(input_dim 应等于词汇表大小 + 1)。
  • input_length: 输入序列的长度,当它为常数时。如果您要将 Flatten 然后 Dense 层连接到上游,则需要此参数(没有它,则无法计算密集输出的形状)。
  • sparse: 如果为 True,则调用此层将返回 tf.SparseTensor。如果为 False,则该层返回密集的 tf.Tensor。对于稀疏张量中没有特征的条目(值为 0 的条目),默认情况下返回索引 0 的嵌入向量。

输入形状

形状为 (batch_size, input_length) 的二维张量。

输出形状

形状为 (batch_size, input_length, output_dim) 的三维张量。

关于变量放置的说明:默认情况下,如果可用 GPU,则嵌入矩阵将放置在 GPU 上。这可以获得最佳性能,但可能会导致问题

  • 您可能正在使用不支持稀疏 GPU 内核的优化器。在这种情况下,您将在训练模型时看到错误。
  • 您的嵌入矩阵可能太大,无法放入 GPU。在这种情况下,您将看到内存不足 (OOM) 错误。

在这种情况下,您应该将嵌入矩阵放置在 CPU 内存中。您可以使用设备范围来做到这一点,如下所示

with tf.device('cpu:0'):
  embedding_layer = Embedding(...)
  embedding_layer.build()

然后,预构建的 embedding_layer 实例可以添加到 Sequential 模型中(例如 model.add(embedding_layer)),在函数式模型中调用(例如 x = embedding_layer(x)),或用于子类模型中。