我想知道我们如何将分类变量作为 keras 中嵌入层的输入并训练该嵌入层?

I want to know how can we give a categorical variable as an input to an embedding layer in keras and train that embedding layer?

假设我们有一个数据框,其中有一个分类列,其中包含 7 个类别 - 星期一、星期二、星期三、星期四、星期五、星期六和星期日。假设我们有 100 个数据点,我们想将分类数据作为嵌入层的输入,并使用 Keras 训练嵌入层。我们如何真正实现它?您可以通过代码示例分享一些直觉吗?

我试过这段代码,但它给了我一个错误,说 "ValueError: "input_length" 是 1,但收到的输入有形状 (None, 26)"。我已经参考了这个博客 https://medium.com/@satnalikamayank12/on-learning-embeddings-for-categorical-data-using-keras-165ff2773fc9,但我不知道如何在我的特定情况下使用它。

from sklearn.preprocessing import LabelEncoder
l_encoder=LabelEncoder()
l_encoder.fit(X_train["Weekdays"])

encoded_weekdays_train=l_encoder.transform(X_train["Weekdays"])
encoded_weekdays_test=l_encoder.transform(X_test["Weekdays"])

no_of_unique_cat=len(X_train.school_state.unique())
embedding_size = min(np.ceil((no_of_unique_cat)/2),50)
embedding_size = int(embedding_size)
vocab  = no_of_unique_cat+1

#Get the flattened LSTM output for categorical text
input_layer2 = Input(shape=(embedding_size,))
embedding = Embedding(input_dim=vocab, output_dim=embedding_size, input_length=1, trainable=True)(input_layer2)
flatten_school_state = Flatten()(embedding)

我想知道如果有7个类别,input_layer2的形状是什么? vocab 大小、输出 dim 和 input_length 应该是多少?谁能解释或更正我的代码?您的见解将非常有帮助。

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-46-e28d41acae85> in <module>
      1 #Get the flattened LSTM output for input text
      2 input_layer2 = Input(shape=(embedding_size,))
----> 3 embedding = Embedding(input_dim=vocab, output_dim=embedding_size, input_length=1, trainable=True)(input_layer2)
      4 flatten_school_state = Flatten()(embedding)

~/anaconda3/lib/python3.7/site-packages/keras/engine/base_layer.py in __call__(self, inputs, **kwargs)
    472             if all([s is not None
    473                     for s in to_list(input_shape)]):
--> 474                 output_shape = self.compute_output_shape(input_shape)
    475             else:
    476                 if isinstance(input_shape, list):

~/anaconda3/lib/python3.7/site-packages/keras/layers/embeddings.py in compute_output_shape(self, input_shape)
    131                         raise ValueError(
    132                             '"input_length" is %s, but received input has shape %s' %
--> 133                             (str(self.input_length), str(input_shape)))
    134                     elif s1 is None:
    135                         in_lens[i] = s2

ValueError: "input_length" is 1, but received input has shape (None, 26)


embedding_size 永远不能是输入大小。

Keras 嵌入采用 "integers" 作为输入。您的数据应该是 0 到 6 之间的数字。

如果您的 100 个数据点形成了几天的序列,则不能将嵌入中的序列长度限制为 1。

您输入的形状应该是 (length_of_sequence,)。这意味着您的训练数据应该具有 (any, length_of_sequence) 的形状。根据您的描述,这可能是 (1, 100)

其余的都是自动的。