<br />

|---|
| [![](https://www.tensorflow.org/images/GitHub-Mark-32px.png) View source on GitHub](https://github.com/keras-team/keras/tree/v3.15.1/keras/src/layers/core/embedding.py#L20-L792) |

Turns nonnegative integers (indexes) into dense vectors of fixed size.

Inherits From: [`Layer`](https://www.tensorflow.org/api_docs/python/tf/keras/Layer), [`Operation`](https://www.tensorflow.org/api_docs/python/tf/keras/Operation)

    tf.keras.layers.Embedding(
        input_dim,
        output_dim,
        embeddings_initializer='uniform',
        embeddings_regularizer=None,
        embeddings_constraint=None,
        mask_zero=False,
        weights=None,
        lora_rank=None,
        lora_alpha=None,
        quantization_config=None,
        **kwargs
    )

### Used in the notebooks

| Used in the guide | Used in the tutorials |
|---|---|
| - [Migrate \`tf.feature_column\`s to Keras preprocessing layers](https://www.tensorflow.org/guide/migrate/migrating_feature_columns) - [Ragged tensors](https://www.tensorflow.org/guide/ragged_tensor) - [Working with preprocessing layers](https://www.tensorflow.org/guide/keras/preprocessing_layers) | - [Parameter server training with ParameterServerStrategy](https://www.tensorflow.org/tutorials/distribute/parameter_server_training) - [Basic text classification](https://www.tensorflow.org/tutorials/keras/text_classification) - [Load text](https://www.tensorflow.org/tutorials/load_data/text) - [Using side features: feature preprocessing](https://www.tensorflow.org/recommenders/examples/featurization) - [Taking advantage of context features](https://www.tensorflow.org/recommenders/examples/context_features) |

e.g. `[[4], [20]] -> [[0.25, 0.1], [0.6, -0.2]]`

This layer can only be used on nonnegative integer inputs of a fixed range.

#### Example:

    model = keras.Sequential()
    model.add(keras.layers.Embedding(1000, 64))
    # 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)

<br />

<br />

<br />

| ## Args ||
|---|---|
| `input_dim` | Integer. Size of the vocabulary, i.e. maximum integer index + 1. |
| `output_dim` | Integer. Dimension of the dense embedding. |
| `embeddings_initializer` | Initializer for the `embeddings` matrix (see [`keras.initializers`](https://www.tensorflow.org/api_docs/python/tf/keras/initializers)). |
| `embeddings_regularizer` | Regularizer function applied to the `embeddings` matrix (see [`keras.regularizers`](https://www.tensorflow.org/api_docs/python/tf/keras/regularizers)). |
| `embeddings_constraint` | Constraint function applied to the `embeddings` matrix (see [`keras.constraints`](https://www.tensorflow.org/api_docs/python/tf/keras/constraints)). |
| `mask_zero` | Boolean, whether or not the input value 0 is a special "padding" value that should be masked out. This is useful when using recurrent layers which may take variable length input. If this is `True`, then all subsequent layers in the model need to support masking or an exception will be raised. If `mask_zero` is set to `True`, as a consequence, index 0 cannot be used in the vocabulary (`input_dim` should equal size of vocabulary + 1). |
| `weights` | Optional floating-point matrix of size `(input_dim, output_dim)`. The initial embeddings values to use. |
| `lora_rank` | Optional integer. If set, the layer's forward pass will implement LoRA (Low-Rank Adaptation) with the provided rank. LoRA sets the layer's embeddings matrix to non-trainable and replaces it with a delta over the original matrix, obtained via multiplying two lower-rank trainable matrices. This can be useful to reduce the computation cost of fine-tuning large embedding layers. You can also enable LoRA on an existing `Embedding` layer by calling `layer.enable_lora(rank)`. |
| `lora_alpha` | Optional integer. If set, this parameter scales the low-rank adaptation delta (computed as the product of two lower-rank trainable matrices) during the forward pass. The delta is scaled by `lora_alpha / lora_rank`, allowing you to fine-tune the strength of the LoRA adjustment independently of `lora_rank`. |

<br />

<br />

<br />

<br />

| ## Input shape ||
|---|---|
| 2D tensor with shape: `(batch_size, input_length)`. ||

<br />

<br />

<br />

<br />

| ## Output shape ||
|---|---|
| 3D tensor with shape: `(batch_size, input_length, output_dim)`. ||

<br />

<br />

<br />

<br />

| ## Attributes ||
|---|---|
| `embeddings` | <br /> <br /> |
| `input` | Retrieves the input tensor(s) of a symbolic operation. <br /> Only returns the tensor(s) corresponding to the *first time* the operation was called. |
| `output` | Retrieves the output tensor(s) of a layer. <br /> Only returns the tensor(s) corresponding to the *first time* the operation was called. |
| `variable_serialization_spec` | Returns a dict mapping quantization modes to variable names in order. <br /> This spec is used by `save_own_variables` and `load_own_variables` to determine the correct ordering of variables during serialization for each quantization mode. `None` means no quantization. |

<br />

## Methods

### `enable_lora`

[View source](https://github.com/keras-team/keras/tree/v3.15.1/keras/src/layers/core/embedding.py#L214-L259)

    enable_lora(
        rank,
        lora_alpha=None,
        a_initializer='he_uniform',
        b_initializer='zeros'
    )

### `from_config`

[View source](https://github.com/keras-team/keras/tree/v3.15.1/keras/src/layers/core/embedding.py#L369-L377)

    @classmethod
    from_config(
        config
    )

Creates an operation from its config.

This method is the reverse of `get_config`, capable of instantiating the
same operation from the config dictionary.

> [!NOTE]
> **Note:** If you override this method, you might receive a serialized dtype config, which is a `dict`. You can deserialize it as follows:

    if "dtype" in config and isinstance(config["dtype"], dict):
        policy = dtype_policies.deserialize(config["dtype"])

<br />

<br />

<br />

| Args ||
|---|---|
| `config` | A Python dictionary, typically the output of `get_config`. |

<br />

<br />

<br />

<br />

| Returns ||
|---|---|
| An operation instance. ||

<br />