Source code for teras._src.layers.categorical_embedding
import keras
from keras import ops
from teras._src.api_export import teras_export
[docs]
@teras_export("teras.layers.CategoricalEmbedding")
class CategoricalEmbedding(keras.layers.Layer):
"""
Categorical Embedding layer that create trainable embeddings for
categorical features values.
Args:
embedding_dim: int, dimensionality of the embeddings
cardinalities: list or ndarray, a list or 1d-array of
cardinalities of all the features in the dataset in the
same order as the features' occurrence.
For numerical features, use 0 as indicator at
the corresponding index of the array.
You can use the `compute_cardinalities` function from
`teras.utils` package for this purpose.
"""
[docs]
def __init__(self,
embedding_dim: int,
cardinalities: list,
**kwargs):
super().__init__(**kwargs)
self.embedding_dim = embedding_dim
self.cardinalities = cardinalities
self.embedding_layers = []
self._categorical_idx = []
for idx, card in enumerate(self.cardinalities):
if card > 0:
embedding = keras.layers.Embedding(
input_dim=card + 1,
output_dim=self.embedding_dim)
self.embedding_layers.append(embedding)
self._categorical_idx.append(idx)
def call(self, inputs):
idx = self._categorical_idx[0]
feature = ops.expand_dims(inputs[:, idx], axis=1)
categorical_embeddings = self.embedding_layers[0](feature)
for feature_idx, embedding_layer in zip(self._categorical_idx[1:],
self.embedding_layers[1:]):
feature = ops.expand_dims(inputs[:, feature_idx], axis=1)
f_e = embedding_layer(feature)
# Concatenate feature embeddings along the feature axis
categorical_embeddings = ops.concatenate(
xs=[categorical_embeddings, f_e], axis=1)
return categorical_embeddings
def compute_output_shape(self, input_shape):
return input_shape[:-1] + (len(self._categorical_idx),
self.embedding_dim,)
def get_config(self):
config = super().get_config()
config.update({
"embedding_dim": self.embedding_dim,
"cardinalities": self.cardinalities
})